Vivado 从计数器到可控线性序列机 B

Vivado 摸鱼记录 Day_6 ٩( 'ω' )و 

1. review

         day_5  从计数器到可控线性序列机 A Vivado 从计数器到可控线性序列机 A-优快云博客

         day_4 参数化设计 Vivado 时序逻辑 点灯带师 流水灯 参数化-优快云博客

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

         day_2 译码器 Vivado 3-8译码器 4-16译码器-优快云博客

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

        今天就把day_5的任务完成~~~٩( 'ω' )و 

2. 今日任务 T4-T6

3. mode_4   8个状态待指定  时间值待指定

        对比mode_3,mode_4需在其基础上令时间值作为输入

3.1 mode_4

module mode_4(input clk , input reset_n , input [7:0]state_8 , 
              input [27:0]led_time , output reg led);
     //8个状态待指定  时间值待指定
    reg [27:0] counter; 
    
    
    always@(posedge clk or negedge reset_n)
    if(!reset_n)
        counter <= 0;
    else if(counter == led_time - 1)
        counter <= 0;
    else
        counter <= counter + 1'd1;
    
    reg [2:0] counter_s;    
     always@(posedge clk or negedge reset_n)
    if(!reset_n)
        counter_s <= 3'b000;
    else if(counter == led_time - 1)
        counter_s <= counter_s + 1'd1;
                

    always@(posedge clk or negedge reset_n)
    if(!reset_n)
        led <= state_8[0];
    else
        case(counter_s)
        1:led <= state_8[1];
        2:led <= state_8[2];
        3:led <= state_8[3];
        4:led <= state_8[4];
        5:led <= state_8[5];
        6:led <= state_8[6];
        7:led <= state_8[7];
        0:led <= state_8[0];
        default : led <= led ;
        endcase
endmodule
 
  要注意 input [27:0]led_time  reg [27:0] counter;  位宽要一致

3.2 mode_4_tb

`timescale 1ns / 1ns

module mode_4_tb();
    reg clk;
      reg reset_n ;
    wire led ;

      reg [7:0]state_8 ;
      reg [27:0]led_time;
      mode_4 mode_4_tb_(.clk(clk) , .reset_n(reset_n) ,.state_8(state_8),
                          .led_time(led_time) ,  .led(led));


    initial clk = 1 ;        
    always #10 clk = ~ clk ;
    initial
        begin
            reset_n = 0 ;
            state_8 = 0;
            led_time = 0 ;
            #201;          
            led_time =
1250 ;
            state_8 = 8'b0101_1101;
            reset_n = 1 ;           
           
#10000001;
             led_time =
2500 ;
            state_8 = 8'b1001_1100;
           
#20000001;
            $stop;
        end
endmodule

  让我们看看今天摸鱼怪的错误又在哪里捏?٩( 'ω' )و 

        led_time = 1250 ;  #10000001;

        led_time = 2500 #20000001;

       1250 2500果然是精度问题  mode_4判定是led_time - 1 摸鱼怪肯定又写程1249、2499哩

         #10000001#20000001;  奇怪哩,这个为啥今天也有问题捏

      小声bb:摸鱼怪仿真发现led没反应,又觉得自己代码啥问题没有,结果是运行时间太短T_T

            led_time = 1250 ;
            state_8 = 8'b0101_1101;

         led_time = 2500 ;
         state_8 = 8'b1001_1100;

 4. mode_5  8个状态待指定 时间值待指定 多位led

4.1 mode_5

module mode_5(input clk , input reset_n , input [7:0]state_8A , input [7:0]state_8B ,
              input [27:0]led_time , output reg [1:0]led);
     //8个状态待指定  时间值待指定 两位led
    reg [27:0] counter;     
    always@(posedge clk or negedge reset_n)
    if(!reset_n)
        counter <= 0;
    else if(counter == led_time - 1)
        counter <= 0;
    else
        counter <= counter + 1'd1;
    
    reg [2:0] counter_s;    
     always@(posedge clk or negedge reset_n)
    if(!reset_n)
        counter_s <= 3'b000;
    else if(counter == led_time - 1)
        counter_s <= counter_s + 1'd1; 
   
    always@(posedge clk or negedge reset_n)
    if(!reset_n)
        begin led[1] <= state_8A[0];  led[0] <= state_8B[0];  end
    else
        case(counter_s)
        1:begin led[1] <= state_8A[1];  led[0] <= state_8B[1];  end
        2:begin led[1] <= state_8A[2];  led[0] <= state_8B[2];  end
        3:begin led[1] <= state_8A[3];  led[0] <= state_8B[3];  end
        4:begin led[1] <= state_8A[4];  led[0] <= state_8B[4];  end
        5:begin led[1] <= state_8A[5];  led[0] <= state_8B[5];  end
        6:begin led[1] <= state_8A[6];  led[0] <= state_8B[6];  end
        7:begin led[1] <= state_8A[7];  led[0] <= state_8B[7];  end
        0:begin led[1] <= state_8A[0];  led[0] <= state_8B[0];  end
        default: begin led[1] <= led[1];  led[0] <= led[0];  end 
        endcase
endmodule

  input [7:0]state_8A , input [7:0]state_8B 这里为什么不传入数组捏

  //因为摸鱼怪发现这个不支持Input 数组格式(因为会提示error)

  找到的方案是合并为一个一维向量,后边可以尝试一下٩( 'ω' )و 

4.2 mode_5_tb

`timescale 1ns / 1ns

module mode_5_tb();
    reg clk;
      reg reset_n ;
    wire [1:0]led ;

      reg [7:0]state_8A ;
      reg [7:0]state_8B ;
      reg [27:0]led_time;
      mode_5 mode_5_tb_(.clk(clk) , .reset_n(reset_n) , .state_8A(state_8A) ,                                         .state_8B(state_8B), .led_time(led_time) ,  .led(led));
    initial clk = 1 ;        
    always #10 clk = ~ clk ;
    initial
        begin
            reset_n = 0 ;
            state_8A = 0;state_8B = 0;            
            led_time = 0 ;
            #201;          
            led_time = 1250 ;
            state_8A = 8'b1111_0000;
            state_8B = 8'b1010_1010;
            reset_n = 1 ;           
            #10000001;
            $stop;
        end
endmodule

 //ok

5. mode_6  每10ms内:循环-停止

        //永远对题目有自己独特理解的摸鱼怪流下泪水

        07B 受控线性序列机课题的实现_哔哩哔哩_bilibili  //小梅哥视频

         //这个图的画法就是目标嗷٩( 'ω' )و 

        分析一下就是要定一个10ms里面执行一次mode_4

5.1 mode_6

module mode_6(input clk , input reset_n , input [7:0]state_8 , 
              input [27:0]led_time , output reg led);
    
    parameter time_one = 500000;//10ms
    reg [30:0] counter_time_one; 
       reg [27:0] counter; 
    
    
    always@(posedge clk or negedge reset_n)
    if(!reset_n)
        counter_time_one <= 0;    
    else if(counter_time_one == time_one - 1)
        counter_time_one <= 0;
    else
        counter_time_one <= counter_time_one + 1'd1;
        
    always@(posedge clk or negedge reset_n)
    if(!reset_n)
        counter <= 0;
    else if(counter_time_one == time_one - 1)
        counter <= 0;    
    else if(counter == led_time - 1)
        counter <= 0;
    else if(counter_time_one < led_time * 8 - 1 )
        counter <= counter + 1'd1;

    else 
        counter <= counter ;
        
     reg [2:0] counter_s;    
     always@(posedge clk or negedge reset_n)
    if(!reset_n)
        counter_s <= 3'b000;
    else if(counter == led_time - 1)
        counter_s <= counter_s + 1'd1;
                
    always@(posedge clk or negedge reset_n)
    if(!reset_n)
        led <= state_8[0];
    else
        case(counter_s)
        1:led <= state_8[1];
        2:led <= state_8[2];
        3:led <= state_8[3];
        4:led <= state_8[4];
        5:led <= state_8[5];
        6:led <= state_8[6];
        7:led <= state_8[7];
        0:led <= state_8[0];
        default : led <= led ;
        endcase    
        
        
endmodule

     counter_time_one 优先于 counter

5.2 mode_6 _tb

`timescale 1ns / 1ns

module mode_6_tb();
      reg clk;
      reg reset_n ;
      wire led ;

      reg [7:0]state_8 ;
      reg [27:0]led_time;
      mode_6 #(.time_one(50000))
             mode_6_tb_(.clk(clk) , .reset_n(reset_n) ,.state_8(state_8),
                          .led_time(led_time) ,  .led(led));
    initial clk = 1 ;        
    always #10 clk = ~ clk ;
    initial
        begin
            reset_n = 0 ;
            state_8 = 0;        
            led_time = 0 ;
            #201;          
            led_time = 1250 ;
            state_8 = 8'b1010_0110;
            reset_n = 1 ;           
            #10000001;
            $stop;
        end
endmodule

 //ok

6. mode_6_2  含EN

        根据小梅哥视频进行修改

        添加使能EN

6.1 mode_6_2

module mode_6_2(input clk , input reset_n , input [7:0]state_8 , 
              input [27:0]led_time , output reg led);
    // 周期10ms EN=1 led启动一次循环  EN=0 led 停止
    parameter time_one = 500000;//10ms
    reg [30:0] counter_time_one; 
    reg [27:0] counter; 
    reg [2:0] counter_s;  
    reg EN ;
    
    // 10ms counter_time_one
    always@(posedge clk or negedge reset_n)
    if(!reset_n)
        counter_time_one <= 0;    
    else if(counter_time_one == time_one - 1)
        counter_time_one <= 0;
    else
        counter_time_one <= counter_time_one + 1'd1;
    //EN
    always@(posedge clk or negedge reset_n)
    if(!reset_n)
        EN <= 1;    
    else if(counter_time_one == time_one - 1 || counter_time_one < led_time * 8 - 1)
        EN <= 1;  
    else 
        EN <= 0; 

    //counter
     always@(posedge clk or negedge reset_n)
    if(!reset_n)
        counter <= 0;    
    else if(EN)
        if(counter == led_time - 1)
            counter <= 0; 
        else
            counter <= counter + 1'd1;
    else     
        counter <= 0;   
    //counter_s
    always@(posedge clk or negedge reset_n)
    if(!reset_n)
        counter_s <= 0;
    else if(EN)
        begin
             if(counter == led_time - 1)
                counter_s <= counter_s + 1'd1;
        end    
    else counter_s <= 0;
        
     always@(posedge clk or negedge reset_n)
    if(!reset_n)
        led <= state_8[0];
    else if(EN)  
        case(counter_s)
        0:led <= state_8[0];
        1:led <= state_8[1];
        2:led <= state_8[2];
        3:led <= state_8[3];
        4:led <= state_8[4];
        5:led <= state_8[5];
        6:led <= state_8[6];
        7:led <= state_8[7];
        default : led <= led ;
        endcase
    else 
        led <= state_8[0];
endmodule

else if(counter_time_one == time_one - 1 || counter_time_one < led_time * 8 - 1)
        EN <= 1;  

        counter_time_one == time_one - 1  少这个的话state_8[0]的时长错误

6.2 mode_6_2_tb

`timescale 1ns / 1ns

module mode_tb();
    reg clk;
    reg reset_n ;
    wire led ;   
    reg [7:0]state_8 ;
    reg [27:0]led_time;
    mode_6_2 #(.time_one(20000))
              mode_6_2(.clk(clk) , .reset_n(reset_n) ,.state_8(state_8), 
                         .led_time(led_time) ,  .led(led));         
    initial clk = 1 ;        
    always #10 clk = ~ clk ;
    initial
        begin
            reset_n = 0 ;
            state_8 = 8'b1111_1110;        
            led_time = 0 ;
            #201;          
            led_time = 1250 ;
            reset_n = 1 ;           
            #2000001;
            $stop;
        end
endmodule

 //ok

//摸鱼结束٩( 'ω' )و 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值