
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的写法
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)