matrx2010 发表于 2010-4-7 16:30:46

刚学学习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

Nuker 发表于 2010-4-7 22:01:41

两个问题
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最好在复位时也赋一个确定的初值。

matrx2010 发表于 2010-4-7 22:48:43

回复【1楼】Nuker
-----------------------------------------------------------------------

./emotion/em007.gif谢谢啊!刚刚学习受益匪浅!

gliet_su 发表于 2010-4-7 23:46:30

rest作为异步复位信号,要在always敏感列表中的:

按LZ的写法,用作同步复位也是可以的。没必要非得异步复位。
页: [1]
查看完整版本: 刚学学习Verilog自己编写的一些小程序请高手指正