Vivado 时序逻辑 点灯带师 流水灯 参数化

 Vivado 摸鱼记录 Day_4 (^_−)

1. review

         day_3 实现单个led Vivado 时序逻辑 计数器-CSDN博客

         day_2 译码器 Vivado 3-8译码器 4-16译码器-CSDN博客

         day_1 Vivado使用流程Vivado 使用流程 二选一数据选择器-CSDN博客

      今天来当点灯带师(^_−)8位led循环流水灯

2.  day_3   1位改 8位led

                day_3已做过单个led,可将其改为8位向量进行编程:[7:0] led

module led_run(input clk , input reset_n , output reg [7:0] led);

            // 8 个灯0.5s循环亮

            reg [24:0] counter ;

            parameter led_time = 24999999 ;//day_3挖的坑坑(^_−)    

            always@(posedge clk or negedge reset_n)// counter

                    if(!reset_n)

                        counter <= 0;

                    else if (counter == led_time)

                        counter <= 0;

                    else

                        counter <= counter + 1'd1;    

            always@(posedge clk or negedge reset_n)//[7:0]led

                    if(!reset_n)

                        led <= 8'b0000_0001;

                    else if (counter == led_time)

                        begin

                        //循环左移

                            if(led == 8'b1000_0000)

                                led <= 8'b0000_0001;

                            else

                               // led <= {led[6:0] ,led[7]};

                               led <= led <<1'b1 ;

                        end

                    else

                        led <= led ;  //时序逻辑无else保持默认,组合逻辑必须有else

endmodule

                [7:0] led 即8位led

                流水灯采用依次亮灭

                        联系3-8译码器中的位拼接方法:{a,b,c}

                                 led <= {led[6:0] ,led[7]};可完成左移

                        也可以用 led <= led <<1'b1 ;实现

parameter led_time = 24999999 ;//day_3挖的坑坑    (^_−)

                填坑哩:day_3里面若是想修改时长要每个判定里面改很麻烦

                 prameter 就可以在调用和调试的时候修改led_time哩,具体用法看后边(^_−)

3. 3-8译码器 实现 流水灯

        day_2已做过3-8译码器Vivado 3-8译码器 4-16译码器-CSDN博客

module decoder3_8 (input a , input b , input c , output reg [7:0] out);

    always@(*)

        begin

          case({a,b,c})

                3'b000 : out = 8'b0000_0001;

                3'b001 : out = 8'b0000_0010;

                3'b010 : out = 8'b0000_0100;

                3'b011 : out = 8'b0000_1000;

                3'b100 : out = 8'b0001_0000;

                3'b101 : out = 8'b0010_0000;

                3'b110 : out = 8'b0100_0000;

                3'b111 : out = 8'b1000_0000;

         endcase

      end

endmodule

module led_run(input clk , input reset_n , output reg [7:0] led); // 8 个灯0.5s循环亮

            reg [24:0] counter ;

            parameter led_time = 24999999;

            reg [2:0] led_n;

           decoder3_8 ecoder3_8led( .a(led_n[2]) ,  .b(led_n[1]) ,  .c(led_n[0]) , .out(led));

            always@(posedge clk or negedge reset_n)// counter

              if(!reset_n)

                counter <= 0;

              else if (counter == led_time)

                counter <= 0;

              else

                counter <= counter + 1'd1;

        

            always@(posedge clk or negedge reset_n)

               if(!reset_n)

                     led_n <= 3'b000 ;

              else if (counter == led_time)

                begin

                //循环左移

                    if(led_n == 3'b111)

                        led_n <= 3'b000 ;

                    else

                        led_n <= led_n + 1'b1;    

                end

            else

                led_n <= led_n  ;

endmodule

    这里没涉及到原类里面的parameter,想不到吧hhh 

    调用了decoder3_8 一定要记得给名字 decoder3_8led

4. 关于调试 parameter

      仿真时,会运行很长时间,而定义的时间 led_time 往往不是重点观察对象,可以在仿真时修改led_time的值,从而加速仿真速度。

`timescale 1ns / 1ns

module led_run_tb();

    reg i_clk ,i_reset_n ;

    wire [7:0]led ;

    

   // led_run led_run2(.clk(i_clk) , .reset_n(i_reset_n) , .led(led) );

   // defparam led_run2.run_time = 2499;

    

    led_run  #( .run_time(249) )

            led_run2(.clk(i_clk) , .reset_n(i_reset_n) , .led(led) );

    

    initial i_clk = 1 ;

    always #10 clk = ~clk ;

    initial

        begin

            i_reset_n = 0 ;

            #201;

            i_reset_n = 1 ;

            #20000;            

            i_reset_n = 0 ;

            #20000;

            i_reset_n = 1 ;

            #200000;

            $stop;

        end

endmodule

   方法一:

    led_run led_run2(.clk(i_clk) , .reset_n(i_reset_n) , .led(led) );

    defparam led_run2.run_time = 2499;

   先定义,后defparam 修改.run_time 有点类似于C++ A.a //摸摸鱼 

   方法二:

    led_run  #( .run_time(249) )

            led_run2(.clk(i_clk) , .reset_n(i_reset_n) , .led(led) );

           先对.run_time(  )修改,再定义led_run2

        这个是真的有用,要多练习一下下嗷(^_−) //补坑结束

5. 附练习使用 parameter

module led_1(input clk , input reset_n , output reg led);
    //led每秒交替闪烁500ms
    //使用D触发器4位
    //50MHz  20ns   

    reg [36:0] counter ;     

                   //这里标红当然是因为跳过模拟直接上板发现有灯灯不亮啦

                  //当然是因为要注意位数!!!!
    parameter led_time = 24999999;
    always@(posedge clk or negedge reset_n)
    if(!reset_n)
        counter <= 0;
    else if(counter == led_time)
        counter <= 0;
    else
        counter <= counter + 1'd1;
      
    always@(posedge clk or negedge reset_n)
    if(!reset_n)
        led <= 0;
    else if(counter == led_time)
        led <= !led;
    
endmodule

module led_8(input clk , input reset_n , output  [7:0]led  );
    
    led_1  #(.led_time (24999999))
                led0( clk ,  reset_n ,   led[0]);
    led_1  #(.led_time (49999999))
                led1( clk ,  reset_n ,   led[1]);
    led_1  #(.led_time (74999999))
                led2( clk ,  reset_n ,   led[2]); 
    led_1  #(.led_time (99999999))
                led3( clk ,  reset_n ,   led[3]);  
                
     led_1 led4( clk ,  reset_n ,   led[4]);
            defparam   led4.led_time =  99999999;
     led_1 led5( clk ,  reset_n ,   led[5]);
            defparam   led5.led_time =  74999999;
     led_1 led6( clk ,  reset_n ,   led[6]);
            defparam   led6.led_time =  49999999;
     led_1 led7( clk ,  reset_n ,   led[7]);
            defparam   led7.led_time =  24999999;                                                     
    
endmodule
 

//好啦,摸鱼结束啦(^_−)

  • 30
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值