如何用verilog写8个流水灯
1个回答
展开全部
先把问题具体化:
假如 LED “1” 为 亮,“0”为灭,需要 LED 每一秒,从左到右点亮,该如何做?
那么这就有二个具体的问题:
A、一秒如何产生?
如果你的平台时钟是 50Mhz ,也就 clk = 50Mhz,那么利用分频计数来产生1hz的时钟,也就是 时钟周期为 1秒。实例如下:
reg [31:0] cnt;
reg clk_1;
always@(posedge clk_50M or negedge rst_n)
begin
if(!rst_n)
begin
cnt <= 32'd0;
clk_1 <= 1'b0;
end
else
begin
if(cnt == 32'd50_000_000-1)
clk_1 <= ~clk_1;
else
cnt <= cnt + 1;
end
end
B、如何从左向右点亮?
点亮只需要LED设置为是“1”,从左往右,也就是高位到低位依次为“1”,根据clk_1s 的时钟,对LED进行移位就好了。这里有个问题,当LED移位到为全“0”的时候,则需要将 LED 写成初始值,这样就可以一直 循环点亮 下去。实例如下:
always @(posedge Clk_1s or negedge RESET_N)
begin
if(!RESET_N) begin
led_set <= 8'b0000_0000;
end
else begin
if(led_set == 8'b0000_0000)
led_set <= 8'b1000_0000; // 设置初始值
else
led_set <= {1'b0,led_set[7:1]}; // led 依次移位
end
end
下面给一个 led 流水灯的实例:
8个LED 从左到右依次点亮
module led (
input wire Clock,
input wire RESET_N,
output wire [7:0] LED
);
// ---- count 1s ---------
reg [27:0] cnt_1s;
reg clk_1s_en;
always @(posedge Clock or negedge RESET_N)
begin
if(!RESET_N) begin
cnt_1s <= 0;
clk_1s_en <= 0;
end
else begin
if(cnt_1s == 'd50_000_000-1) begin
cnt_1s <= 0;
clk_1s_en <= ~clk_1s_en;
end
else
cnt_1s <= cnt_1s + 1;
end
end
// ----------- led set --------------
reg [7:0] led_set;
always @(posedge clk_1s_en or negedge RESET_N)
begin
if(!RESET_N) begin
led_set <= 8'b0000_0000;
end
else begin
if(led_set == 8'b0000_0000)
led_set <= 8'b1000_0000;
else
led_set <= {1'b0,led_set[7:1]};
end
end
assign LED = led_set;
endmodule
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询