初级会员
- 积分
- 135
- 金钱
- 135
- 注册时间
- 2015-3-12
- 在线时间
- 166 小时
|
楼主 |
发表于 2021-11-6 18:47:44
|
显示全部楼层
我在网上找到了另外一个程序,做了些修改,原地址是:https://mp.weixin.qq.com/s/1pmkaKHoeINP6caTRBzCBg
`timescale 1ns / 1ps
module pwm_gen(
input rst_n,
input sysclk,
input [15:0] period,//周期 最大65535
input [15:0] duty_cycle_buf,//占空比
output reg pwm1,//PWM输出引脚
);
reg [16:0] cnt_cycle;
//计数器电路,cnt_cycle就是计数器输出计数结果
always@(posedge sysclk)
begin
cnt_cycle <= (cnt_cycle == (period-1)) ? 0 : cnt_cycle + 1;
end
/*比较器电路 ,pwm_buf 为输出PWM结果,红色字为计数器输入,绿色字为比较器比较线*/
always@(posedge sysclk)
begin
pwm1 <= (cnt_cycle < duty_cycle_buf) ? 1'b1 : 1'b0;
end
//只有在cnt_cycle计数一个周期T的时候,占空比值才会更新,也就是比较线才会移动!
//因为输入占空比可以不断改变,也就是第一张图的比较线是会上下移动的,为了不影响我们在计数的过程中突然采集到突变的值最终导致,不平滑的占空比,所以占空比输入在每个计数周期完成后才会去采集。
always@(posedge sysclk)
begin
if(cnt_cycle == (period-1))
duty_cycle_buf <= (duty_cycle > period-1) ? period-1 : duty_cycle;
end
endmodule
不明白的是,后面这一句,因为我的占空比和周期是通过串口发送给FPGA,那么我这样写有什么问题??
最后一句,cnt_cycle计数一个周期T的时候,如果为真,占空比值duty_cycle_buf=周期,如果为假占空比duty_cycle_buf=计数值,是这样理解码?? |
|