时延控制
常规时延
等一会的时延
reg value_test;
reg value_general;
#10 value_general = value_test;
亦或是
//另起一行 可读性+1
reg value_test;
reg value_general;
#10;
value_general - value_test;
内嵌时延
先将计算结果保存,然后等待一段时间后赋值给目标信号 内嵌时延控制加在赋值号之后,如:
reg value_test;
reg value_embed;
value_enbed = #10 vaule_test;
区别在哪??
`timescale 1ns/1ns
module tset;
reg value_test;
reg value_general,value_embed,value_single;
initial begin
value_test = 0;
#25; value_test = 1;
#35; value_test = 0;
#40; value_test = 1;
#10; value_test = 0;
end
//general Delay
initial begin
value_general = 1;
#10 value_general = value_test;
#45 value_general = value_tset;
#30 value_general = value_test;
#20 value_general = value_test;
end
initial begin
value_general = 1;
value_embed = #10 value_test;
value_embed = #45 value_test;
value_embed = #30 value_test;
value_embed = #20 value_test;
end
initial begin
value_single = 1;
#10;
value_single = value_test;
#45;
value_single = value_test;
#30;
value_single = value_test;
#20;
value_single = value_test;
end
always begin
#10;
if($time >= 150)begin
$finish
end
end
endmodule
general先延时后赋值,embed先取值后延时。细看差别即可
边沿触发事件控制
一般事件控制
事件控制用@表示
关键字posedge表示正向边沿跳变,negedge表示负向边沿跳变,未指明边沿跳变方向时,2种情况的边沿变化都会触发事件
如:
always @(clk) q<=d;
always #(posedge clk) q<=d;
always #(negedge clk) q<=d;
q = @(posedge clk)d;
命名事件控制
用户可以声明event事件类型的变量,并触发该变量来识别该事件是否发生。命名事件用event来声明,触发信号用->表示,如:
event start_receiving;
always @(posedge clk_samp) begin
->start_receiving;//采样 posedge来作为时间触发时刻
end
always @(start_receiving) begin
data_buf = {data_if[0],data_if[1]};
end
敏感列表
有多敏感
多个信号或是事件中任意一个发生变化都能触发语句的执行时,用or连接或者用,连接,Verilog中称之为敏感列表。
我去这么敏感:
always @(posedge clk or negedge rstn) begin
//always @(posedge clk,negedge rstn) begin
assign s = a?b+c:d?e+f:g?h+i:j?k+l:m;
end
电平敏感事件控制
关键词wait表示电平敏感情况
initial begin
wait (start_enbale);
forever begin
@(posedge clk_samp);
data_buf = {data_if[0],data_if[1]};
end
end