自己尝试写了一个4位的LED 移位显示工程,可是Modelsim 的LED 输出一直是初始状态4'b1111,尝试配置到开发板里面之后,却又只能循环显示3个LED。
经过各位大大指点之后,把之前的阻塞,非阻塞赋值的混乱及时改过来了,可是还是不能解决无法4个LED移位显示的功能。
只有把 led 改成5位的register才能做到4位的LED移位显示,可是这样不是浪费了register资源么?请教各位大大还有哪里出了问题?谢谢
源代码:
改了之后能够正常4位显示的工程源代码如下:
module led_shift(sys_clk ,
sys_rstn ,
led
);
//
input sys_clk ;
input sys_rstn ;
output [3:0] led ;
//
reg [3:0] led ;
reg [24:0] delay_cnt ;
//
always@(posedge sys_clk or negedge sys_rstn)
begin
if(!sys_rstn)
delay_cnt<=25'd0;
else if(delay_cnt==25'd24999999)
delay_cnt<=25'd0;
else
delay_cnt<=delay_cnt+1'b1;
end
always@(posedge sys_clk or negedge sys_rstn)
begin
if(!sys_rstn)
led <=4'b1111;
else if(delay_cnt==25'd24999999)
led <= led << 1;
else if(led == 4'b0000)
led <= 4'b1111;
else
led <=led;
end
endmodule
module led_shift(sys_clk ,
sys_rstn ,
led
);
//
input sys_clk ;
input sys_rstn ;
output [4:0] led ;
//
reg [4:0] led ;
reg [24:0] delay_cnt ;
//
always@(posedge sys_clk or negedge sys_rstn)
begin
if(!sys_rstn)
delay_cnt<=25'd0;
else if(delay_cnt==25'd24999999)
delay_cnt<=25'd0;
else
delay_cnt<=delay_cnt+1'b1;
end
always@(posedge sys_clk or negedge sys_rstn)
begin
if(!sys_rstn)
led <=5'b11111;
else if(delay_cnt==25'd24999999)
led <= led << 1;
else if(led == 5'b00000)
led <= 5'b11111;
else
led <=led;
end
endmodule