|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?注册
x
还有下面这个例子
我写了一个呼吸灯:
`define PERIOD 10
`define TIME 2
module breath_led
(
input clk ,
input rst_n ,
output reg led
);
reg [29:0]cnt ;
reg [29:0]phase ;
reg status_flag ;
reg stage ;
always @ (posedge clk or negedge rst_n) begin
if ( !rst_n ) begin
cnt<=0;
phase<=0;
status_flag<=0;
led<=0;
stage<=0;
end
else begin
if ( status_flag==0 ) begin
if ( cnt>=0 && cnt<=`PERIOD-phase-1) begin
led<=0;
end
else if ( cnt>=`PERIOD-phase && cnt<=`PERIOD-1 ) begin
led<=1;
end
if ( cnt>=0 && cnt<=`PERIOD-2 )begin
cnt<=cnt+1;
end
else begin
cnt<=0;
stage<=1;
end
if ( cnt==0 && stage==1 ) begin
phase<=phase+`TIME;
if ( phase==4*`TIME ) begin
phase<=0;
end
end
if ( phase==4*`TIME && cnt==`PERIOD-1 ) begin
status_flag<=1;
end
end
else if ( status_flag==1 ) begin
if ( cnt>=0 && cnt<=`PERIOD-phase-1) begin
led<=1;
end
else if ( cnt>=`PERIOD-phase && cnt<=`PERIOD-1 ) begin
led<=0;
end
if ( cnt>=0 && cnt<=`PERIOD-2 )begin
cnt<=cnt+1;
end
else begin
cnt<=0;
stage<=1;
end
if ( cnt==0 && stage==1 ) begin
phase<=phase+`TIME;
if ( phase==4*`TIME ) begin
phase<=0;
end
end
if ( phase==4*`TIME && cnt==`PERIOD-1 ) begin
status_flag_compute( cnt, phase, status_flag );
end
end
end
end
task status_flag_compute;
input [29:0] cnt ;
input [29:0] phase ;
output status_flag ;
begin
status_flag<=0;
end
endtask
endmodule
在最后用了一个task,但是task中用非阻塞赋值的时候,仿真结果是这样的:
把task里的非阻塞赋值改成阻塞赋值,结果才正确了:
我想问一下,verilog的task中,用非阻塞赋值和阻塞赋值有什么区别啊?时序电路用非阻塞赋值为啥这时候会出错?
|
|