這里來記錄一下相似代碼之間的不同差異,比如同步復(fù)位與異步復(fù)位觸發(fā)器的對(duì)比,上升沿復(fù)位和下降沿復(fù)位的對(duì)比等等。這里主要使用ISE的綜合引擎。直接附上代碼和綜合后電路圖,有些會(huì)有部分講解。
一、異步復(fù)位與同步復(fù)位
我在復(fù)位電路里面講解了同步復(fù)位和異步復(fù)位的區(qū)別,這里就不詳細(xì)介紹了,鏈接如下:http://www.cnblogs.com/IClearner/p/6683100.html
(1)異步復(fù)位
異步復(fù)位的代碼如下所示:
module DFF1( input clk, input rst_n, input d, output reg q ); always@(posedge clk or negedge rst_n) if(!rst_n) q <= 0; //異步清 0,低電平有效 else q <= d; endmodule
綜合得到的電路圖如下所示:
可以看到使用了一個(gè)反相器單元和一個(gè)觸發(fā)器單元;從代碼中我們可以推斷出,這是一個(gè)高電平有效的、異步復(fù)位觸發(fā)器。
(2)同步復(fù)位
同步復(fù)位觸發(fā)器代碼如下所示,注意黑體部分
module DFF2( input clk, input rst_n, input d, output reg q ); always@(posedge clk )//注意這里有所不同 if(!rst_n) q <= 0; //同步清 0,低電平有效 else q <= d; endmodule
綜合得到的電路如下所示:
我們可以看到,也是由一個(gè)反向器單元和一個(gè)觸發(fā)器單元構(gòu)成,注意,這里的觸發(fā)器跟上面的觸發(fā)器顯然不是同一個(gè)類型的觸發(fā)器,管腳名稱改變了;結(jié)合代碼我們可以知道,這個(gè)觸發(fā)器是高電平觸發(fā)、同步復(fù)位的觸發(fā)器(由于是輸入信號(hào)是低電平有效,所以加了個(gè)反相器)。
二、不同電平之間的復(fù)位差異
(1)高電平觸發(fā)的異步復(fù)位VS低電平觸發(fā)的異步復(fù)位
①高電平觸發(fā)的異步復(fù)位(異步置位)
綜合得到的電路如下所示:
根據(jù)代碼,容易推斷得出這是一個(gè)高電平觸發(fā)、異步復(fù)位的觸發(fā)器(或者叫異步置位),這也與前面的內(nèi)容相符合(高電平觸發(fā)復(fù)位,所以不用加反相器)。
②低電平觸發(fā)的異步復(fù)位
代碼和電路跟 一(1)的代碼和電路相同,這里不進(jìn)行重述。
(2)高電平觸發(fā)的同步復(fù)位VS低電平觸發(fā)的同步復(fù)位
①高電平觸發(fā)的同步復(fù)位
代碼如下所示:
1 module DFF4( 2 input clk, 3 input rst_r, 4 input d, 5 output reg q 6 ); 7 8 always@(posedge clk ) 9 if(rst_r) 10 q <= 0; 11 else 12 q <= d; 13 14 endmodule
綜合得到的電路如下所示:
可以知道,這是一個(gè)高電平有效、同步復(fù)位的觸發(fā)器單元。
②低電平觸發(fā)的同步復(fù)位
代碼和電路同一(2),這里不進(jìn)行重述
三、阻塞賦值和非阻塞賦值
(1)阻塞賦值綜合的觸發(fā)器
代碼如下所示,這里為了使用高電平觸發(fā)的觸發(fā)器單元,寫出高電平復(fù)位:
1 module DFF_chain( 2 input clk, 3 input rst_r, 4 input d, 5 output reg q 6 ); 7 reg reg_m ; 8 always @(posedge clk )//high level reset,synchronization 9 if(rst_r)begin 10 reg_m = 0;//block 11 q = 0; 12 end else begin 13 reg_m = d; 14 q = reg_m ; 15 end 16 endmodule
綜合得到的電路如下所示:
可以看到,綜合得到只有一個(gè)觸發(fā)器,中間的觸發(fā)器變量reg_m被優(yōu)化掉了,只剩下q這個(gè)觸發(fā)器。
(2)換個(gè)順序的非阻塞賦值的觸發(fā)器
把后面的這兩個(gè)語(yǔ)句對(duì)調(diào)一下,同時(shí)把中間的變量改個(gè)名字,改成reg_block(這里改名字只是為了區(qū)分后面的非阻塞賦值的情況)
即要綜合的代碼如下所示:
1 module DFF_chain( 2 input clk, 3 input rst_r, 4 input d, 5 output reg q 6 ); 7 reg reg_block ; 8 always @(posedge clk )//high level reset,synchronization 9 if(rst_r)begin//block 10 reg_block = 0; 11 q = 0; 12 end else begin //here has changed 13 q = reg_block ; 14 reg_block = d; 15 end 16 endmodule
綜合得到的電路如下所示:
可以看到,調(diào)換順序之后,得到了我們我們想要的觸發(fā)器鏈。
結(jié)論:描述時(shí)序邏輯使用阻塞賦值可能得到正確的結(jié)果,也可以得到不正確的結(jié)果,因此時(shí)序邏輯不建議使用阻塞賦值。
(3)非阻塞賦值綜合的觸發(fā)器
代碼如下所示:
1 module DFF_chain( 2 input clk, 3 input rst_r, 4 input d, 5 output reg q 6 ); 7 reg reg_m ; 8 always @(posedge clk )//high level reset,synchronization 9 if(rst_r)begin 10 reg_m <= 0;//non block 11 q <= 0; 12 end else begin 13 reg_m <= d; 14 q <= reg_m ; 15 end 16 endmodule
綜合得到的電路如下所示:
從電路圖中可以看到,綜合得到了兩個(gè)觸發(fā)器,中間的觸發(fā)器reg_m被保留下來了,達(dá)到了我們預(yù)想中的觸發(fā)器鏈。
(4)換個(gè)順序后的非阻塞賦值
跟前面的阻塞賦值一樣,我們換一下順序,代碼如下所示:
1 module DFF_chain( 2 input clk, 3 input rst_r, 4 input d, 5 output reg q 6 ); 7 reg reg_nonblock ; 8 always @(posedge clk )//high level reset,synchronization 9 if(rst_r)begin//non block 10 reg_nonblock <= 0; 11 q <= 0; 12 end else begin 13 q <= reg_nonblock ; 14 reg_nonblock <= d; 15 end 16 endmodule
綜合得到的電路如下所示:
從電路中可以看到,即使調(diào)換了順序,電路還是我們需要的觸發(fā)器鏈。
結(jié)論:描述時(shí)序邏輯,使用非阻塞賦值可以得到正確的結(jié)果,因此時(shí)序邏輯推薦使用非阻塞賦值。
(5)描述組合邏輯電路時(shí)的阻塞賦值和非阻塞賦值
阻塞賦值描述組合邏輯(加法器),代碼如下所示:
1 module Adder( 2 input a, 3 input b, 4 input c, 5 output reg q 6 ); 7 reg sum_block ; 8 always @(* ) 9 begin 10 sum_block = a + b ; 11 q = sum_block + c; 12 end 13 endmodule
綜合得到電路如下所示:
綜合得到的電路是一個(gè)加法器。
我們改成非阻塞賦值看看,代碼如下所示:
1 module Adder( 2 input a, 3 input b, 4 input c, 5 output reg q 6 ); 7 reg sum_block ; 8 always @(* ) 9 begin 10 sum_block <= a + b ; 11 q <= sum_block + c; 12 end 13 endmodule
綜合得到的電路:
綜合得到的電路也是一個(gè)加法器。
因此可以冒險(xiǎn)地得到一個(gè)結(jié)論,無論是阻塞賦值還是非阻塞賦值,都可以描述組合邏輯,但是一般情況下,我們推薦使用阻塞賦值,一方面是對(duì)仿真有用,另一方面是區(qū)別于描述時(shí)序邏輯的非阻塞賦值。
最后我嘗試著在同一個(gè)塊中使用阻塞賦值和非阻塞賦值,ISE的綜合器報(bào)錯(cuò)。
編輯:hfy
-
觸發(fā)器
+關(guān)注
關(guān)注
14文章
2032瀏覽量
61851 -
同步復(fù)位
+關(guān)注
關(guān)注
0文章
27瀏覽量
10838 -
異步復(fù)位
+關(guān)注
關(guān)注
0文章
47瀏覽量
13465
發(fā)布評(píng)論請(qǐng)先 登錄
單片機(jī)各種復(fù)位電路原理
復(fù)位電路的作用、控制方式和類型

FPGA復(fù)位的8種技巧

復(fù)位電路的設(shè)計(jì)問題

復(fù)位電路的三種方式 復(fù)位電路的原理和作用
復(fù)位電路的電容多大的 復(fù)位電路設(shè)計(jì)類型有哪幾種
復(fù)位電路是如何工作的
復(fù)位電路靜電整改案例分享(一)——交換機(jī)復(fù)位電路

評(píng)論