用verilog设计频率和占空比可调pwm

用verilog设计频率和占空比可调pwm,第1张

module pwm_test(

input clk , //时钟输入,可在外部设置不同时钟

input rst_n , //低电平复位

input [7:0] f , //频率控制,最大255

input [7:0] d , //占盯桐空比渗卖控制字,上限100

output pwm_out //PWM输出

)

reg [17:0] count //计数

always @(posedge clk or negedge rst_n) begin

if(~rst_n) begin

count <= 0

end

else if(count >= 17'd100_000) //计数丛则逗到100K清零

count <= 0

else

count <= count + f //每次累加频率值

end

assign pwm_out = (count <d*1000)? 1:0 //PWM输出

endmodule

其实最直接的方式就是用计数器来春前枝控制0与1的比例

可以给你举例

比如:你的占空比是1:2

那么

always@(posedge clk or negedeg rstn)

if(~rstn)

cnt<=0

else if(cnt==2)

else

cnt<=cnt+1

always@(posedege clk or negedge rstn)

if(!rstn)

clk_out<=0

else if (cnt==0)

clk_out<=1

else if(cnt>=1&&cnt<=2)]

clk_out<=0

else

意思就是说cnt==0时候clk_out=1,高电平

cnt==1和cnt==2的时候clk_out=0,低电平

这样就成功实现了1:2的悔竖占空比

其中ckl是原始的时钟。而clk_out是输扒敏出的时钟

我想seagull5414就是想表达这样的意思

至于网友larzhang的逻辑,也可以实现同样的功能,只不过逻辑性更强一些。一眼看明白比较难,但是可以画出时序图来看他的clk_out=clk&clk_d是怎么样的波形,可以得到同样的不同占空比的时钟信号。

如果还有问题可以补充。 乐意为你解答。

1.使用计数器来实现可配置的分频器,但你的代码是错误的

2.always@(posedge clockin or negedge clockin)

这个需要特殊的双沿触犯的寄存器,quatus里面可能需要自己特殊指定

其实使用单沿就可以了

3.关于testbench,既然漏野稿是可配置分频书的分脊答频器,应该是配置某一个寄存器达到这个效果,返孝而不是使用force的写法


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/12432020.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-23
下一篇2023-05-23

发表评论

登录后才能评论

评论列表(0条)

    保存