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

这篇具有很好参考价值的文章主要介绍了【FPGA零基础学习之旅#5】产生非等占空比信号。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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


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

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

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

一、效果演示

🥝等占空比信号

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

🥝非等占空比信号

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

二、等占空比信号的产生

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

50MHz的晶振,要实现1秒的定时,需要计数49_999_999次,RTL视图展示如下:
【FPGA零基础学习之旅#5】产生非等占空比信号

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 = 0;
	
	#100 Rst_n = 1;
	
	#(`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视图展示如下:
【FPGA零基础学习之旅#5】产生非等占空比信号
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 = 0;
	
	#100 Rst_n = 1;
	
	#(`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视图:
【FPGA零基础学习之旅#5】产生非等占空比信号

其中,为了更好地理解本次项目的内容,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视图如下:
【FPGA零基础学习之旅#5】产生非等占空比信号

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

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

四、小项目

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

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

🔸项目一

具体要求:流水灯的循环周期为2.5秒,四个LED灯在最初时刻全部点亮,以从左到右或者从右到左的顺序,四个LED灯以0.5秒为间隔依次熄灭。
实现效果:
【FPGA零基础学习之旅#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视图:
【FPGA零基础学习之旅#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 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视图:
【FPGA零基础学习之旅#5】产生非等占空比信号

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

🔸项目二

具体要求:流水灯的循环周期为3秒,四个LED灯在最初时刻全部熄灭,以从左到右或者从右到左的顺序,四个LED灯分别以0.25秒0.5秒0.75秒1秒为间隔依次点亮,全部点亮后持续0.25秒
实现效果:
【FPGA零基础学习之旅#5】产生非等占空比信号

项目代码:

/
//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视图:
【FPGA零基础学习之旅#5】产生非等占空比信号

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

🧸结尾文章来源地址https://www.toymoban.com/news/detail-451126.html


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

到了这里,关于【FPGA零基础学习之旅#5】产生非等占空比信号的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 电力电子课设|数控产生PWM波|使用51单片机输出占空比可调PWM波(按钮控制、数码管显示)速成教程

    我们学校电气专业开始做电力电子的课设了,小组选了一项制作硬件电路的任务,里面有要求采用 数控方式 实现DC-DC电压变换的输出电压调节,数控在电路中的体现就是用单片机输出可调占空比的PWM波作用于IRF520模块,实现电压的变化,作用于SG3525芯片的2引脚。考虑到可能

    2024年02月16日
    浏览(45)
  • 【STM32基础】第四篇、控制PWM占空比

    目录 第一部分、STM32定时器的基本知识 1、STM32定时器的分类(图片来自野火文档) 2、开发过程中定时器的常用基础功能 3、定时器挂在的总线  第二部分、能用的代码   1、定时器计时代码 2、定时器输出PWM代码 第三部分、总结 1、STM32定时器的分类(图片来自野火文档)  

    2024年02月07日
    浏览(44)
  • 【单片机概念基础】迟迟搞不懂预分频系数、PWM占空比等等概念和计算怎么办?

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 在学习单片机的过程中,预分频系数和PWM(脉冲宽度调制)占空比是两个常见但容易令人困惑的概念。预分频系数涉及定时器的时钟频率控制,而PWM占空比则关系到输出波形的高低电平时间比例。本文将

    2024年04月17日
    浏览(40)
  • 11、江科大stm32视频学习笔记——输入捕获模式测频率、PWMI模式测频率占空比

    目录 一、知识点 1、IC(Input Capture)输入捕获 2、通用定时器结构 (1)输出比较的执行逻辑 (2)四个输入捕获和输出比较通道 (3)输入捕获的执行流程和输出比较的区别 (4)输入捕获的作用 (5)输入捕获通道 (6)PWMI模式:同时测量频率和占空比 (7)主从触发模式:

    2024年02月13日
    浏览(41)
  • STM32学习笔记(六)丨TIM定时器及其应用(输入捕获丨测量PWM波形的频率和占空比)

    ​  本次课程采用单片机型号为STM32F103C8T6。 ​  课程链接:江科大自化协 STM32入门教程   往期笔记链接:   STM32学习笔记(一)丨建立工程丨GPIO 通用输入输出   STM32学习笔记(二)丨STM32程序调试丨OLED的使用   STM32学习笔记(三)丨中断系统丨EXTI外部中断

    2023年04月19日
    浏览(54)
  • 分频器——(任意奇分频(50%占空比、非50%占空比),任意偶分频,任意小数分频)

            在数字系统的设计中经常会碰到 需要使用多个时钟 的情况。时钟信号的产生通常具有两种方法,一种是使用PLL(Phase Locked Loop,锁相环),可生成 倍频、分频信号 ;另一种则是使用硬件描述语言构建一个分频电路。         分频器的设计通常分为以下 三类:

    2023年04月23日
    浏览(66)
  • 【FPGA零基础学习之旅#9】状态机基础知识

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

    2024年02月16日
    浏览(43)
  • STM32 F103C8T6学习笔记5:定时器输出不同占空比PWM驱动舵机旋转角度

    现在学习使用STM32 F103C8T6的定时器PWM模式,使用PWM驱动舵机转动不同角度,文章提供源码,测试工程,测试动态效果图。 目录 基础原理:  实验目标: 测试视频结果: 测试工程下载: 这次依旧拿出之前学习过的舵机DS3115,它的基础原理不多加介绍,在往期讲MSP432的文章有所

    2024年02月13日
    浏览(41)
  • 【FPGA零基础学习之旅#11】数码管动态扫描

    🎉欢迎来到FPGA专栏~数码管动态扫描 ☆* o(≧▽≦)o *☆ 嗨 ~我是 小夏与酒 🍹 ✨ 博客主页: 小夏与酒的博客 🎈该系列 文章专栏: FPGA学习之旅 文章作者技术和水平有限,如果文中出现错误,希望大家能指正🙏 📜 欢迎大家关注! ❤️ 🥝 Spirit_V2开发板按键控制数码管:

    2024年02月11日
    浏览(37)
  • 【FPGA零基础学习之旅#14】串口发送字符串

    🎉欢迎来到FPGA专栏~串口发送字符串 ☆* o(≧▽≦)o *☆ 嗨 ~我是 小夏与酒 🍹 ✨ 博客主页: 小夏与酒的博客 🎈该系列 文章专栏: FPGA学习之旅 文章作者技术和水平有限,如果文中出现错误,希望大家能指正🙏 📜 欢迎大家关注! ❤️ 🥝 发送Hello: 🥝 发送数字字符并自

    2024年02月08日
    浏览(40)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包