FPGA学习第三课 使用计数器

  • 目标:实现LED 1s为周期闪烁

  • 创建工程以及仿真步骤不再赘述,详见上一篇 FPGA学习第二课 这里直接给出代码和结果

  • 首先写一下学习本课所遇到的问题
    (1)注意宏定义语法 ,后面没有分号
    (2)无论是代码文件还是testbench文件,module名称都必须和文件名一致,否则会报错

代码文件

  1. 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
  1. 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
  1. 仿真结果
    FPGA学习第三课 使用计数器_第1张图片
    缩放一下,可以看出最后一行LED的翻转
    FPGA学习第三课 使用计数器_第2张图片

  2. 下载到开发板
    首先plan一下引脚,这里参考不同开发板的定义即可
    FPGA学习第三课 使用计数器_第3张图片
    示例:小梅哥AC620
    FPGA学习第三课 使用计数器_第4张图片
    修改完后,注意要全编译一下

    下载后,会发现对应的LED闪烁…
    FPGA学习第三课 使用计数器_第5张图片

  • 参考&致谢
    小梅哥FPGA

你可能感兴趣的:(#,FPGA,fpga)