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