刚学学习Verilog自己编写的一些小程序请高手指正
流水灯程序,已通过验证module ledwater(led,clk,rest); //模块名ledwater
output led; //定义LED输出口
input clk;
input rest; //定义时钟输入口
reg led_r; //定义输出寄存器
reg counter;
assign led = led_r; //寄存器输出
always @(posedge clk) //过程
begin
if(!rest)
led_r<=8'b00000001;
else
begin
counter<=counter+1;
if(counter==26'd50000000)
begin
led_r<={led_r,led_r}; //循环移位
counter<=0;
end
end
end
endmodule 两个问题
1. rest作为异步复位信号,要在always敏感列表中的:
always @(posedge clk)
改为:
always @(posedge clk or negedge rest)
2. 以下语句不够严密:
counter<=counter+1;
if(counter==26'd50000000)
begin
led_r<={led_r,led_r}; //循环移位
counter<=0;
end
假设当前counter==26'd50000000,那么此时你的语句要求counter执行两个不同的操作counter<=counter+1和counter<=0,所以最好在else语句中指定counter<=counter+1
if(counter==26'd50000000)
begin
led_r<={led_r,led_r}; //循环移位
counter<=0;
end
else
begin
counter<=counter+1;
end
另外,counter最好在复位时也赋一个确定的初值。 回复【1楼】Nuker
-----------------------------------------------------------------------
./emotion/em007.gif谢谢啊!刚刚学习受益匪浅! rest作为异步复位信号,要在always敏感列表中的:
按LZ的写法,用作同步复位也是可以的。没必要非得异步复位。
页:
[1]