FPGA之verilog流水灯小程序 - 大道至简,知易行难!

FPGA之verilog流水灯小程序

同样话不多说直接上代码:

//自己修改过的流水灯,从板子上的led4亮到led1,延迟改为了2s

module led_water(

led,

clk,

rst_n

); // 模块名及端口参数

input clk; // 输入端口定义,50M 时钟

input rst_n;

output[3:0] led; // 输出端口定义

reg[3:0] led; //变量led_out 定义为寄存器型

reg[26:0] counter; /*变量led_out 定义为寄存器型,至于为甚么要定义27位宽,

是因为延迟时间的要求,要计数100000000次的话,那么该次数

值在2的26次方到2的27次方之间,所以采用27位宽*/

/*接下来严格按照明德扬代码编写规范,一个always中只一个输出信号。第一个always块用于编写计数器*/

always @(posedge clk or negedge rst_n)begin

if(rst_n == 1\'b0)begin

counter <= 0;

end

else if(counter == 27\'d99999999)begin /*时钟周期为50MHz,那么一个时钟周期就是1/50M=20ns,

那么若要实现延迟2s下一个灯亮的话,就要计数时钟周期100000000次。*/

counter <= 0;

end

else begin

counter <= counter+1;

end

end

//第二个always块用于编写流水灯

always @(posedge clk or negedge rst_n)begin

if(rst_n == 1\'b0)begin

led <= 4\'b0000;

end

else if(led == 4\'b0000 && counter == 99_999_999)begin

led <= 4\'b1111;

end

else if(counter == 99_999_999)begin

led <= led<<1;

end

end

endmodule