FPGA学习笔记:Verilog利用计数器发生信号

这篇具有很好参考价值的文章主要介绍了FPGA学习笔记:Verilog利用计数器发生信号。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、实验内容

1.等占空比信号发生:计数器计时1ms,使LED灯每隔1ms状态翻转一次,实现LED灯闪烁,产生周期为2ms、占空比50%的方波信号;
2.非等占空比信号发生:计时器计时1.8ms,LED灯亮1ms,灭0.8ms,产生周期为1.8ms、非等占空比的方波信号;
3.序列型脉冲信号产生:生成1011010011的序列脉冲信号,每个脉冲信号时间为1us;

二、计数器最大值计算

当Rst_n复位信号被拉低时,计数值清零;复位信号被拉高时,计数器从0开始计数,在每个Clk时钟上升沿到来时自增1。
以50Mhz的系统时钟为例,时钟周期为20ns,即两个Clk时钟上升沿间隔为20ns,因此计数器每20ns计数一次。要实现1ms计时,则需要计数1ms/20ns=50000次,由于计数器从0开始计数,故1ms计时的计数器最大值为50000-1=49999。得出计数器最大值的计算公式:
计数器最大值 = 计数时间 / 系统时钟周期 − 1 计数器最大值=计数时间/系统时钟周期-1 计数器最大值=计数时间/系统时钟周期1

三、等占空比信号发生

1.单一信号发生

使LED灯每隔1ms状态翻转一次,产生周期为2ms的方波信号,代码如下:

module cntled(
	input Clk,			//系统时钟
	input Rst_n,		//系统复位
	output reg led		//LED端口
);
	reg [15:0] cnt;
	always@(posedge Clk or negedge Rst_n)
		if(!Rst_n)
			cnt <= 0;
		else if(cnt == 49999)//(49999+1)*20=1000000ns=1ms
			cnt <= 0;
		else
			cnt <= cnt + 1'b1;
	always@(posedge Clk or negedge Rst_n)
		if(!Rst_n)
			led <= 0;
		else if(cnt == 49999)
			led <= ~led;
endmodule

仿真文件:

`timescale 1ns/1ns
module cntled_tb();
	reg Clk,Rst_n;
	wire led;
	cntled cntled(
		.Clk(Clk),
		.Rst_n(Rst_n),
		.led(led)
	);
	initial Clk = 1;
	always #10 Clk = ~Clk;
	initial begin
		Rst_n = 0;
		#200;
		Rst_n = 1;
		#10000000;
		$stop;
	end
endmodule

仿真结果:
verilog计数器,FPGA学习笔记,fpga开发,学习,笔记

2.多个信号发生

三个LED灯,使其分别按1ms、500us、250us的速率翻转。
根据上述内容,计算出三个计数器的最大值分别为49999、24999、12499,为了实现多次调用模块,在代码中添加cnt_max,通过更改cnt_max改变计数器的计数时间,cnt_max可以设置为模块端口,也可以设置为全局常量,在此提供三种方法。

//cnt_max设置为模块端口
input [15:0] cnt_max;
//cnt_max设置为全局常量
parameter cnt_max = 49999;

在对计数器模块例化时,对cnt_max赋值,以改变计数器的计数时间,模块cntled1将cnt_max设置为端口,模块cntled2将cnt_max设置为全局常量,例化代码如下:

//方法1: 直接添加为模块端口
	cntled1 test0(
		.Clk(Clk),
		.Rst_n(Rst_n),
		.cnt_max(49_999),
		.led(led1)
	);
//方法2: 添加常量,在例化时对常量赋值	
	cntled2
		#(
		.cnt_max(24_999)
		)
	test1(
		.Clk(Clk),
		.Rst_n(Rst_n),
		.led(led2)
	);			
//方法3: 添加常量,在例化后对常量赋值
	cntled2 test2(
		.Clk(Clk),
		.Rst_n(Rst_n),
		.led(led3)
	);	
	defparam test2.cnt_max = 12_499;

仿真结果:
verilog计数器,FPGA学习笔记,fpga开发,学习,笔记

四、非等占空比信号发生

LED灯亮1ms,灭0.8ms,产生周期为1.8ms、非等占空比的方波信号,代码如下:

module cntled3(Clk,Rst_n,led);
	input Clk,Rst_n;
	output reg led;
	reg [16:0] cnt;
	always@(posedge Clk or negedge Rst_n)
		if(!Rst_n)
			cnt <= 0;
		else if(cnt == 89_999)	//1.8ms
			cnt <= 0;
		else
			cnt <= cnt + 1'b1;
	always@(posedge Clk or negedge Rst_n)
		if(!Rst_n)
			led <= 0;
		else if(cnt < 50_000)	//1ms
			led <= 0;
		else					//0.8ms
			led <= 1;		
endmodule

仿真结果:
verilog计数器,FPGA学习笔记,fpga开发,学习,笔记

五、序列型脉冲信号产生

生成1011010011的序列脉冲信号,每个脉冲信号时间为1us。
共10个脉冲信号,故设置计数时间为10us,用序列机判断cnt的计数值,每计50个数时更改信号的输出值,即在cnt为0、49、99、149、199、249、299、349、399、449时更改信号的输出值;cnt为其它数值时,输出信号保持不变。代码如下:

module cntled4(Clk,Rst_n,led);
	input Clk,Rst_n;
	output reg led;
	reg [16:0] cnt;
	always@(posedge Clk or negedge Rst_n)
		if(!Rst_n)
			cnt <= 0;
		else if(cnt == 499)//10us
			cnt <= 0;
		else
			cnt <= cnt + 1'b1;
	always@(posedge Clk or negedge Rst_n)
		if(!Rst_n)
			led <= 0;
		else
			case(cnt)
				0:led <= 1;
				49:led <= 0;
				99:led <= 1;
				199:led <= 0;
				249:led <= 1;			
				299:led <= 0;
				399:led <= 1;
				default:led <= led;
			endcase
endmodule

仿真结果:
verilog计数器,FPGA学习笔记,fpga开发,学习,笔记文章来源地址https://www.toymoban.com/news/detail-835854.html

到了这里,关于FPGA学习笔记:Verilog利用计数器发生信号的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Verilog语言实现FPGA上的计数器

    Verilog语言实现FPGA上的计数器 计数器是数字电路中经常使用的基本元素之一,它用于生成指定脉冲数量或者指定计数范围内的计数信号。在现代数字电路设计中,FPGA(Field Programmable Gate Array)作为一种可编程逻辑器件被广泛应用,可以通过Verilog语言来实现计数器模块。 在V

    2024年02月05日
    浏览(35)
  • FPGA开发] 使用Verilog实现一个简单的计数器

    计数器是数字电路中常见的元件之一,它能够按照一定的规律进行计数。在FPGA开发中,我们可以使用硬件描述语言Verilog来实现一个简单的计数器。本文将为您详细介绍如何使用Verilog编写一个基于FPGA的计数器,并提供相应的源代码。 首先,我们需要定义计数器的功能和规格

    2024年02月03日
    浏览(45)
  • 【FPGA】Verilog:时序电路设计 | 自循环移位寄存器 | 环形计数 | 扭环计数 | 约翰逊计数器

    前言: 本章内容主要是演示Vivado下利用Verilog语言进行电路设计、仿真、综合和下载 示例:计数器   ​​ 功能特性: 采用 Xilinx Artix-7 XC7A35T芯片  配置方式:USB-JTAG/SPI Flash 高达100MHz 的内部时钟速度  存储器:2Mbit SRAM   N25Q064A SPI Flash(样图旧款为N25Q032A) 通用IO:Switch :

    2024年02月10日
    浏览(59)
  • 基于FPGA的四位数码管显示按键计数器设计(verilog编程)

    软件:Vivado 2022.2 硬件:BASYS 3 设计描述:通过开发板上的四个按键,按下一次记数加一,分别由四个数码管从左到右分别显示四个按键记数情况。 例: 1.初始值为0000,意为无记数 2.当按下第一个按键,记数加一,数码管显示1000 3.再次按下一第一个按键,记数加一,数码管显

    2024年02月08日
    浏览(38)
  • (数字逻辑笔记)用Verilog实现4位计数器。(时序逻辑)

    实验描述: 输入: Clock:如果计数器enable信号为1,那么在时钟上升沿,count加1 Enable:如果enable为1,那么在时钟上升沿,count加1;如果enable为0,count保持不变 Reset:重置信号,如果reset为0,count重置为0 输出: Count[3:0]:4位计数信号,范围:4‘b0000 – 4’b1111 实现代码: Tes

    2024年02月11日
    浏览(33)
  • 北邮22级信通院数电:Verilog-FPGA(9)第九周实验(3)实现一个具有清零功能的按键计数器,对按键进行计数并显示

    北邮22信通一枚~ 跟随课程进度更新北邮信通院数字系统设计的笔记、代码和文章 持续关注作者 迎接数电实验学习~ 获取更多文章,请访问专栏: 北邮22级信通院数电实验_青山如墨雨如画的博客-CSDN博客   目录 一.代码部分 1.1 counter.v 1.2 debounce.v 二.管脚分配 三.实现效果

    2024年02月05日
    浏览(47)
  • 【FPGA零基础学习之旅#7】BCD计数器设计

    🎉欢迎来到FPGA专栏~BCD计数器设计 ☆* o(≧▽≦)o *☆ 嗨 ~我是 小夏与酒 🍹 ✨ 博客主页: 小夏与酒的博客 🎈该系列 文章专栏: FPGA学习之旅 文章作者技术和水平有限,如果文中出现错误,希望大家能指正🙏 📜 欢迎大家关注! ❤️ 顶层模块中的BCD模块级联: Verilog实现

    2024年02月08日
    浏览(38)
  • 【FPGA零基础学习之旅#6】ip核基础知识之计数器

    🎉欢迎来到FPGA专栏~ip核基础知识之计数器 ☆* o(≧▽≦)o *☆ 嗨 ~我是 小夏与酒 🍹 ✨ 博客主页: 小夏与酒的博客 🎈该系列 文章专栏: FPGA学习之旅 文章作者技术和水平有限,如果文中出现错误,希望大家能指正🙏 📜 欢迎大家关注! ❤️ LPM_COUNTER IP核 的RTL视图: IP核

    2024年02月09日
    浏览(35)
  • 北邮22级信通院数电:Verilog-FPGA(11)第十一周实验(1)用JK触发器实现8421码十进制计数器

    北邮22信通一枚~ 跟随课程进度更新北邮信通院数字系统设计的笔记、代码和文章 持续关注作者 迎接数电实验学习~ 获取更多文章,请访问专栏: 北邮22级信通院数电实验_青山如墨雨如画的博客-CSDN博客 目录 一.代码部分 1.1  JK_8421.v 1.2  JK_ff.v 1.3  debounce.v 二.管脚分配 三.实

    2024年02月05日
    浏览(37)
  • verilog计数器

    (1) 深入了解计数器原理 (2) 学习使用 Verilog 实现同步计数器 ( 模八) 计数器的功能是记忆脉冲个数,它是数字系统中应用最为广泛的时序逻辑构件。 下图为设计 计数器从0开始每隔25_000_000个时钟周期(0.25秒)数码管末位显示加一,最大值为7,7后复0值              这

    2024年02月05日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包