前言
学习说明此文档为本人的学习笔记,注重实践,关于理论部分会给出相应的学习链接。
学习视频:是根据野火FPGA视频教程——第十七讲
https://www.bilibili.com/video/BV1nQ4y1Z7zN?p=3
实战演练
一、设计规划
1.1 实验目标
依次点亮板载4个LED灯,实现流水灯的效果,两灯之间点亮的间隔为0.5s,且一次点亮持续0.5s。
1.2 硬件资源
这里采用野火的升腾mini板进行实验
由原理图可知,led灯是高电平点亮
二、程序设计
2.1 波形图绘制
2.2 代码编写
module water_led
#(
parameter CNT_MAX = 25'd24_999_999
)
(
input wire sys_clk ,
input wire sys_rst_n,
output reg [3:0] led_out
);
reg [24:0] cnt;
reg cnt_flag;
always @(posedge sys_clk or negedge sys_rst_n)
if(sys_rst_n == 1'b0)
cnt <= 25'd0;
else if(cnt == CNT_MAX)
cnt <= 25'd0;
else
cnt <= cnt + 1'b1;
always @(posedge sys_clk or negedge sys_rst_n)
if(sys_rst_n == 1'b0)
cnt_flag <= 1'b0;
else if(cnt == CNT_MAX - 1'd1)
cnt_flag <= 1'b1;
else
cnt_flag <= 1'b0;
always@(posedge sys_clk or negedge sys_rst_n)
if(sys_rst_n == 1'b0)
led_out <= 4'b0001;
else if((cnt_flag == 1'b1) && (led_out == 4'b1000))
led_out <= 4'b0001;
else if((cnt_flag == 1'b1) && (led_out != 4'b1000))
led_out <= led_out << 1'b1; //左移补的是低电平
else
led_out <= led_out;
endmodule
三、逻辑仿真
3.1 仿真文件的编写
`timescale 1ns / 1ns
//
// Company: 追逐者——桥的小作坊
// Create Date: 2022/05/12 20:32:16
// Design Name: 流水灯实现
// Module Name: tb_water_led
//
module tb_water_led();
reg sys_clk ;
reg sys_rst_n;
wire [3:0] led_out;
initial begin
sys_clk = 1'b1;
sys_rst_n <= 1'b0;
#20
sys_rst_n <= 1'b1;
end
always #10 sys_clk = ~sys_clk;
water_led
#(
.CNT_MAX(25'd24)
)
water_led_inst
(
.sys_clk (sys_clk ),
.sys_rst_n(sys_rst_n),
.led_out (led_out )
);
endmodule
四、上板验证
4.1 管脚约束
Ctrl+s保存xdc文件,生成bit流文件
下载到板卡上可以发现4个灯有流水效果
五、总结
1
、
<<
(实现左移位功能的移位运算符)
知识点总结
1
、能够熟练根据时钟计算出任意精确计时所需要计数的个数;
2、掌握移位运算符的使用。