-
目标:实现LED 1s为周期闪烁
-
创建工程以及仿真步骤不再赘述,详见上一篇 FPGA学习第二课 这里直接给出代码和结果
-
首先写一下学习本课所遇到的问题
(1)注意宏定义语法 ,后面没有分号
(2)无论是代码文件还是testbench文件,module名称都必须和文件名一致,否则会报错
代码文件
- counter_LED_flash.v
/*
Env AC620
Quartus II
*/
// 设计输入
module counter_LED_flash(clk50M, Rst_n, led); // 时序逻辑
input clk50M; // 系统时钟 50M
input Rst_n; // 全局复位 低电平复位
output reg led; // LED 寄存器类型的输出
reg [24:0]cnt;// 定义寄存器 用来保存计数器个数 计算好位宽 25位 25_000_000
// 计数器进程
always@(posedge clk50M or negedge Rst_n) // 以系统时钟的上升沿作为计数信号,按键的下降沿作为复位信号
if(Rst_n == 1'b0) // 按键默认是高电平 按下后是低电平
cnt <= 25'd0; // d表示十进制 25表示位宽 结果:清零cnt
else if(cnt == 25'd24_999_999) // 0-it 再来一个上升沿 回到零
cnt <= 25'd0;
else
cnt <= cnt + 1'b1; // 否则+1
// LED Toggle Process
always@(posedge clk50M or negedge Rst_n)
if(Rst_n == 1'b0) // 按下复位
led = 1'b1; // 按下输出高电平
else if(cnt == 25'd24_999_999)
led <= ~led; // Toggle
else
led <= led;
endmodule
- testbench文件
counter_LED_flash_tb.v
// 第一句话 声明仿真步进、精度
`timescale 1ns/1ns
`define clock_period 20 // 时钟周期
module counter_LED_flash_tb;
// 激励信号源
reg clk;
reg rst_n;
wire led;
// 添加待测试模块 例化
// 将端口与激励信号源连接
counter_LED_flash counter0(
.clk50M(clk),
.Rst_n(rst_n),
.led(led)
);
initial clk = 1;
always
#(`clock_period / 2)
clk = ~clk; // 仿真时钟信号 `表示使用宏定义的量
initial begin
rst_n = 1'b0; // 一开始复位键是按下的(低电平)
#(`clock_period*200);
rst_n = 1'b1;
// 延时几秒
#2000_000_000;
$stop;
end
endmodule
-
仿真结果
缩放一下,可以看出最后一行LED的翻转
-
下载到开发板
首先plan一下引脚,这里参考不同开发板的定义即可
示例:小梅哥AC620
修改完后,注意要全编译一下下载后,会发现对应的LED闪烁…
- 参考&致谢
小梅哥FPGA