FPGA学习(4)-时序逻辑电路实现D触发器与计数器,LED灯闪烁

1.实现原理

开发板的频率为50MHz,即一个周期为20ns,实现500ms一次翻转,即计数25_000_000次。每次时钟沿来一次,就计一次。

2. 新建工程

2.1源文件代码

在下面=左边的变量值要变的,就用reg。不涉及的缺省;不加位宽默认为10进制;always后面要跟完整,才不会报错;注意格式用法 reg [24:0]counter,数据类型声明格式。

复制代码
module led_light(
    reset,
    clk,
    led
    );
    
    input reset;
    input clk;
    output reg led;
    reg [24:0]counter;
    
    always@(posedge clk or negedge reset)
    if(!reset)
    counter<=0;
    else if (counter == 25_000_000)
    counter<=0;
    else
    counter<=counter+1'd1;
    
    always@(posedge clk or negedge reset)
    if(!reset)
    led<=1'b0;
    else if(counter == 25_000_000)
    led<=!led;
    
    
endmodule

点开schematic,可看相关电路图。

2.2添加仿真文件

关于复位信号延时201ns,视频说怕与时钟信号产生冲突,clk的上升沿与复位信号之间的冲突,这点我不是很理解;begin与end必须配套使用;仿真函数名不能与源函数名同名。

复制代码
`timescale 1ns / 1ns
module led_light_tb();
reg clk;
reg reset;
wire led;
led_light led_light(
    .reset(reset),
    .clk(clk),
    .led(led)
);


initial clk=1;
always #10 clk=~clk;

initial begin
    reset =0;
    #201;
    reset=1;
    #2_000_000_000;
    $stop;
end
endmodule

点击simulation,观察仿真波形。vivado仿真中默认1ms,点击这个符号让仿真时间延长到程序中所仿真的时间。

点击led选中,然后上面的+图标是增加一根标注线,选中后,点击左箭头图标,标注线会位于测量起始信号位置,再加一根,弄在右边,点击第一根上面的数字,即可测量信号宽度。

2.3 其他步骤

跟之前的一样进行程序烧录。

2.4实验现象

板子上的LED灯按照程序设定时间闪烁,但按复位键没用。

相关推荐
海底的星星fly14 分钟前
【Prompt学习技能树地图】生成知识提示技术的深度解析与应用
人工智能·学习·prompt
槿花Hibiscus33 分钟前
C++基础:Reactor模型设计思想与muduo架构理解
学习
straw_hat.1 小时前
32HAL——RTC时钟
stm32·学习
知识分享小能手3 小时前
jQuery 入门学习教程,从入门到精通, jQuery在HTML5中的应用(16)
前端·javascript·学习·ui·jquery·html5·1024程序员节
吃个糖糖3 小时前
Pytorch 学习之Transforms
人工智能·pytorch·学习
常常不爱学习3 小时前
Vue3 + TypeScript学习
开发语言·css·学习·typescript·html
CandyU24 小时前
UE5 C++ 进阶学习 小知识点 —— 01 - 本地化语言
学习·ue5
武陵悭臾4 小时前
Python应用开发学习: Pygame 中实现数字水平靠右对齐和垂直靠底对齐
python·学习·程序人生·游戏·个人开发·学习方法·pygame
Tonya434 小时前
测开学习DAY26
学习
水月wwww5 小时前
vue学习之组件与标签
前端·javascript·vue.js·学习·vue