FPGA_学习_09_PWM呼吸灯

news/2024/10/28 20:18:58/

PWM在三相电机控制中,有着非常重要的地位。 如果你需要用FPGA去实现三相电机的控制, PWM这一关是绕不过的。好在PWM的基本原理是比较简单的。所以原理部分本文就略过,本文基于PWM实现呼吸灯。

1 时序 

{signal: [{name: 'clk',   		wave: 'p...............................'	},{},{name: 'rst_n',			wave: '01..............................'	},{},{name: 'cnt_ms',		wave: '2.222222222222222222222222222222'	, data: ['0','1','2','...','MAX','0','1','2','...','MAX','0','1','2','...','MAX','0','1','2','...','MAX','0','1','2','...','MAX','0','1','2','...','MAX']},{},{name: 'cnt_1s',		wave: '2.....2....2....2....2....2....2'	, data: ['0','1','2','...','MAX','0','1','2','...','MAX']},{},    {name: 'pwm',			wave: '0.....10...1.0..1..0.1....0....1'	},{},{name: 'duty_cycle',	wave: '2.....2....2....2....2....2....2'	, data: ['0%','1%','2%','...','100%','99%','98%']},{},    {name: 'workflag',    	wave: '0.........................1.....'	},{}
]}

 2 FPGA源文件

`timescale 1ns / 1psmodule pwm_led(input   wire            clk     ,input   wire            rst_n   ,output  wire    [1:0]   led         
);//==================================================================
//                        Parameter define
//==================================================================localparam      CNT_1MS         = 50_000 - 1;   // 20ns x 50_000 = 1ms
localparam      CNT_1S          = 1000 - 1;     // 1ms x 1000 = 1s
localparam      CHANGE_TIME     = 500 - 1;      // 1ms x 500 = 0.5s
localparam      PWM_OFFSET      = 100;//==================================================================
//                        Internal Signals
//==================================================================reg     [31:0]  cnt_ms          ;
reg     [31:0]  cnt_s           ;
reg             pwm             ;
reg     [31:0]  duty_cycle      ;
reg             work_flag       ;assign led[1] = ~pwm;
assign led[0] = 1'b0;//----------------------------- cnt_ms -----------------------------
always @(posedge clk or negedge rst_n) beginif (rst_n == 1'b0) begincnt_ms  <= 'd0;         endelse if (cnt_ms == CNT_1MS) begincnt_ms  <= 'd0;endelse begincnt_ms  <= cnt_ms + 1'b1;end
end//----------------------------- cnt_s -----------------------------
always @(posedge clk or negedge rst_n) beginif (rst_n == 1'b0) begincnt_s   <= 'd0;              endelse if(cnt_ms == CNT_1MS) beginif (cnt_s == CNT_1S) begincnt_s   <= 'd0;endelse begincnt_s   <= cnt_s + 1'b1;endendelse begincnt_s   <= cnt_s;end
end//----------------------------- work_flag -----------------------------
// 0 ~ 0.5s     work_flag == 0
// 0.5s ~ 1s    work_flag == 1 
always @(posedge clk or negedge rst_n) beginif (rst_n == 1'b0) beginwork_flag <= 1'b0;                 endelse if (cnt_s == CHANGE_TIME && cnt_ms == CNT_1MS) beginwork_flag <= 1'b1;endelse if (cnt_s == CNT_1S && cnt_ms == CNT_1MS) beginwork_flag <= 1'b0;endelse beginwork_flag <= work_flag;end
end//----------------------------- duty_cycle -----------------------------
always @(posedge clk or negedge rst_n) beginif (rst_n == 1'b0) beginduty_cycle      <= 'd0;                 endelse if (work_flag == 1'b0) beginif (cnt_ms == CNT_1MS) beginduty_cycle <= duty_cycle + PWM_OFFSET;endelse beginduty_cycle <= duty_cycle;endendelse if (work_flag <= 1'b1) beginif (cnt_ms == CNT_1MS) beginduty_cycle <= duty_cycle - PWM_OFFSET;endelse beginduty_cycle <= duty_cycle;endendelse beginduty_cycle <= duty_cycle;end
end//----------------------------- pwm -----------------------------
always @(posedge clk or negedge rst_n) beginif (rst_n == 1'b0) beginpwm <= 1'b1;                   endelse if (cnt_ms < duty_cycle) beginpwm <= 1'b1;endelse beginpwm <= 1'b0;end
endendmodule

3 约束文件

create_clock	-period			20.000		[	get_ports	clk	]set_property    PACKAGE_PIN		N18			[	get_ports	clk			]
set_property    PACKAGE_PIN		P15			[	get_ports	{led[0]}	]
set_property    PACKAGE_PIN		U12			[	get_ports	{led[1]}	]
set_property    PACKAGE_PIN		T12			[	get_ports	rst_n		]set_property    IOSTANDARD      LVCMOS33	[	get_ports	clk			]  
set_property    IOSTANDARD      LVCMOS33	[	get_ports	{led[*]}	]  
set_property    IOSTANDARD      LVCMOS33	[	get_ports	rst_n		]  

4 运行结果

PWM呼吸灯


http://www.ppmy.cn/news/597909.html

相关文章

Acwing128. 编辑器

题目链接&#xff1a;128. 编辑器 - AcWing题库 标签&#xff1a;堆顶栈 思路&#xff1a;分别用两个栈&#xff0c;记录光标左边的数和光标右边的数&#xff1b;用s记录前缀和&#xff0c;f记录最大前缀。 对题目所示五个操作有&#xff1a; 1.插入操作&#xff1a;将x插入…

模板匹配Template Matching

实现代码&#xff1a; import cv2 import numpy as np def template_demo(tpl,target):methods[cv2.TM_SQDIFF_NORMED,cv2.TM_CCORR_NORMED,cv2.TM_CCOEFF_NORMED]th,twtpl.shape[:2]for md in methods:start_timecv2.getTickCount()# 匹配结果resultcv2.matchTemplate(target…

行列转换(一)• MySQL版

欢迎来到爱书不爱输的程序猿的博客, 本博客致力于知识分享&#xff0c;与更多的人进行学习交流 本文收录于SQL应知应会专栏,本专栏主要用于记录对于数据库的一些学习&#xff0c;有基础也有进阶&#xff0c;有MySQL也有Oracle 行列转换 • Mysql版 1.准备操作2.行转列1.1为何进…

Cartographer自定义lua参数的方法

Cartographer中, 配置参数大多数都是从lua文件中得到的, 不是像其他的开源框架大多使用xml等文件进行参数配置. 假如我们要配置一个名字是rotation_condition的配置参数在pose_graph_2d.cc中, 想要使用方法为 options_.translation_condition()配置步骤如下: 1. 修改proto文件…

Edge浏览器可以多开吗?

问答链接&#xff1a;Edge浏览器可以多开吗&#xff1f; 可以。 如果你的edge浏览器是默认路径安装的&#xff0c;那么打开命令提示符窗口输入以下两条命令即可启动一个数据完全隔离的edge浏览器。 mkdir C:\logs001 "C:\Program Files (x86)\Microsoft\Edge\Applicati…

23种设计模式的简单理解

23种设计模式的设计原则为&#xff1a; 1、开闭原则 2、单一职责原则 3、依赖倒置原则 4、里氏替换原则 5、迪米特原则&#xff08;最小知道原则&#xff09; 6、组合复用原则 23种设计模式可分为三种大的类型 一、创建型…

计算机应用大专生简历,计算机应用大专生简历范文

以下是无忧考网为大家整理的关于计算机应用大专生简历范文的文章&#xff0c;希望大家能够喜欢&#xff01; 基本资料 姓  名&#xff1a; 林女士 性  别&#xff1a; 女 民  族&#xff1a; 汉族 出生日期&#xff1a; 1988年08月20日 户  口&#xff1a; 安徽省 学 …

大专生计算机水平个人简历,2011计算机大专生简历范文

姓  名&#xff1a; 林女士 性  别&#xff1a; 女 民  族&#xff1a; 汉族 出生日期&#xff1a; 1988年08月20日 户  口&#xff1a; 安徽省 学  历&#xff1a; 大专 技术职称&#xff1a; 高级 毕业院校&#xff1a; 安庆职业技术学院 所学专业&#xff1a; 计算…