当前位置:网站首页>FPGA:使用PWM波控制LED亮度
FPGA:使用PWM波控制LED亮度
2022-07-28 04:48:00 【刘颜儿】
前言
正文
用到的知识点:
- 用检测下降沿的方法进行按键消抖
- 通过生成三角波,进而实现可变占空比的PWM波
- 生成递增、递减的信号
设计文件
// 4次调节亮度
// 按下第4次后,亮度依次减小
module pwm_led_02(
input clk,
input rst_n,
input key,
output reg led
);
parameter CNT_MAX = 12'd1249;
parameter PWM_2 = 12'd249;
parameter PWM_4 = 12'd499;
parameter PWM_6 = 12'd749;
parameter PWM_8 = 12'd999;
reg [11:0]PWM_type;
wire key_nege;//按键下降沿
reg key_reg1;
reg key_reg2;
reg cnt_up;
reg cnt_down;
reg key_up;
reg key_down;
reg [2:0] cnt_key;
reg [11:0] cnt_1249;
//====================================
//检测按键下降沿
[email protected](posedge clk or negedge rst_n)begin
if(!rst_n )begin
key_reg1 <= 1'd0;
key_reg2 <= 1'd0;
end
else begin
key_reg1 <= key;
key_reg2 <= key_reg1;
end
end
assign key_nege = key_reg2 & (~key_reg1);
//====================================
//====================================
// 用50MHZ时钟生成20KHZ的PWM
//生成三角波
[email protected](posedge clk or negedge rst_n)begin
if(!rst_n )
cnt_1249 <= 12'd0;
else if(key_nege)
cnt_1249 <= 12'd0;
else if(cnt_up)
cnt_1249 <= cnt_1249 + 1;
else if(cnt_down)
cnt_1249 <= cnt_1249 - 1;
else
cnt_1249 <= cnt_1249;
end
[email protected](posedge clk or negedge rst_n)begin
if(!rst_n )begin
cnt_up <= 1'd0;
cnt_down <= 1'd0;
end
else if(cnt_1249 == CNT_MAX-1)begin
cnt_up <= 1'd0;
cnt_down <= 1'd1;
end
else if(cnt_1249 == 0)begin
cnt_up <= 1'd1;
cnt_down <= 1'd0;
end
else begin
cnt_up <= cnt_up;
cnt_down <= cnt_down;
end
end
//====================================
// 按键计数
[email protected](posedge clk or negedge rst_n)begin
if(!rst_n )
cnt_key <= 3'd0;
else if(key_nege)begin
if(key_up)
cnt_key <= cnt_key + 1;
else if(key_down)//cnt_key[0] &&
cnt_key <= cnt_key - 1;
end
end
[email protected](posedge clk or negedge rst_n)begin
if(!rst_n )begin
key_up <= 1'd0;
key_down <= 1'd0;
end
else if(cnt_key == 4)begin
key_up <= 1'd0;
key_down <= 1'd1;
end
else if(cnt_key == 0)begin
key_up <= 1'd1;
key_down <= 1'd0;
end
else begin
key_up <= key_up;
key_down <= key_down;
end
end
[email protected](*)begin
case(cnt_key)
3'd1:begin
if(key_up)begin
PWM_type = PWM_2;
if(cnt_1249 <= PWM_type)
led = 1'd0;
else if(cnt_1249 > PWM_type )
led = 1'd1;
end
else if(key_down)begin
PWM_type = PWM_2;
if(cnt_1249 <= PWM_type)
led = 1'd0;
else if(cnt_1249 > PWM_type )
led = 1'd1;
end
end
3'd2:begin
if(key_up)begin
PWM_type = PWM_4;
if(cnt_1249 <= PWM_type)
led = 1'd0;
else if(cnt_1249 > PWM_type )
led = 1'd1;
end
else if(key_down)begin
PWM_type = PWM_4;
if(cnt_1249 <= PWM_type)
led = 1'd0;
else if(cnt_1249 > PWM_type )
led = 1'd1;
end
end
3'd3:begin
if(key_up)begin
PWM_type = PWM_6;
if(cnt_1249 <= PWM_type)
led = 1'd0;
else if(cnt_1249 > PWM_type )
led = 1'd1;
end
else if(key_down)begin
PWM_type = PWM_6;
if(cnt_1249 <= PWM_type)
led = 1'd0;
else if(cnt_1249 > PWM_type )
led = 1'd1;
end
end
3'd4:begin
if(key_up)begin
PWM_type = PWM_8;
if(cnt_1249 <= PWM_type)
led = 1'd0;
else if(cnt_1249 > PWM_type )
led = 1'd1;
end
else if(key_down)begin
PWM_type = PWM_8;
if(cnt_1249 <= PWM_type)
led = 1'd0;
else if(cnt_1249 > PWM_type )
led = 1'd1;
end
end
default: begin
PWM_type = CNT_MAX;
led = 1'd1;
end
endcase
end
endmodule
测试文件
`timescale 1ns/1ns
module tb_pwm (
);
reg clk,rst_n,key;
wire led;
initial begin
clk = 1'd0;
rst_n = 1'd0;
key = 1'd1;
# 100
rst_n = 1'd1;
# 30000
key = 1'd0;
#20000
key = 1'd1;
# 20000
key = 1'd0;
#5000
key = 1'd1;
# 10000
key = 1'd0;
# 30000
key = 1'd1;
# 20000
key = 1'd0;
#5000
key = 1'd1;
# 10000
key = 1'd0;
# 30000
key = 1'd1;
# 30000
key = 1'd0;
#20000
key = 1'd1;
# 20000
key = 1'd0;
#5000
key = 1'd1;
# 10000
key = 1'd0;
# 30000
key = 1'd1;
# 20000
key = 1'd0;
#5000
key = 1'd1;
# 10000
key = 1'd0;
# 30000
key = 1'd1;
end
always #10 clk = ~ clk;
pwm_led_02 pwm_led_inst(
.clk(clk),
.rst_n(rst_n),
.key(key),
.led(led)
);
endmodule
上板测试

边栏推荐
- Research on the design of robot education in stem course
- NAT基本原理与私有IP
- Interview fraud: there are companies that make money from interviews
- Use and expansion of fault tolerance and fusing
- 【sylar】框架篇-Chapter9-hook 模块
- printf()打印char* str
- MySQL数据库————初识数据库
- np. The data returned from delete details is the data after deleting the specified dimension
- [Sylar] practical part - redis based parameter query service
- [函数文档] torch.histc 与 paddle.histogram 与 numpy.histogram
猜你喜欢

01-Node-Express系统框架搭建(express-generator)

Render the data obtained from the database to the table in elementui

Installing MySQL under Linux

Design and development of C language ATM system project

Redis类型

字符串0123456789abcdef,子串(非空且非同串本身)的个数是多少【杭州多测师】【杭州多测师_王sir】...
![[daily one] visual studio2015 installation in ancient times](/img/b1/066ed0b9e93b8f378c89ee974163e5.png)
[daily one] visual studio2015 installation in ancient times

《KG-BERT: BERT for Knowledge Graph Completion》
![[idea] check out master invalid path problem](/img/83/d36362ba314177cd6f1f74f3e922cd.png)
[idea] check out master invalid path problem

Interview fraud: there are companies that make money from interviews
随机推荐
Observable time series data downsampling practice in Prometheus
Nat fundamentals and private IP
【sylar】框架篇-Chapter12-ByteArray 模块
数据库故障容错之系统时钟故障
Render the data obtained from the database to the table in elementui
【sylar】框架篇-Chapter10-Address 模块
【sylar】框架篇-Chapter14-TcpServer 模块
RuntimeError: stack expects each tensor to be equal size, but got [8] at entry 0 and [2] at entry 2
Leetcode 18. sum of four numbers
Redis类型
低代码是开发的未来吗?浅谈低代码平台
Take out system file upload
Youxuan database participated in the compilation of the Research Report on database development (2022) of the China Academy of communications and communications
Bio annotation of emotion analysis aste triples extraction
X Book Keyword Search
[daily question 1] 735. Planetary collision
(克隆虚拟机步骤)
【二、移动web网页开发】2D&3D转换与动画、移动端布局、响应式布局
Odoo action analysis (action.client, action.act_window, action.server)
NAT基本原理与私有IP