賦值語句應(yīng)該是開發(fā)過程中使用最多的語句桑谍,在FPGA中铺董,賦值語句分為“非阻塞賦值”和“阻塞賦值”,什么是“非阻塞賦值”棱貌? 什么是“阻塞賦值”玖媚?它們的區(qū)別在哪?下面用具體實例來說明婚脱。
不論學(xué)習(xí)什么語句今魔,都是先認(rèn)識,了解一下它再去使用障贸,所謂"知己知彼错森,方可百戰(zhàn)不殆"。
非阻塞賦值
賦值很好理解篮洁,重點在“非阻塞”涩维,“阻塞” 就是 堵 ,“非"表 否定袁波。非阻塞就是通暢嘛瓦阐,那通暢怎么樣的?
先看下面這段代碼
initial
begin
A <= B; // 語句1
B <= A; // 語句2
end
其中操作符 "<=" 就是非阻塞型幅值語句锋叨。
我們看begin — end里的兩個句子垄分,到底哪個先執(zhí)行呢?
答案是同時執(zhí)行娃磺,因為它是非阻塞幅值薄湿,一路通暢啊,誰也攔不了我偷卧,我走我的豺瘤,你走你的,互不干擾听诸,通暢就通暢在這里坐求。
現(xiàn)在提個問題:若A=1,B=2,那么執(zhí)行以上語句后,A和B會變成什么呢晌梨?
想知道答案桥嗤,我最好的辦法就是編程须妻,然后仿真看下結(jié)果。
源文件
///////////////////////////
// 文件名:非阻塞賦值語句 //
// 修改時間:2017.10.27 //
///////////////////////////
`timescale 1ns / 1ps
module n_assignment(
input wire clk,
input wire rst,
output reg [1:0]A,B
);
always @(posedge clk,negedge rst)
begin
if(!rst)
begin
A <= 1;
B <= 2;
end
else
begin
A <= B;
B <= A;
end
end
endmodule
寫tb文件看下效果
`timescale 1ns / 1ps
module tb_n_assignment;
reg clk;
reg rst;
wire [1:0]A;
wire [1:0]B;
//例化
n_assignment uuit(.clk(clk),.rst(rst),.A(A),.B(B));
initial
begin
rst = 0;#100;
rst = 1;
end
always
begin
clk=1;#10;
clk=0;#10;
end
endmodule
這樣我們從仿真圖可以看出泛领,這段代碼實現(xiàn)的功能是將A,B兩者的數(shù)據(jù)轉(zhuǎn)換荒吏,也就是說執(zhí)行
begin
A <= B; // 語句1
B <= A; // 語句2
end
A,B同時給對方值,給的是自己的初值渊鞋,當(dāng)一賦值之后就變成了對方<(^-^)>绰更,這就類似兩名相向跑步的運動員,起點便是初值锡宋,我們同時出發(fā)儡湾,速度都一樣,所以A到了B出點時,B也到了A的出發(fā)點,也就是 A<=B,B<=A余黎,我變成了你,你變成了我丹皱。
非阻塞賦值就是這樣啦妒穴,下面看阻塞型賦值宋税。
阻塞型賦值
阻塞型賦值說明在賦值時堵住了,那這堵又是怎么回事呢讼油?
老辦法杰赛,寫代碼做實驗,仿真看結(jié)果矮台。
///////////////////////////
// 文件名:阻塞賦值語句 //
// 修改時間:2017.10.27 //
///////////////////////////
`timescale 1ns / 1ps
module assignment(
input wire clk,
input wire rst,
output reg [1:0]A,B
);
always @(posedge clk,negedge rst)
begin
if(!rst)
begin
A = 1;
B = 2;
end
else
begin
A = B;
B = A;
end
end
endmodule
tb文件
module tb_assignment;
reg clk;
reg rst;
wire [1:0]A;
wire [1:0]B;
//例化
assignment uuit(.clk(clk),.rst(rst),.A(A),.B(B));
initial
begin
rst = 0;#100;
rst = 1;
end
always
begin
clk=1;#10;
clk=0;#10;
end
endmodule
可以看出這段代碼的功能不再是交換A,B兩者的值了,畢竟代碼改了乏屯,賦值變成阻塞的了,功能當(dāng)然不一樣瘦赫,這好像是廢話辰晕,(lll¬ω¬)
我們再看看這段代碼
begin
A = B;
B = A; //注意賦值是阻塞的
end
它是先執(zhí)行A=B,B把自身的值給了A,然后再執(zhí)行A=B确虱。
就像接力賽含友,前面的執(zhí)行了后面才能執(zhí)行,語句A拿著接力棒校辩,跑完了自己的路程,即執(zhí)行了自己的語句窘问,把接力棒交給語句B,B才能往前走宜咒,去執(zhí)行它的語句惠赫。
電路構(gòu)成的差異比較
好的,通過上面的兩個例子故黑,非阻塞型賦值和阻塞型的性質(zhì)的都解釋好了儿咱,下面再看下它們形成電路上的差異庭砍。
我們看這段代碼
module and_block_assign
(
input wire a,b,c,
output reg y
)
always @*
begin
y=a;
y=y&b;
y=y&c;
end
endmodule
以上代碼描述的電路是這樣的
但是阻塞賦值語句變成非阻塞賦值語句后,也就是下面這段代碼
module and_block_assign
(
input wire a,b,c,
output reg y
)
always @*
begin
y<=a;
y<=y&b;
y<=y&c;
end
endmodule
它描述的電路卻是這樣的
可以看出兩者的差別是還是很大的混埠,好了逗威,關(guān)于賦值語句我就嘮叨到這里,文章若有什么錯誤的地方希望讀者指出岔冀,同時也歡迎大家和我在評論區(qū)交流凯旭,當(dāng)然打賞那是最好不過的了。