FPGA-VIVADO学习三:时序逻辑之D触发器和计数器实现LED灯闪烁
verilog代码以及仿真实现
·
原理详解
D触发器
CK是时钟,Q是输出。


我理解的D触发器就是当CK出现上升沿时,D触发器就会读取输入的值进行存储或者输出。
计数器

add是加法器,当每次CK到达上升沿则+1。
Verilog实现
低电平有效的复位信号。
因为CNT_MAX=T/Tclk,接着查看技术手册


有源晶振33.333333MHz ,那么周期就是30ns=Tclk(系统周期)
T=500ms要实现500ms的LED灯闪烁
500*1000*1000/30ns=16,666,666.666666
T=600ms要实现600ms的LED灯闪烁
600*1000*1000/30ns=20_000_000

看二进制定义位宽reg [24:0]counter;
module led_twinkle(
Clk,
Reset_n,
Led
);
input Clk;
input Reset_n;
output reg Led;
reg [24:0]counter;
always@(posedge Clk or negedge Reset_n)
if(!Reset_n)
counter<=0;
else if (counter==16666666)//25000000
counter<=0;
else
counter<=counter+1'd1;
always@(posedge Clk or negedge Reset_n)
if(!Reset_n)
Led<=1'b0;
else if(counter==16666666)
Led<=!Led;
endmodule
仿真代码:
`timescale 1ns / 1ns
module led_twinkle_tb( );
reg Clk;
reg Reset_n;
wire Led;
led_twinkle led_twinkle_inst0(
.Clk(Clk),
.Reset_n(Reset_n),
.Led(Led)
);
initial Clk=1;
always #15 Clk=~Clk;
initial begin
Reset_n=0;
#301;
Reset_n=1;
#2000_000_000;
$stop;
end
endmodule

板块验证
按键按下做复位信号



接着根据上图配置IO口生成比特流就可以看到LED灯闪烁了

在这里实际闪烁不是500ms,问题应该是我前面把33.333333MHz当作频率了,实际应该用50MHz。
火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。
更多推荐
所有评论(0)