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); reg [36:0] counter ; //这里标红当然是因为跳过模拟直接上板发现有灯灯不亮啦 //当然是因为要注意位数!!!! |
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 |
//好啦,摸鱼结束啦(^_−)