【FPGA零基础学习之旅#5】产生非等占空比信号

news2024/11/26 16:21:31

🎉欢迎来到FPGA专栏~产生非等占空比信号


  • ☆* o(≧▽≦)o *☆~我是小夏与酒🍹
  • 博客主页:小夏与酒的博客
  • 🎈该系列文章专栏:FPGA学习之旅
  • 文章作者技术和水平有限,如果文中出现错误,希望大家能指正🙏
  • 📜 欢迎大家关注! ❤️
    FPGQ2

CSDN

🎉 产生非等占空比信号

  • 一、效果演示
    • 🥝等占空比信号
    • 🥝非等占空比信号
  • 二、等占空比信号的产生
  • 三、非等占空比信号的产生
  • 四、小项目
    • 🔸项目一
    • 🔸项目二

遇见未来

一、效果演示

🥝等占空比信号

1S亮灭

🥝非等占空比信号

亮0.2秒
同时进行

二、等占空比信号的产生

我们通过LED的亮灭来展现等占空比信号:LED循环亮灭,亮1秒,灭1秒。

50MHz的晶振,要实现1秒的定时,需要计数49_999_999次,RTL视图展示如下:
RTL1

Verilog HDL代码:

/
//模块作用:led亮一秒灭一秒
//作者:CSDN-小夏与酒

module led_plus1(
	input 			Clk,
	input 			Rst_n,
	output 	reg	led	
);
	
	reg [25:0]cnt;
	
	parameter cnt_max = 26'd49_999_999;
	
	always@(posedge Clk or negedge Rst_n)begin
		if(!Rst_n)
			cnt <= 26'd0;
		else if(cnt == cnt_max)
			cnt <= 26'd0;
		else 
			cnt <= cnt + 1'b1;
	end 
	
	always@(posedge Clk or negedge Rst_n)begin 
		if(!Rst_n)
			led <= 1'b1;
		else if(cnt == cnt_max)
			led <= ~led;
		else 
			led <= led;	
	end 
	
endmodule

测试激励文件代码:

`timescale 1ns/1ns
`define clock_period 20

module led_plus1_tb;
	
	reg Clk;
	reg Rst_n;
	
	wire led;
	
	led_plus Uled_plus1_0(
		.Clk(Clk),
		.Rst_n(Rst_n),
		.led(led)	
	);
	
	initial Clk = 1;
	always #(`clock_period/2) Clk = ~Clk;
	
	initial begin 
	Rst_n = 1;
	
	#100 Rst_n = 0;
	
	#(`clock_period*1000000);
	
	$stop;
		
	end

endmodule

三、非等占空比信号的产生

我们通过LED的亮灭来展现等占空比信号:LED循环亮灭,亮0.2秒,灭1.8秒。

实现的基本思路:当计时器从0开始计时到0.2秒的过程中,LED点亮;当计时器从0.2秒之后计时到2秒的过程中,LED熄灭;当计时器达到2秒时,计数清空。

50MHz的晶振,要实现0.2秒的定时,需要计数9_999_999次;要实现2秒的定时,需要计数99_999_999次,RTL视图展示如下:
RTL2
Verilog HDL代码:

/
//模块作用:led亮0.2秒,灭1.8秒
//作者:CSDN-小夏与酒

module led_plus2(
	input 			Clk,
	input 			Rst_n,
	output 	reg	led	
);
	
	reg [26:0]cnt;
	
	parameter cnt_max = 27'd99_999_999;
	parameter cnt_ON = 27'd0;
	parameter cnt_OFF = 27'd9_999_999;
	
	always@(posedge Clk or negedge Rst_n)begin
		if(!Rst_n)
			cnt <= 27'd0;
		else if(cnt == cnt_max)
			cnt <= 27'd0;
		else 
			cnt <= cnt + 1'b1;
	end 
	
	always@(posedge Clk or negedge Rst_n)begin 
		if(!Rst_n)
			led <= 1'b1;
		else if(cnt == cnt_ON)
			led <= 1'b0;
		else if(cnt == cnt_OFF)
			led <= ~led;
		else 
			led <= led;	
	end 
	
endmodule

测试激励文件代码:

`timescale 1ns/1ns
`define clock_period 20

module led_plus2_tb;
	
	reg Clk;
	reg Rst_n;
	
	wire led;
	
	led_plus Uled_plus2_0(
		.Clk(Clk),
		.Rst_n(Rst_n),
		.led(led)	
	);
	
	initial Clk = 1;
	always #(`clock_period/2) Clk = ~Clk;
	
	initial begin 
	Rst_n = 1;
	
	#100 Rst_n = 0;
	
	#(`clock_period*1000000000);
	
	$stop;
		
	end

endmodule

产生非等占空比信号的思路:规定一个时间段,然后把这个时间段分成不同时间长度的小时间段,在各个小时间段里进行不同的操作。如上述代码,规定一个LED闪烁周期为2秒,前0.2秒点亮,后1.8秒熄灭。而在等占空比信号的产生中,规定一个LED闪烁周期为2秒,前1秒点亮,后1秒熄灭。

为了更直观地看到不同占空比信号的效果,将上述代码整理并加入到顶层文件中:

/
//模块作用:信号占空比顶层文件
//作者:CSDN-小夏与酒

module led_plus(
	input 	Clk,
	input 	Rst_n,
	output 	led1,	
	output 	led2
);
	
	led_plus1 Uled_plus1(
	.Clk(Clk),
	.Rst_n(Rst_n),
	.led(led1)	
	);
	
	led_plus2 Uled_plus2(
	.Clk(Clk),
	.Rst_n(Rst_n),
	.led(led2)	
	);	
	
endmodule

RTL视图:
RTL3

其中,为了更好地理解本次项目的内容,led_plus1模块中也使用2秒为一个周期,前一秒LED亮,后一秒LED灭,写法思路和前述代码相同:

/
//模块作用:led亮一秒灭一秒
//作者:CSDN-小夏与酒

module led_plus1(
	input			Clk,
	input			Rst_n,
	output	reg		led	
);
	
	reg [26:0]cnt;
	
	parameter cnt_max = 27'd99_999_999;
	parameter cnt_ON = 27'd0;
	parameter cnt_OFF = 27'd49_999_999;
	
	always@(posedge Clk or negedge Rst_n)begin
		if(!Rst_n)
			cnt <= 27'd0;
		else if(cnt == cnt_max)
			cnt <= 27'd0;
		else 
			cnt <= cnt + 1'b1;
	end 
	
	always@(posedge Clk or negedge Rst_n)begin 
		if(!Rst_n)
			led <= 1'b1;
		else if(cnt == cnt_ON)
			led <= 1'b0;
		else if(cnt == cnt_OFF)
			led <= ~led;
		else 
			led <= led;	
	end 
	
endmodule

使用上述代码编写led_plus1模块得到的RTL视图如下:
新编写的模块

led_plus2模块的代码没有变化:

/
//模块作用:led亮0.2秒,灭1.8秒
//作者:CSDN-小夏与酒

module led_plus2(
	input 			Clk,
	input 			Rst_n,
	output 	reg	led	
);
	
	reg [26:0]cnt;
	
	parameter cnt_max = 27'd99_999_999;
	parameter cnt_ON = 27'd0;
	parameter cnt_OFF = 27'd9_999_999;
	
	always@(posedge Clk or negedge Rst_n)begin
		if(!Rst_n)
			cnt <= 27'd0;
		else if(cnt == cnt_max)
			cnt <= 27'd0;
		else 
			cnt <= cnt + 1'b1;
	end 
	
	always@(posedge Clk or negedge Rst_n)begin 
		if(!Rst_n)
			led <= 1'b1;
		else if(cnt == cnt_ON)
			led <= 1'b0;
		else if(cnt == cnt_OFF)
			led <= ~led;
		else 
			led <= led;	
	end 
	
endmodule

实现效果:
实现效果

四、小项目

把握对定时器的理解和掌握非等占空比信号的产生方法。

在这部分加入两个小项目:使用产生非等占空比信号的思路实现两种类型的流水灯。

🔸项目一

具体要求:流水灯的循环周期为2.5秒,四个LED灯在最初时刻全部点亮,以从左到右或者从右到左的顺序,四个LED灯以0.5秒为间隔依次熄灭。
实现效果:
项目一

项目代码:
📜写法一:

/
//led_prj_01
//CSDN-小夏与酒
/
module led_prj_01(
	input 		Clk,
	input 		Rst_n,
	output reg [3:0]led
);

	reg [26:0]cnt;
	
	parameter cnt_max = 27'd124_999_999;
	parameter cnt_period = 27'd24_999_999;
	
	always@(posedge Clk or negedge Rst_n)begin
		if(!Rst_n)
			cnt <= 27'd0;
		else if(cnt == cnt_max)
			cnt <= 27'd0;
		else 
			cnt <= cnt + 1'b1;
	end
		
	always@(posedge Clk or negedge Rst_n)begin 
		if(!Rst_n)
			led <= 4'b0000;
		else if(cnt == 1*cnt_period)
			led <= 4'b1000;
		else if(cnt == 2*cnt_period)
			led <= 4'b1100;
		else if(cnt == 3*cnt_period)
			led <= 4'b1110;
		else if(cnt == 4*cnt_period)
			led <= 4'b1111;
		else if(cnt == 5*cnt_period)
			led <= 4'b0000;
		else 
			led <= led;
	end 

endmodule

对应的RTL视图:
RTL1
📜写法二:

/
//led_prj_01
//CSDN-小夏与酒
/
module led_prj_01(
	input 		Clk,
	input 		Rst_n,
	output reg [3:0]led
);

	reg [26:0]cnt;
	
	parameter cnt_max = 27'd124_999_999;
	parameter cnt_period = 27'd24_999_999;
	
	always@(posedge Clk or negedge Rst_n)begin
		if(!Rst_n)
			cnt <= 27'd0;
		else if(cnt == cnt_max)
			cnt <= 27'd0;
		else 
			cnt <= cnt + 1'b1;
	end
	
	always@(posedge Clk or negedge Rst_n)begin 
		if(!Rst_n)
			led <= 4'b0000;
		else begin
			case(cnt)
				1*cnt_period:led <= 4'b1000;
				2*cnt_period:led <= 4'b1100;
				3*cnt_period:led <= 4'b1110;
				4*cnt_period:led <= 4'b1111;
				5*cnt_period:led <= 4'b0000;
				default:led <= led;
			endcase	
		end
	end 

endmodule

对应的RTL视图:
RTL2

注意:
通过上述项目可以看出,if-else语句和case语句虽然可以实现相同的功能,但是它们的RTL视图却是不一样的,即if-else语句和case语句在底层逻辑的实现上是存在差异的,并且case语句的优化效果更好。

🔸项目二

具体要求:流水灯的循环周期为3秒,四个LED灯在最初时刻全部熄灭,以从左到右或者从右到左的顺序,四个LED灯分别以0.25秒0.5秒0.75秒1秒为间隔依次点亮,全部点亮后持续0.25秒
实现效果:
项目二

项目代码:

/
//led_prj_02
//CSDN-小夏与酒
/
module led_prj_02(
	input 		Clk,
	input 		Rst_n,
	output reg [3:0]led
);
	
	reg [27:0]cnt;
	
	parameter cnt_max = 28'd149_999_999;
	parameter cnt_period = 28'd12_499_999;
	
	always@(posedge Clk or negedge Rst_n)begin
		if(!Rst_n)
			cnt <= 28'd0;
		else if(cnt == cnt_max)
			cnt <= 28'd0;
		else 
			cnt <= cnt + 1'b1;
	end
	
	always@(posedge Clk or negedge Rst_n)begin 
		if(!Rst_n)
			led <= 4'b1111;
		else begin
			case(cnt)
				1*cnt_period:led <= 4'b0111;
				3*cnt_period:led <= 4'b0011;
				6*cnt_period:led <= 4'b0001;
				10*cnt_period:led <= 4'b0000;
				11*cnt_period:led <= 4'b1111;
				default:led <= led;
			endcase	
		end
	end

endmodule

对应的RTL视图:
RTLPRJ2

csdn

🧸结尾


  • ❤️ 感谢您的支持和鼓励! 😊🙏
  • 📜您可能感兴趣的内容:
  • 【FPGA-Spirit_V2】基于FPGA的循迹小车-小精灵V2开发板
  • 【Go黑帽子】使用Golang编写一个TCP扫描器(高级篇)
  • 【Arduino TinyGo】【最新】使用Go语言编写Arduino-环境搭建和点亮LED灯
  • 【全网首发开源教程】【Labview机器人仿真与控制】Labview与Solidworks多路支配关系-四足爬行机器人仿真与控制
    遇见未来

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/525256.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

字节跳动 测试开发工程师 面试总结,小伙伴可以参考一下

目录 一面 二面 三面 个人总结&#xff1a; 一面 自我介绍 操作系统 虚拟内存的概念 进程和线程 线程同步 如何实现线程同步 计算机网络 说一下TCP 为什么是四次挥手呢 说一个ip地址&#xff0c;如果第一字节是269行不行 说一下HTTP&#xff08;自己讲了GET POST&…

[abc复盘] abc301 20230514

[abc复盘] abc301 20230514 总结A - Overall Winner1. 题目描述2. 思路分析3. 代码实现 B - Fill the Gaps1. 题目描述2. 思路分析3. 代码实现 C - AtCoder Cards1. 题目描述2. 思路分析3. 代码实现 D - Bitmask1. 题目描述2. 思路分析3. 代码实现 E - Pac-Takahashi1. 题目描…

Azure描述云服务类型

Azure描述云服务类型 基础结构即服务&#xff08;IaaS&#xff09;共担责任模型方案 介绍平台即服务&#xff08;PaaS&#xff09;共担责任模型方案 描述软件即服务&#xff08;SaaS&#xff09;共担责任模型方案 描述责任共担模型知识检查题目 基础结构即服务&#xff08;IaaS…

pyqt实现文件批量操作

代码逻辑 https://download.csdn.net/download/Lynqwest/87783077 文件打包 一、安装UPX 在https://github.com/upx/upx/releases/tag/v3.96下载相关版本&#xff0c;该网址无法进入&#xff0c;可参考https://download.csdn.net/download/Lynqwest/87783084 下载后将 upx…

谓词逻辑与推理演算

谓词逻辑 辖域 变元的约束—换自由变元 不容易出错 枚举 前束范式 量词例子 全称量词 ( ∀ x ) 条件前件加入 → (\forall x) 条件前件加入 \to (∀x)条件前件加入→ 存在量词 ( ∃ x ) 和取式 ∧ (\exists x) 和取式 \wedge (∃x)和取式∧ ∀ x P ( x ) ⟺ ∃ x P ( x ) \…

Mac M2芯片免安装版mysql

文章目录 1、下载mysql安装包2、移动解压目录并授权3、初始化mysql4、启动mysql5、启动错误处理6、登录mysql7、重置mysql密码 1、下载mysql安装包 先看一下本机mac信息 左上角&#xff0c;单机苹果的logo&#xff0c;然后单击“关于本机”&#xff0c;可以看到当前mac的信息 …

【JAVA进阶】Set集合、Map集合

&#x1f4c3;个人主页&#xff1a;个人主页 &#x1f525;系列专栏&#xff1a;JAVASE基础 目录 一、Set系列集合 1.HashSet 2.LinkedHashSet 3.TreeSet 二、补充知识 1.可变参数 2.集合工具类Collections 三、Map集合体系 1.Map集合的概述 2.Map集合体系特点 3.Map…

mybatis plus自动生成代码(代码生成器)

参考 05_尚硅谷_搭建项目环境&#xff08;代码生成器&#xff09;_哔哩哔哩_bilibili 调用mp的AutoGenerator可以生成代码&#xff0c;就像java脚本一样&#xff0c;运行即可生成 要求代码生成器脚本不用会写&#xff0c;会修改其中条项生成我们预期的代码即可。 项目整体结构…

前端 之 FormData对象浅谈

一、简介 ​ 通常情况下&#xff0c;前端在使用post请求提交数据的时候&#xff0c;请求都是采用application/json 或 application/x-www-form-urlencoded编码类型&#xff0c;分别是借助JSON字符串来传递参数或者keyvalue格式字符串&#xff08;多参数通过&进行连接&…

mediasoup Transport端口策略

一. 前言 mediasoup 支持多种类型的 Transport&#xff0c;有 WebRtcTransport&#xff0c;PlainTransport 以及 PipeTransport&#xff0c;对于 WebRtcTransport 目前 mediasoup 最新版本已经支持多个 WebRtcTransport 共用单个端口的模式了&#xff0c;而在此之前每个 WebRtc…

真题详解(补码转换)-软件设计(七十四)

真题详解(索引查询)-软件设计&#xff08;七十三)https://blog.csdn.net/ke1ying/article/details/130659024 Composite模式&#xff1a; 以树形结构来表示”整体-部分”的关系&#xff0c;使得单个和团体的使用都具有一致性。 对一个基本有序的数组进行排序&#xff0c;适合…

【PCIE体系结构九】物理层的基本逻辑框架

&#x1f449;个人主页&#xff1a;highman110 &#x1f449;作者简介&#xff1a;一名硬件工程师&#xff0c;持续学习&#xff0c;不断记录&#xff0c;保持思考&#xff0c;输出干货内容 参考书籍&#xff1a;《深入浅出SSD&#xff1a;固态存储核心技术、原理与实战》 物…

可见光遥感图像目标检测(三)文字场景检测之Arbitrary

前言 前面介绍了关于可见光遥感图像目标检测任务主要面临的问题&#xff0c;现在对旋转目标的问题进行优化&#xff0c;为了便于大家理解与之前通用目标检测区别&#xff0c;采用Faster-Rcnn网络模型的架构对旋转目标的检测进行改进。 本教程禁止转载。同时&#xff0c;本教程来…

5G-NR非连续接收DRX参数配置详解

5G-NR系统配置中的非连续接收系统 DRX&#xff1a;Discontinuous Reception 5G终端商用在即&#xff0c;根据前期测试及部分5G友好用户反馈&#xff0c;“5G终端功耗大&#xff0c;待机差”问题特别突出。根据5G技术特性&#xff0c;导致5G终端相比4G功耗大很多的原因有如下4…

干货 | Amos实操教程之中介效应检验

Hello&#xff0c;大家好&#xff01; 这里是壹脑云科研圈&#xff0c;我是喵君姐姐~ 本次推文&#xff0c;我们就来给大家介绍一种处理结构方程模型软件——Amos 。 01 摘要 Amos是什么&#xff1f; Amos由James L. Arbuckle所发展&#xff0c;全名是Analysis of Moment S…

泛化深度学习综述

机器学习系统通常假设训练和测试分布是相同的。为此&#xff0c;一个关键的需求是开发可以推广到unseen分布的模型。领域泛化&#xff08;DG&#xff0c;Domain generalization&#xff09;&#xff0c;即分布外泛化&#xff08;out-of-distribution generalization&#xff09…

vim强大的快捷键

文章目录 vim强大的快捷键&#xff08;必须在可视模式下完成&#xff09;光标移动&#xff08;上下左右移动&#xff09;行选中列选中复制粘贴剪切删除取消后悔取消跳到文件的末尾跳转到我呢见的开头保存并且退出vim编辑器自动补全自动格式化回到行首&#xff08;这一行的第一个…

ESP32设备驱动-MMA8452加速度计驱动

MMA8452加速度计驱动 文章目录 MMA8452加速度计驱动2、硬件准备3、软件准备4、驱动实现MMA8452Q 是一款智能、低功耗、三轴、电容式微加工加速度计,具有 12 位分辨率。 该加速度计具有嵌入式功能,具有灵活的用户可编程选项,可配置为两个中断引脚。 嵌入式中断功能可实现整体…

DJ5-2 差错检测和纠错

目录 一、差错检测和纠错技术 1、发送节点 2、接收节点 3、说明 二、差错检测技术 1、一比特奇偶校验 2、二维奇偶校验 3、Internet 校验和方法&#xff08;复习&#xff09; 4、循环冗余检测 CRC 5、差错检测方法比较 一、差错检测和纠错技术 链路层提供比特级差错检…

我为什么要使用vuetify3做为基础组件去开发公司组件库

设计风格 Vuetify是基于Material Design规范&#xff0c;依靠Material Design的设计优势&#xff0c;在无需编写一行css代码就可以得到非常美观的界面功能&#xff0c;同时Vuetify还具备自适应的能力&#xff0c;可以使用一套代码写出同时兼容手机、平板、web的功能&#xff1…