<數字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程式設計結構體
- PHP 實戰之設計模式:PHP 中的設計模式PHP設計模式
- Ic設計 網站大全網站
- 遊戲關卡設計之<遭遇戰設計>遊戲
- Android之串列埠程式設計Android串列埠程式設計
- 面經系列:2020年樂鑫數字IC前端設計崗前端
- [MAUI 專案實戰] 筆記App(二):資料庫設計UI筆記APP資料庫
- 樹莓派的GPIO程式設計樹莓派程式設計
- Rust宏之derive的設計及實戰Rust
- Kafka專案實戰-使用者日誌上報實時統計之分析與設計Kafka
- Python專案實戰:20行程式設計迷宮大陣Python行程程式設計
- vue實戰 | vue移動端專案架構設計(附demo)Vue架構
- [MAUI 專案實戰] 筆記App(一):介紹與程式設計UI筆記APP程式設計
- 【軟體設計】專案設計流程規範
- socket程式設計實戰程式設計
- Socket 程式設計實戰程式設計
- SpringCloud Alibaba實戰(3:儲存設計與基礎架構設計)SpringGCCloud架構
- Java程式設計架構實戰——OKHTTP3原始碼和設計模式(上篇)Java程式設計架構HTTP原始碼設計模式
- Java併發程式設計實戰--計數訊號量(Semaphore)Java程式設計
- 寒假專案3-應用列舉(設計)
- 元件庫設計實戰系列:複雜元件設計元件
- 《Kafka實戰》之架構和設計邏輯Kafka架構
- 設計模式Java實現開源專案設計模式Java
- 專案實施計劃及總體設計報告
- 布匹瑕疵檢測專案之計米器模組的設計
- AKM專案總結之採購組設計
- 數字邏輯實踐3->EDA技術與Verilog設計
- iC3D Suite for Mac(三維包裝設計軟體)3DUIMac
- Python專案實戰(一)《Python程式設計 從入門到實踐》Python程式設計
- 3.外設GPIO、中斷
- 元件庫設計實戰系列:重新設計 React 元件庫元件React
- Apache Kafka 程式設計實戰ApacheKafka程式設計
- AOP程式設計實戰-AspectJ程式設計
- 設計模式實戰 - 命令模式設計模式
- 量表設計與分析實戰
- 從0開始的數值設計實戰(一)