時序邏輯代碼和硬件
本節(jié)的文檔編號:001100000062
需要看對應(yīng)的視頻,請點擊視頻編號:001100000071
1、本節(jié)主要介紹,時序邏輯的代碼,一般有兩種:同步復(fù)位時序邏輯和異步復(fù)位時序邏輯(本教學(xué)統(tǒng)一采用異步時鐘邏輯);D型觸發(fā)器的介紹,包括:D觸發(fā)器的結(jié)構(gòu)、波形、代碼以及如何看FPGA波形;時鐘的介紹,時鐘的意義,時鐘頻率和時鐘周期的換算;時序邏輯代碼和硬件的關(guān)系,即評估verilog代碼好壞的最基本標準,不是看代碼行數(shù)而是看硬件;阻塞賦值和非阻塞賦值,前者位順序賦值,后者位同時賦值。
2、這是ALTERA和VIVADO文檔
6.4?時序邏輯代碼和硬件
先來分析一下下面這段代碼:

仍然從語法上分析該段代碼的功能。該段代碼總是在“時鐘clk上升沿或者復(fù)位rst_n下降沿”的時候執(zhí)行一次。
具體執(zhí)行方法如下:
1.? ?? ?如果復(fù)位rst_n=0,則q的值為0;
2.? ?? ?如果復(fù)位rst_n=1,則將(a+d)的結(jié)果賦給q(注意,前提條件是時鐘上升沿的時候)。
假設(shè)用信號c表示a+d的結(jié)果,則第2點可改為:如果復(fù)位rst_n=1,則將c的值賦給q(注意,前提條件是時鐘上升沿的時刻)。很明顯這是一個D觸發(fā)器,輸入信號為d,輸出為q,時鐘為clk,復(fù)位為rst_n,其電路示意圖如下圖所示:

可知c是a+d的結(jié)果,因此其自然是通過一個加法器實現(xiàn),畫出上面代碼所對應(yīng)的電路結(jié)構(gòu)圖,可以看出在D觸發(fā)器的基礎(chǔ)上增加了一個加法器。

很容易分析出上面電路的功能:信號a和信號b相加得到c,c連到D觸發(fā)器的輸入端。當clk出現(xiàn)上升沿時,將c的值傳給q。這與代碼功能是一致的。
下面是代碼和硬件所對應(yīng)的波形圖。

先看信號c的波形:c的產(chǎn)生只有與a和d有關(guān),與rst_n和clk無關(guān)。c是a+d的結(jié)果,按照二進制加法:0+0=0,0+1=1,1+1=0可以畫出c的波形。
在第1個時鐘期間,a=0,d=0,所以c=0+0=0;
在第2個時鐘期間,a=1,d=0,所以c=1+0=1;
在第3個時鐘期間,a=1,d=1,所以c=1+1=0;
在第4個時鐘期間,a=0,d=1,所以c=0+1=1;
在第5到第6個時鐘期間,a=0,d=0,所以c=0+0=0;
在第7個時鐘期間,a=1,d=1,所以c=1+1=0;
在第8個時鐘期間,a=0,d=1,所以c=0+1=1;
在第9個時鐘期間,a=0,d=0,所以c=0+0=0;
在第10個時鐘期間,a=0,d=1,所以c=0+1=1。
再看信號q的波形:q是D觸發(fā)器的輸出,其只在rst_n的下降沿或者clk的上升沿才變化,其他時刻不變化,即a、d、c發(fā)生變化時,q不會立刻發(fā)生改變。

下面具體分析每個時鐘下q信號的情況:
在rst_n由1變0時,q立刻變成0。
在第2個時鐘上升沿,看到rst_n為0。按代碼功能,q仍然為0。
在第3個時鐘上升沿,看到rst_n為0。按代碼功能,q仍然為0。
在第4個時鐘上升沿,看到rst_n為1,c值為0,q值為0。按代碼功能,q變成0;
在第5個時鐘上升沿,看到rst_n為1,c值為1,q值為0。按代碼功能,q變成1;
在第6個時鐘上升沿,看到rst_n為1,c值為0,q值為1。按代碼功能,q變成0;
在第7個時鐘上升沿,看到rst_n為1,c值為0,q值為0。按代碼功能,q變成0;
在第8個時鐘上升沿,看到rst_n為1,c值為0,q值為0。按代碼功能,q變成0;
在第9個時鐘上升沿,看到rst_n為1,c值為1,q值為0。按代碼功能,q變成1;
在第10個時鐘上升沿,看到rst_n為1,c值為0,q值為1。按代碼功能,q變成0;
在第11個時鐘上升沿,看到rst_n為1,c值為1,q值為0。按代碼功能,q變成1。
在討論時序邏輯的加法器時,筆者對加法器的輸出c和D觸發(fā)器的輸出q分開進行討論,就像兩塊獨立的電路。同樣的道理,在設(shè)計Verilog代碼時也可以將其分開來進行編寫。
先將下面的硬件電路用Verilog描述出來:

該電路對應(yīng)的電路可以寫成:

也可以寫成:

上面的兩段代碼,都是描述同一加法器硬件電路。接著用Verilog對觸發(fā)器進行描述。

其代碼的寫法如下:

最后可以看到,兩段代碼都有信號c,說明這兩段代碼是相連的,利用硬件連接起來可以變成如下圖所示的電路。

由此可見,下面兩段代碼所對應(yīng)的硬件電路是一模一樣的。


有的讀者也許會問:這兩種代碼哪一種比較好呢?答案是這兩段代碼并無區(qū)別,因為兩者的硬件是相同的。由此也可以得知評估verilog代碼好壞的最基本標準,即不是看代碼行數(shù)而是看硬件。