案例和代码来自小梅哥课程,本人仅对知识点做做笔记,如有学习需要请支持官方正版。
该系列目录:
Verilog线性序列机点灯案例(一)
Verilog线性序列机点灯案例(二)
Verilog线性序列机点灯案例(三)
Verilog线性序列机点灯案例(四)
设计目标
我们的FPGA的时钟频率为50MHz,即每个周期20ns。
因此,在该时钟下时间和周期数的对应关系为:
| 持续时间 | 对应周期数 |
|---|---|
| 0.25s | 12,500,000 cycles |
| 0.5s | 25,000,000 cycles |
| 0.75s | 37,500,000 cycles |
| 1s | 50,000,000 cycles |
我们的目标是让LED以**【亮0.25秒->灭0.5秒->亮0.75秒->灭1秒】**的规律,持续循环闪烁。
设计思路

为了完成这样的规律性闪烁,需要一个计数器,计数满2.5秒归零,即:当上升沿采样到125,000,000-1时,计数器归零。
然后,led灯根据当前计数器的数值,设置led的亮灭,图中已经标注了led跳变时的counter数值。下面直接上代码
RTL 及 Testbench
led_ctrl1.v 是RTL代码
module led_ctrl1(
clk,
rst_n,
led_out
);
input clk;
input rst_n;
output reg led_out;
reg [26:0] counter;
//第一个always负责counter计数器的逻辑
always@(posedge clk or negedge rst_n) begin
if(!rst_n) begin
counter <= 0;
end else if(counter == 125_000_000-1) begin
counter <= 0;
end else begin
counter <= counter + 1;
end
end
//第二个always负责led_out闪烁的逻辑
//亮0.25s->灭0.5秒->亮0.75秒->灭1秒
always@(posedge clk or negedge rst_n) begin
if(!rst_n

本文介绍了如何使用Verilog设计一个FPGA电路,实现LED以亮0.25s-灭0.5s-亮0.75s-灭1s的周期性闪烁。原始设计存在仿真时间长和代码可读性差的问题,通过引入两个计数器和参数化时间,优化了代码并缩短了仿真时间。
最低0.47元/天 解锁文章
1767

被折叠的 条评论
为什么被折叠?



