如何用verilog写8个流水灯

 我来答
oakyyds
推荐于2017-11-23 · TA获得超过638个赞
知道小有建树答主
回答量:261
采纳率:50%
帮助的人:94万
展开全部

先把问题具体化:

       假如 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
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式