【FPGA开发笔记】—— 如何利用FPGA的GPIO口输出可以自己控制占空比的PWM信号

暂时先把源码和TestBench文件和仿真结果贴出来,原理介绍咱们下次再补上哈。
【Verilog代码】:

module PWM2(
	input clk,
	input rst,
	input [1:0] flag,
	output pwm_signal,
	output reg [2:0] cnt1,
	output reg [2:0] cnt2);
	
//Requirements: every five clock cycles to a flag
//reg [2:0] cnt1;
//reg [2:0] cnt2;
parameter MAX_COUNT = 5;

always@(posedge clk or negedge rst)
begin
	if(!rst)
		cnt1 <= 3'd0;
	else begin
		if(cnt1 >= MAX_COUNT - 1)
			cnt1 <= 3'd1;
		else
			cnt1 <= cnt1 + 3'd1;
	end
end

always@(posedge clk or negedge rst)
begin
	if(!rst)
		cnt2 <= 3'd0;
	else begin
		if(cnt1 == MAX_COUNT-1) begin
			case(flag)
				2'b11: cnt2 <= 3'd1;
				2'b10: cnt2 <= 3'd2;
				2'b01: cnt2 <= 3'd3;
				2'b00: cnt2 <= 3'd4;
				default: cnt2 <= 3'd1;
			endcase
	   end
		else
			cnt2 <= cnt2;
	end
end

assign pwm_signal = (cnt1 < cnt2)?1'b0:1'b1;
endmodule

【TestBench】

`timescale 1ns/1ns
module tb_pwm2();

reg clk;
reg rst;
reg [1:0] flag;
wire [2:0] cnt1;
wire [2:0] cnt2;

parameter T = 20;

initial begin
	clk = 1'b0;
	rst = 1'b0;
	#(T/2) rst = 1'b1;
	flag = 2'b00;
	#(4*T) flag = 2'b01;
	#(4*T) flag = 2'b11;
	#(4*T) flag = 2'b00;
	#(4*T) flag = 2'b00;
	#(4*T) flag = 2'b01;
	#(4*T) flag = 2'b10;
	#(4*T) flag = 2'b11;
	#(4*T) flag = 2'b01;
	#(4*T) flag = 2'b00;
	#(4*T) flag = 2'b11;
	#(4*T) flag = 2'b00;
	#(4*T) flag = 2'b10;
	#(4*T) flag = 2'b11;
	#(4*T) flag = 2'b01;
	#(4*T) flag = 2'b00;
	#(4*T) flag = 2'b11;
	#(4*T) flag = 2'b01;
	#(4*T) flag = 2'b00;
	#(4*T) flag = 2'b11;
end

always#(T/2) clk = ~clk;

PWM2 u0(
	.clk(clk),
	.rst(rst),
	.flag(flag),
	.pwm_signal(pwm_signal),
	.cnt1(cnt1),
	.cnt2(cnt2));
	
endmodule

在这里插入图片描述

  • 3
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要捕获遥控器信号输出 GPIO 控制电平和 PWM 控制电平,需要用到红外遥控器模块和 Arduino 的红外接收器模块。 首先,需要将红外遥控器模块的输出引脚接到 Arduino 的数字引脚上,然后使用 IRremote 库来解码遥控器信号。 以下是一个示例代码,演示如何使用红外遥控器模块捕获遥控器信号,并根据不同的按键输出不同的 GPIO 控制电平和 PWM 控制电平: ```c++ #include <IRremote.h> int irPin = 11; // 红外接收器连接的数字引脚 IRrecv irrecv(irPin); decode_results results; int ledPin = 13; // LED 灯连接的数字引脚 int pwmPin = 9; // PWM 信号连接的数字引脚 void setup() { Serial.begin(9600); pinMode(ledPin, OUTPUT); pinMode(pwmPin, OUTPUT); irrecv.enableIRIn(); // 启动红外遥控器接收器 } void loop() { if (irrecv.decode(&results)) { Serial.println(results.value, HEX); // 打印遥控器编码值 switch (results.value) { case 0xFFA25D: // 按下数字键 1 digitalWrite(ledPin, HIGH); analogWrite(pwmPin, 128); break; case 0xFF629D: // 按下数字键 2 digitalWrite(ledPin, LOW); analogWrite(pwmPin, 255); break; case 0xFFE21D: // 按下数字键 3 digitalWrite(ledPin, HIGH); analogWrite(pwmPin, 0); break; default: break; } irrecv.resume(); // 继续等待下一个信号 } } ``` 在这个示例代码中,首先定义了红外接收器连接的数字引脚和 LED 灯、PWM 信号连接的数字引脚。然后在 setup() 函数中启动红外接收器,使其开始接收遥控器信号。在 loop() 函数中,调用 irrecv.decode() 函数来检测是否有新的信号接收到。如果有,就根据编码值来判断按下了哪个按键。根据不同的按键,输出不同的 GPIO 控制电平和 PWM 控制电平。最后调用 irrecv.resume() 函数,使红外接收器继续等待下一个信号。 需要注意的是,在本示例代码中,使用了 analogWrite() 函数来控制 PWM 信号占空比。这个函数可以将一个数字值(0~255)转换为 PWM 信号占空比。例如,当数字值为 128 时,PWM 信号占空比为 50%。如果需要更精确的控制 PWM 信号,可以使用 Timer1 库或 Timer2 库等第三方库来生成硬件 PWM 信号

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值