基于Verilog HDL的流水灯

module FLOAT_LIGHT(CLOCK_50,SW,LEDR);//全局复位信号SW[17]
input [17:0]SW;
output[17:0]LEDR;
input CLOCK_50;//50M赫兹的时钟
reg clk_1hz;
reg clk_10hz;
reg clk_20hz;
reg clk_60hz;
reg clk;
reg state;
reg [26:0]cnt1hz;
reg [26:0]cnt10hz;
reg [26:0]cnt20hz;
reg [26:0]cnt60hz;
reg [17:0]cnt2;
//50M赫兹的时钟分频为1赫兹
always@(posedge CLOCK_50 or negedge SW[17])
if (!SW[17])
begin cnt1hz<=0;clk_1hz<=0;end
else if(cnt1hz==27'd50_000_000)
begin cnt1hz<=27'b0;clk_1hz<=1;end
else
begin cnt1hz<=cnt1hz+1;clk_1hz<=0;end
//50M赫兹的时钟分频为10赫兹
always@(posedge CLOCK_50 or negedge SW[17])
if (!SW[17])
begin cnt10hz<=0;clk_10hz<=0;end
else if(cnt10hz==27'd50_000_00)
begin cnt10hz<=27'b0;clk_10hz<=1;end
else
begin cnt10hz<=cnt10hz+1;clk_10hz<=0;end
//50兆赫兹的时钟分频为20赫兹
always@(posedge CLOCK_50 or negedge SW[17])
if (!SW[17])
begin cnt20hz<=0;clk_20hz<=0;end
else if(cnt20hz==27'd25_000_00)
begin cnt20hz<=27'b0;clk_20hz<=1;end
else
begin cnt20hz<=cnt20hz+1;clk_20hz<=0;end
//时钟分频为差不多60赫兹
always@(posedge CLOCK_50 or negedge SW[17])
if (!SW[17])begin cnt60hz<=0;clk_60hz<=0;end
else if(cnt60hz==27'd8_000_00)
begin cnt60hz<=27'b0;clk_60hz<=1;end
else
begin cnt60hz<=cnt60hz+1;clk_60hz<=0;end
//控制信号,用SW的最低两位信号作为控制信号,控制选取的时钟频率
always@(*)
case(SW[1:0])
2'b00:clk<=clk_1hz;
2'b01:clk<=clk_10hz;
2'b11:clk<=clk_20hz;
2'b10:clk<=clk_60hz;
endcase
//一个简易的状态机控制实现,同一时刻只有一个灯亮,从右到左依次亮起。
always@(posedge clk or negedge SW[17])
if(!SW[17])
begin cnt2<=18'b0;state<=3'b0;end
else
case(state)
0:begin state<=state+1;cnt2<=cnt2+1;end
1:begin state<=state;cnt2<={cnt2[16:0],cnt2[17]};
endendcase
assign LEDR=cnt2;
endmodule 
该代码是基于CYCLONE IV EP4CE115F29C7 开发板所编写,可直接programmer

你可能感兴趣的:(FPGA入门基础)