本次主要通过3种方法实现流水灯。

方法一:

verilog代码:

`timescale 1ns / 1ps

module led_run(
    Clk,
    Reset_n,
    Led
    );

        input Clk;
        input Reset_n;
        output reg [7:0]Led;
    
    reg [24:0]counter;
    always@(posedge Clk or negedge Reset_n)
    if(!Reset_n)
        counter<=0;
    else if(counter==25000-1)
        counter<=0;
    else 
        counter<=counter+1'd1;
        
    always@(posedge Clk or negedge Reset_n)
    if(!Reset_n)
        Led<=8'b0000_0001;
    else if(counter==25000-1)begin
        if(Led==8'b1000_0000|8'b0000_0000)
            Led<=8'b0000_0001;
        else 
        Led<=Led<<1;
        end
    
endmodule

仿真代码:

`timescale 1ns / 1ns

module led_run_tb(    );
    reg Clk;
    reg Reset_n;
    wire [7:0]Led;
 
led_run led_run_inst0(
    .Clk(Clk),
    .Reset_n(Reset_n),
    .Led(Led)
    );
    
    initial Clk=1;
    always #10 Clk=~Clk;
    
    initial begin
        Reset_n=0;
        #201;
        Reset_n=1;
        #40_000_000;

        $stop;
    end
      
endmodule


注意,上面代码是为了方便仿真把counter==25000000-1改成了counter==25000-1,实际板子验证为了方便肉眼观察流水灯应该该回去。

仿真输出结果

板子验证依旧和之前一样的步骤

方法二:

    else if(counter==25000-1)begin
        if(Led==8'b1000_0000|8'b0000_0000)
            Led<=8'b0000_0001;
        else 
        Led<=Led<<1;
        end

改为:

    else if(counter==25000-1)begin
        Led<={Led[6:0],Led[7]};
        end

方法三:借助38译码器 

在新建代码之前,把之前38译码器的代码加入到项目中并且在接下来的代码里面会实例化

代码:

`timescale 1ns / 1ps

module led_run2(
    Clk,
    Reset_n,
    Led
    );

        input Clk;
        input Reset_n;
        output wire [7:0]Led;
    
    reg [24:0]counter;
    always@(posedge Clk or negedge Reset_n)
    if(!Reset_n)
        counter<=0;
    else if(counter==25000-1)
        counter<=0;
    else 
        counter<=counter+1'd1;
   
    reg [2:0] counter2;
    always@(posedge Clk or negedge Reset_n)
    if(!Reset_n)
        counter2<=0;
    else if(counter==25000-1)
        counter2<=counter2+1'd1;
     
    decoder_3_8 decoder_3_8_inst0(
            .A0(counter2[0]),
            .A1(counter2[1]),
            .A2(counter2[2]),
            .Y0(Led[0]),
            .Y1(Led[1]),
            .Y2(Led[2]),
            .Y3(Led[3]),
            .Y4(Led[4]),
            .Y5(Led[5]),
            .Y6(Led[6]),
            .Y7(Led[7])
        );
    
endmodule

仿真代码:

`timescale 1ns / 1ns

module led_run2_tb(    );
    reg Clk;
    reg Reset_n;
    wire [7:0]Led;
 
led_run2 led_run2_inst0(
    .Clk(Clk),
    .Reset_n(Reset_n),
    .Led(Led)
    );
    
    initial Clk=1;
    always #10 Clk=~Clk;
    
    initial begin
        Reset_n=0;
        #201;
        Reset_n=1;
        #40_000_000;

        $stop;
    end
      
endmodule

仿真结果和之前一样:

最后在板子上实验和之前一样即可。

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐