查看: 1929|回復: 0
打印 上一主題 下一主題

FPGA至簡(jiǎn)設計法經(jīng)典案例1241003385

[復制鏈接]
跳轉到指定樓層
樓主
發(fā)表于 2018-9-14 15:54:17 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
關(guān)鍵詞: FPGA
至簡(jiǎn)設計法經(jīng)典案例
學(xué)習FPGA,最關(guān)鍵的是學(xué)什么?有讀者學(xué)了大半年時(shí)間的FPGA,學(xué)了串口就只懂串口的設計,學(xué)了SPI就只懂SPI接口的設計。每個(gè)接口、每個(gè)功能,都只是學(xué)一個(gè)懂一個(gè)。換個(gè)功能需求,或者對接口做一個(gè)小小的改動(dòng),就無(wú)從下手了。
設計代碼,從來(lái)都只是模仿,或者不斷地調試修改,湊代碼。設計出的代碼也沒(méi)有任何規律,相同的功能,今天設計和明天設計都不一樣。這就如學(xué)功夫,今天學(xué)下少林,明天學(xué)下武當,后天又學(xué)下華山,在這樣的情況下,能成長(cháng)為高手,那就奇怪了。
在明德?lián)P看來(lái),FPGA設計應該有一套通用的設計方法。該方法能夠應付所有的功能設計,無(wú)論功能怎么變,都可以用該方法來(lái)套用。明德?lián)P發(fā)明的這套方法就是至簡(jiǎn)設計法。
至簡(jiǎn)設計法從宏觀(guān)上,適應所有的功能設計需求。例如,無(wú)論是什么功能,我們都先將其轉化成需求波形。然后在此基礎上設計模塊架構;在模塊架構基礎上設計信號。這步驟都是通用的、是固化的。
至簡(jiǎn)設計法在微觀(guān)上,則制定得實(shí)用的規范。詳細到,要不要添加信號;怎么添加信號;添加信號的名字規范等,我們都做了詳細的規定。
下面我們用4個(gè)經(jīng)典例子,講述了至簡(jiǎn)設計法的使用技巧。其他復雜功能,無(wú)論怎么變,都是這4個(gè)經(jīng)典案例的變種。讀者只需要強化、鞏固技巧,多訓練,多應用,逐步成長(cháng)為高手。
至簡(jiǎn)設計法經(jīng)典案例1
案例1. 當收到en=1后,dout產(chǎn)生一個(gè)寬度為10個(gè)時(shí)鐘周期的高電平脈沖。
                              
需要說(shuō)明,根據看波形規則,在第3個(gè)時(shí)鐘上沿的時(shí)候,看到en==1,根據功能要求,上升沿之后dout就會(huì )變?yōu)?/font>1。10個(gè)時(shí)鐘周期后,dout將變?yōu)?/font>0。
從功能要求中,看到數字10,我們就知道要計數,并且是dout==1的次數為10個(gè)。所以我們計算的是dout==1的時(shí)鐘次數,并且是10次。為此,補充一個(gè)計數器信號cnt,更新后的波形如下圖。
計數器cnt要遵守如下原則。
初值一定為0。
除了最后一個(gè),在時(shí)鐘上升沿,看到dout==1,就將cnt值加1
在時(shí)鐘上升沿時(shí)看到dout==1,并且是最后一個(gè)時(shí),cnt值不加1,直接清零。
從功能要求和波形圖,我們確認,計數器cnt是對dout==1進(jìn)行計數,并且一共數10個(gè)。為此,在GVIM編輯器中輸入“Jsq”并回車(chē),將出現如下代碼。
在第13行,輸入dout==1,在第14行代碼中,輸入10-1,這樣就完成了計數器設計。
代碼解釋?zhuān)旱?/font>1至第11行,是一個(gè)時(shí)序always的代碼。該代碼要描述的功能是:
在時(shí)鐘clk上升沿或者復位rst_n的下降沿的時(shí)候,always就對cnt判斷條件并變化一次。具體變化過(guò)程如下:
如果是rst_n==0,則將cnt變?yōu)?。
否則(即rst_n==1),如果add_cnt有效,也就是為1的時(shí)候。繼續判斷條件并執行。
如果end_cnt有效,即end_cnt==1,則將cnt變?yōu)?。
否則(即end_cnt==0),cnt就自加1。
否則(即rst_n==1且add_cnt==0的時(shí)鐘),cnt保持不變。
上面代碼中add_cnt表示計數器加1條件,end_cnt表示計數器數到最后一個(gè)。
上面代碼描述過(guò)于復雜,其實(shí)概括起來(lái),功能就是:時(shí)鐘上升沿時(shí),如果計數器加1條件有效,并且是數到最后一個(gè),則計數器清零;如果計數器加1條件有效,但不是最后一個(gè),則計數器就加1;其他時(shí)候,計數器就保持不變。
那么加1條件,即add_cnt是什么呢?在第13行進(jìn)行了定義。該行代碼表示,dout==1就是計數器的加1條件。
那么結束條件,即end_cnt是什么呢?在第14行進(jìn)行了定義。該行代碼表示,數到10個(gè)就結束。其中我們關(guān)注的是那個(gè)數字10,而-1是固定的格式。
add_cnt && cnt==10-1,含義是表示“數到第10個(gè)的時(shí)候”,add_cnt &&cnt==x-1表示“數到第x個(gè)的時(shí)候”。記住這個(gè)規則。end_cnt==1也表示數完了。
設計好計數器cnt后,我們就可以設計輸出信號dout了。仔細分析dout,該信號有兩個(gè)變化點(diǎn):變1和變0。我們分析原因,dout1是由于收到en==1;dout0,則是數到了10個(gè)或者是數完了。所以綜上所述,dout的代碼是:
至此,我們完成了主體程序的設計,接下來(lái)補充module的其他部分。
module的名稱(chēng)定義為my_ex1。并且我們已經(jīng)知道該模塊有4個(gè)信號:clk、rst_n、endout。為此,代碼如下:
其中clk、rst_nen是輸入信號,dout是輸出信號,并且4個(gè)信號都是1比特的,根據這些信息,我們補充輸入輸出端口定義。代碼如下:
接下來(lái)定義信號類(lèi)型。
cnt是用always產(chǎn)生的信號,因此類(lèi)型為reg。cnt計數的最大值為9,需要用4根線(xiàn)表示,即位寬是4位。add_cntend_cnt都是用assign方式設計的,因此類(lèi)型為wire。并且其值是0或者1,1個(gè)線(xiàn)表示即可。因此代碼如下:
dout是用always方式設計的,因此類(lèi)型為reg。并且其值是0或者1,1根線(xiàn)表示即可。因此代碼如下:
至此,整個(gè)代碼的設計工作已經(jīng)完成。整體代碼如下:

1
  
2
  
3
  
4
  
5
  
6
  
7
  
8
  
9
  
10
  
11
  
12
  
13
  
14
  
15
  
16
  
17
  
18
  
19
  
20
  
21
  
22
  
23
  
24
  
25
  
26
  
27
  
28
module my_ex1(
  
      clk      ,
  
      rst_n    ,
  
      en       ,
  
      dout        
  
);
  
input     clk     ;
  
input     rst_n   ;
  
input     en      ;
  
output    dout    ;
  
  
reg [ 3:0]  cnt      ;
  
wire        add_cnt ;
  
wire        end_cnt ;
  
reg         dout    ;
  
  
  
always @(posedge clk or negedge  rst_n)begin
  
     if(!rst_n)begin
  
         cnt <= 0;
  
     end
  
     else if(add_cnt)begin
  
         if(end_cnt)
  
            cnt <= 0;
  
         else
  
            cnt <= cnt + 1;
  
     end
  
end
  
  
assign add_cnt = (dout==1);      
  
assign end_cnt = add_cnt &&  cnt==10 -1 ;   
  
  
always   @(posedge clk or negedge rst_n)begin
  
     if(rst_n==1'b0)begin
  
         dout <= 0;
  
     end
  
     else if(en==1)begin
  
         dout <= 1;
  
     end
  
     else if(add_cnt && cnt==10-1)begin
  
         dout <= 0;
  
     end
  
end
  
  
endmodule

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

關(guān)于我們  -  服務(wù)條款  -  使用指南  -  站點(diǎn)地圖  -  友情鏈接  -  聯(lián)系我們
電子工程網(wǎng) © 版權所有   京ICP備16069177號 | 京公網(wǎng)安備11010502021702
快速回復 返回頂部 返回列表
午夜高清国产拍精品福利|亚洲色精品88色婷婷七月丁香|91久久精品无码一区|99久久国语露脸精品|动漫卡通亚洲综合专区48页