設(shè)計(jì)背景:
阻塞(=)和非阻塞(<=)一直是在我們FPGA中討論的問題,資深的學(xué)者都是討論的是賦值應(yīng)該發(fā)生在上升下降沿還是在哪里,我們?cè)诜抡嬷锌吹目赡苁巧仙陆凳菧?zhǔn)確的,但是在時(shí)間電路中這就是不得而知了,今天我們將學(xué)習(xí)阻塞和非阻塞的區(qū)別,我們不研究他們發(fā)生在哪里,之討論發(fā)生的時(shí)間和發(fā)生的地方。
設(shè)計(jì)原理:
阻塞:在本語句中“右式計(jì)算”和“左式更新”完全完成之后,才開始執(zhí)行下一條語句;
非阻塞:當(dāng)前語句的執(zhí)行不會(huì)阻塞下一語句的執(zhí)行。
我們來看一下下面的阻塞的代碼
0modulestudy_4 (clk,rst_n,d,q);
1 //輸入輸出端口
2 inputclk;
3 inputrst_n;
4 input[1:0]d;
5 outputreg[1:0]q;
6
7 reg[1:0]q1;//定義一個(gè)寄存器
8
9 always@(posedgeclk)
10 begin
11 if(!rst_n) //復(fù)位時(shí)用阻塞給寄存器輸出賦初值
12 begin
13 q1 =0;
14 q =0;
15 end
16 else //阻塞語句進(jìn)行賦值
17 begin
18 q1 =d;
19 q =q1;
20 end
21 end
22
23endmodule
always語句塊對(duì)Clk的上升沿敏感,當(dāng)發(fā)生Clk 0~1的跳變時(shí),執(zhí)行該always語句。
在begin...end語句塊中所有語句是順序執(zhí)行的,而且最關(guān)鍵的是,阻塞賦值是在本語句中“右式計(jì)算”和“左式更新”完全完成之后,才開始執(zhí)行下一條語句的。
在上面的代碼中在18行當(dāng)上升沿來到先執(zhí)行把d的值給q1,然后下一個(gè)上升沿把q1賦值給q。
我們的測(cè)試文件如下:
0`timescale1ns/1ps
1
2moduletb;
3
4 regclk;
5 regrst_n;
6 reg[1:0]d;
7 wire[1:0]q;
8
9 initialbegin
10 clk =1;
11 rst_n =0;
12 d =0;
13
14 #200.1rst_n =1;
15
16 #100d =2;
17 #100d =0;
18
19 end
20
21 always#10clk =~clk;
22
23 study_4 dut(
24 .clk(clk),
25 .rst_n(rst_n),
26 .d(d),
27 .q(q)
28 );
29
30endmodule
放真圖如下:
我們可以清楚的看到第一個(gè)上升沿的時(shí)候寄存器q為0,第二個(gè)上升沿的時(shí)候q為2,接下來,再看看非阻塞賦值的情況。
所謂非阻塞賦值,顧名思義,就是指當(dāng)前語句的執(zhí)行不會(huì)阻塞下一語句的執(zhí)行。
非阻塞代碼如下:
0modulestudy_4 (clk,rst_n,d,q);
1
2 inputclk;
3 inputrst_n;
4 input[1:0]d;
5 outputreg[1:0]q;
6
7 reg[1:0]q1;
8
9 always@(posedgeclk)
10 begin
11 if(!rst_n) //復(fù)位時(shí)用非阻塞給寄存器輸出賦初值
12 begin
13 q1 <=0;
14 q <=0;
15 end
16 else //非阻塞語句進(jìn)行賦值
17 begin
18 q1 <=d;
19 q <=q1;
20 end
21 end
22
23endmodule
非阻塞在18行以后是這樣執(zhí)行的,18行的時(shí)候d的值給q1,但是不是立馬給過去,而是等到上升的時(shí)候才給,在上升沿同樣執(zhí)行19行,把q1得值給q,大家要明白的這個(gè)時(shí)候給值是q1的舊值,然后同樣在19行也是在上升沿到來后值才給過去的。
我們兩個(gè)模塊用的是一樣的仿真文件,我在這里就不給大家展示了,大家可以直接看仿真圖,如下:
大家可以清楚的看到,在第一個(gè)上升沿的時(shí)候d的值為2,執(zhí)行18行然后不直接賦值,在等到上升沿來的時(shí)候值過去,同樣的后面的也是這么執(zhí)行的,那么我們可以看到圖中和我們分析的一樣。
-
FPGA
+關(guān)注
關(guān)注
1642文章
21918瀏覽量
611981 -
非阻塞賦值
+關(guān)注
關(guān)注
0文章
11瀏覽量
10055
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
FPGA基礎(chǔ)篇(一):阻塞與非阻塞賦值,不只是比原始信號(hào)差一個(gè)時(shí)鐘周期的問題?。ㄉ钊肫饰觯?/a>
Verilog語言中阻塞和非阻塞賦值的不同
在testbench中如何使用阻塞賦值和非阻塞賦值

【技巧分享】FPGA至簡設(shè)計(jì)-阻塞賦值與非阻塞賦值
阻塞賦值和非阻塞賦值的用法一篇文章就夠了
verilog中阻塞賦值和非阻塞賦值到底有什么區(qū)別

IEEE Verilog阻塞賦值和非阻塞賦值的區(qū)別

評(píng)論