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 [7:0]state_8 ;
|
让我们看看今天摸鱼怪的错误又在哪里捏?٩( 'ω' )و 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 [7:0]state_8A ; |
//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 [7:0]state_8 ; |
//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 , |
else if(counter_time_one == time_one - 1 || counter_time_one < led_time * 8 - 1) counter_time_one == time_one - 1 少这个的话state_8[0]的时长错误 |
6.2 mode_6_2_tb
`timescale 1ns / 1ns module mode_tb(); |
//ok |
//摸鱼结束٩( 'ω' )و