寄存器自动化配置通用案例
本博文設(shè)計(jì)思想采用明德?lián)P至簡(jiǎn)設(shè)計(jì)法。之前都是通過一些完整的案例來分享設(shè)計(jì)心得,而這篇文章以需要配置多個(gè)寄存器的場(chǎng)景講述核心設(shè)計(jì)技巧。
在設(shè)計(jì)案例時(shí)發(fā)現(xiàn),經(jīng)常會(huì)配置比較復(fù)雜的IP核或驅(qū)動(dòng)一些接口進(jìn)而操作外設(shè)。此時(shí),為了讓外設(shè)或IP核正常工作,需要對(duì)其內(nèi)部多個(gè)寄存器進(jìn)行適當(dāng)配置來保證在所需模式下正常工作。我們一般先設(shè)計(jì)接口模塊或IP核頂層文件,之后通過控制模塊按照先后順序自動(dòng)給出所需指令,如讀寫等(下面的講述以只有讀寫指令為例)。接口模塊或IP核頂層模塊收到指令后完成相應(yīng)的操作。
第一個(gè)問題:如何實(shí)現(xiàn)多個(gè)寄存器且每個(gè)寄存器多個(gè)指令的自動(dòng)化配置?
我們可以在控制模塊中建立一個(gè)“配置表”,把讀寫指令以及相應(yīng)的地址和待寫入數(shù)據(jù)保存其中,然后通過計(jì)數(shù)器進(jìn)行指令掃描。這里需要兩級(jí)計(jì)數(shù)器,第一級(jí)計(jì)數(shù)一個(gè)寄存器的指令數(shù),第二級(jí)計(jì)數(shù)器記錄已經(jīng)操作過的寄存器個(gè)數(shù)。配置表以always組合邏輯中case語句塊形式給出,使用寄存器計(jì)數(shù)值區(qū)分不同寄存器。區(qū)分出待操作寄存器后根據(jù)操作計(jì)數(shù)器解析出讀寫指令。
第二個(gè)問題:當(dāng)控制模塊給出指令時(shí),接口模塊或IP核一定能有時(shí)間響應(yīng)么?
這是我們?cè)O(shè)計(jì)時(shí)需要深思熟慮的問題:如何才能保證給出的指令一定會(huì)被下一模塊有效地響應(yīng)?為了實(shí)現(xiàn)這一目的,可以在控制(配置)模塊和時(shí)序接口模塊或IP核頂層模塊之間放置一個(gè)接口銜接模塊,結(jié)構(gòu)如下:
根據(jù)上述需求定義銜接模塊功能:在下游模塊準(zhǔn)備好后才讓上游模塊ctrl給出下一命令,否則等待。并完成讀出的有效數(shù)據(jù)送到上游模塊的任務(wù)。很簡(jiǎn)單,下游模塊輸出給控制模塊一個(gè)信號(hào)rdy,當(dāng)它為高電平時(shí)代表當(dāng)前沒有指令或者上一指令已響應(yīng)完成。控制模塊中指令計(jì)數(shù)器的原有計(jì)數(shù)條件和rdy==1條件邏輯與就完成了上述功能。這里需要特別注意的是:rdy信號(hào)必須以組合邏輯形式給出,否則由于rdy信號(hào)晚一拍輸出,上游模塊會(huì)出現(xiàn)誤認(rèn)情況。核心代碼如下:
控制模塊中:
1 //讀寫操作計(jì)數(shù)器 2 always @(posedge clk or negedge rst_n)begin 3 if(rst_n==1'b0)begin 4 rw_cnt <= 0; 5 end 6 else if(add_rw_cnt) begin 7 if(end_rw_cnt) 8 rw_cnt <= 0; 9 else 10 rw_cnt <= rw_cnt + 1; 11 end 12 end 13 14 assign add_rw_cnt = con_flag && rdy; 15 assign end_rw_cnt = add_rw_cnt && rw_cnt==RW_NUM-1; 16 17 //寫使能 wr_flag和rd_flag由配置表給出 18 always @(posedge clk or negedge rst_n)begin 19 if(rst_n==1'b0)begin 20 wr_en <= 1'b0; 21 end 22 else if(add_rw_cnt && rw_cnt==0 && wr_flag)begin 23 wr_en <= 1'b1; 24 end 25 else begin 26 wr_en <= 1'b0; 27 end 28 end 29 30 //讀使能 31 always @(posedge clk or negedge rst_n)begin 32 if(rst_n==1'b0)begin 33 rd_en <= 1'b0; 34 end 35 else if(add_rw_cnt && rw_cnt==1 && rd_flag)begin 36 rd_en <= 1'b1; 37 end 38 else begin 39 rd_en <= 1'b0; 40 end 41 end?銜接模塊中:
1 //空閑輸出 2 always@(*)begin 3 if(rd_en || wr_en || rd_com || wr_com) 4 rdy <= 0; 5 else 6 rdy <= 1; 7 end 8 9 //命令區(qū)間標(biāo)志位 表示正在響應(yīng)該命令 狀態(tài)機(jī)實(shí)現(xiàn)時(shí)序接口模塊情況 10 always@(posedge clk or negedge rst_n)begin 11 if(!rst_n) 12 wr_com <= 0; 13 else if(wr_en) 14 wr_com <= 1; 15 else if(wr_com && stop2idle) 16 wr_com <= 0; 17 end 18 19 always@(posedge clk or negedge rst_n)begin 20 if(!rst_n) 21 rd_com <= 0; 22 else if(rd_en) 23 rd_com <= 1; 24 else if(rd_com && stop2idle) 25 rd_com <= 0; 26 end 27 28 //地址更新 29 always@(posedge clk or negedge rst_n)begin 30 if(!rst_n) 31 addr_tmp <= 0; 32 else if(wr_en || rd_en) 33 addr_tmp <= addr; 34 end? 到此,寄存器自動(dòng)化配置中兩個(gè)重點(diǎn)問題已然解決。本文是我在設(shè)計(jì)攝像頭圖像采集和以太網(wǎng)兩個(gè)案例過程中總結(jié)所得。本人認(rèn)為這種設(shè)計(jì)思想非常具有通用性,并不僅僅局限于這兩個(gè)案例,因此單獨(dú)提出,以備今后回顧和重用。
?
轉(zhuǎn)載于:https://www.cnblogs.com/moluoqishi/p/7520494.html
與50位技術(shù)專家面對(duì)面20年技術(shù)見證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的寄存器自动化配置通用案例的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 作者简介:王坚
- 下一篇: tree的使用,显示行号,find命令应