<數字IC設計> 實戰專案之GPIO埠設計 3
GPIO之控制器設計
GPIO的控制器設計需要結合GPIO本身邏輯功能共同設計。
根據常識我們知道,晶片不止有一個GPIO口,所以在設計的時候有兩種路線:
- 晶片的每一個GPIO模組均為獨立模組(一次設計,N次例化)。
- 複用設計,設計一個GPIOs模組,模組內部包括多個GPIO埠。
一個普通的晶片一般擁有十餘個GPIO埠,較大的晶片可以用於二十個乃至更多的GPIO埠。那麼如何選擇合適的設計呢?
在這裡我的看法是根據模組本身的應用場景進行設計。一般來說,GPIO這種必要但是複雜度並不高的模組在設計中主要注重功能的完整性及程式碼的質量。設計結構最好是可以複用及移植。所以我認為單個模組只有一個GPIO埠的設計方式更好,但是在有些場景中,如果晶片在設計過程中本身可以使用的資源比較有限,那麼在設計GPIO埠模組的時候就需要仔細的斟酌來降低GPIO模組的資源消耗。
設計一個單GPIO埠的模組需要一個暫存器作為控制暫存器,設計NGPIO埠的模組就需要對控制暫存器的數量及種類進行劃分,從而用較少的暫存器控制更多的GPIO埠。比如一般來說應用中一個暫存器有32bit,若用暫存器組進行控制,那麼一組暫存器就可以控制最多32個埠。而單埠GPIO模組需要一個暫存器,若暫存器組的數量<GPIO埠數,則用NGPIO埠設計更加節省資源。
(某種程度上來說,這種針對場景進行設計優化正是我們作為基層晶片設計工程師存在的意義,如果不是這種需求,我想那些EDA大廠早已寫出一大堆指令碼取代我們這些基層員工了吧,哈哈。
確定了控制模式之後(這裡我們使用單GPIO模組設計),我們將暫存器命名為gpio_ctrl,暫存器為32-bits W/R。
根據GPIO埠設計 1我們可以發現,在實現功能過程中需要加鎖,鎖的存在是有意義的,因為主機有可能無意間因為誤發改變了我們配置暫存器的值,如果我們的埠配置立馬就針對這些改變進行了變化,那麼這種靈敏性會極大的降低我們模組的穩定性。鎖的設計我們使用if-else結構實現。
always (posedge clk or posedge reset)
begin
if (reset)
gpio_ctrl1 <= 6'b00_0000;
gpio_cfg[2:0] <= 3'b000;
else begin
if (gpio_ctrl1[1:0] == 2'b01) begin
if(gpio_ctrl1[3:2] == 2'b11) begin
if(gpio_ctrl1[5:4] == 2'b10) begin
gpio_cfg[2:0] <= gpio_ctrl[4:2];
gpio_ctrl1 <= 6'b00_0000;
end
else begin
gpio_ctrl1[5:4] <= gpio_ctrl[1:0];
end
end
else begin
gpio_ctrl1[3:2] <= gpio_ctrl[1:0];
end
end
else
gpio_ctrl1[1:0] <= gpio_ctrl[1:0];
end
end
通過以上結構,我們實現了鎖的功能。使用復位使用上升沿復位而非下降沿復位,也是為了提高設計的可靠性。
接下來就用剩下的位來實現其他功能的配置,利用狀態機實現對GPIO埠模式的配置:
localparam inputdata = 000,outputdata=001,test_mode = 010, alternate_function = 011;
//if we want to add more alternate functions, we can add more parameters to achieve our aim
always (posedge clk or posedge reset)
begin
if (reset)
****
else begin
case (gpio_cfg)
*****
endcase
end
end
綜上所述,我們GPIO模組的設計就完成了,如需詳細程式碼記得私信我哦。
相關文章
- IC數字設計
- 數字設計ic晶片流程晶片
- Rust程式設計與專案實戰-結構體Rust程式設計結構體
- Android之串列埠程式設計Android串列埠程式設計
- 面經系列:2020年樂鑫數字IC前端設計崗前端
- 數字IC設計 FPGA——再談乘法器設計(使用Verilog 原語 LUT 進行四位乘法器設計)FPGA
- [MAUI 專案實戰] 筆記App(二):資料庫設計UI筆記APP資料庫
- 遊戲關卡設計之<遭遇戰設計>遊戲
- SpringCloud Alibaba實戰(3:儲存設計與基礎架構設計)SpringGCCloud架構
- 樹莓派的GPIO程式設計樹莓派程式設計
- Python專案實戰(一)《Python程式設計 從入門到實踐》Python程式設計
- 【軟體設計】專案設計流程規範
- 數字邏輯實踐3->EDA技術與Verilog設計
- Rust宏之derive的設計及實戰Rust
- 2019黑馬程式設計師vue.js專案實戰全套程式設計師Vue.js
- vue實戰 | vue移動端專案架構設計(附demo)Vue架構
- Python專案實戰:20行程式設計迷宮大陣Python行程程式設計
- [MAUI 專案實戰] 筆記App(一):介紹與程式設計UI筆記APP程式設計
- socket程式設計實戰程式設計
- Java程式設計架構實戰——OKHTTP3原始碼和設計模式(上篇)Java程式設計架構HTTP原始碼設計模式
- 《Kafka實戰》之架構和設計邏輯Kafka架構
- Linux串列埠程式設計Linux串列埠程式設計
- 愛碼單車隊——專案原型設計+概要設計原型
- 銀河護胃隊——專案原型設計+概要設計原型
- 布匹瑕疵檢測專案之計米器模組的設計
- Springboot專案架構設計Spring Boot架構
- Spring Boot實戰系列(3)AOP面向切面程式設計Spring Boot程式設計
- Java協程程式設計之Loom專案嚐鮮Java程式設計OOM
- 10.24程式設計師節專輯——程式設計師最愛的數字,1024的祕密程式設計師
- 淺談設計模式在iOS開發實戰專案中的應用設計模式iOS
- .Net Core後端架構實戰【1-專案分層框架設計】後端架構框架
- 設計模式實戰 - 命令模式設計模式
- AOP程式設計實戰-AspectJ程式設計
- 量表設計與分析實戰
- Apache Kafka 程式設計實戰ApacheKafka程式設計
- 3.外設GPIO、中斷
- 設計模式實戰系列之@Builder和建造者模式設計模式UI
- kubebuilder實戰之四:operator需求說明和設計UI