用FPGA实现流水灯

这些天一直在看黑金动力的verylog HDL那些事儿,很推荐这个教程,对于那些语法已经有一些基础,但是对FPGA的运行方式,处理方法不是很了解的同学,特别推荐,下面给出我的以一个流水灯代码

module riderled(CLK_50M,key_1,led);
   input CLK_50M,key_1;
 output [7:0] led;
 reg [22:0] cnt;
 
 
 always@(posedge CLK_50M or negedge key_1)
 begin
 if(!key_1)
 cnt<=0;
 //else if(cnt==21'd000000)
 //cnt<=0;
 else
 cnt<=cnt+1'b1;
 end
 wire SYSCLK=cnt[22];
 
 reg dir;
 reg [7:0] led_m;
 
 always@(posedge SYSCLK or negedge key_1)
begin
  if(!key_1)
  dir<=1'd0;
  else if(led_m[6]) //如果改为led_m[7],则流水灯只流过去一次,然后没有现象了,原因是当时钟上升沿到来时,dir改变为1,而此时led_m值为 1 0000 0000

                               然而led_m为8位,1已经溢出了,故灯不再亮。
  dir<=1'd1;
  else if(led[1])  //下一个时钟信号到来时,才将 0 赋给dir
  dir<=1'd0;
 
end
 
 always@(posedge SYSCLK or negedge key_1)
 begin
  if(!key_1)
    led_m<=8'b00000001;
  else
    if(!dir )
        led_m=led_m<<1;
      else if(dir)
         led_m=led_m>>1;
 end

 

 assign led=led_m;
 
  endmodule

代码比较简单,但是把这个贴出来是为了加深对非阻塞赋值的理解,这么一个小小的问题导致我对着张亚峰的代码对着看了几乎两天,很是气馁啊,不过做学问还是要沉得住气,一步一个脚印,不能太浮躁。注释如有错误请高手指正

posted @ 2012-10-24 23:53  huazhongwang  阅读(524)  评论(0编辑  收藏  举报