sgdd.net
当前位置:首页 >> vErilog任意分频器 >>

vErilog任意分频器

频率可调的信号可以这么实现: 用一个足够大的计数器,对主时钟进行计数,比如计数器定义为reg[5:0]count;那么你可以定义当count为何值时翻转时钟,那么就可以得到频率可变的时钟. 但是这样做的话,只能得到50%占空比的脉冲. 用于伺服电机,脉冲应该也是可变的才对.这时,你可以再加一个计数器count2,两个计数器同时计数,一个代表正脉宽,另一个代表负脉宽,调节两个计数器的大小就可以实现频率、脉冲同时可变了. 具体方法是,当保持count+count2值不变时,则频率不变,调节count和count2的值(其实就是一个加多少另一个就减多少了)就可以改变占空比;如果count+count2的值也改变,那么频率也就改变了.

1'b0就是一根接入逻辑零(GND)的线.1'b1就是一根接入逻辑一(VCC)的线.

分频呗,先50分频,从0~24时clkdiv=1,25~49时clkdiv=0;之后再10^6分频

关于分频的话,建议使用pll,首先可以保证相位,占空比,稳定性没问题,如果实在要用的话,可以使用一个计数器,技计数到10可以翻转,这样就可以了.简单吧,另外有问题的话可以继续追问我.

假设你的clk就是1s周期的时钟 那么10s的应该是这么写 reg [3:0] cnt_10; reg clk_10s; always @ (posedge rst or posedge clk) begin if (rst) begin cnt_10 clk_10s end else begin if (cnt_10==4) begin cnt_10 clk_10s end else begin cnt_10 clk_10s end end60的,cnt就在29归零,同时clk_60s反向 是在半周期反向才是占空比1:1.

代码如下,供参考 reg [24:0] cnt; reg clk_1hz; parameter c_25m = 25'd24_999_999; always@(posedge clk_50m or negedge rst) if (!rst) cnt <= 25'b0; else if (cnt >= c_25m ) // cnt <= 25'b0; else cnt <= cnt + 1'b1; always@(posedge clk_50m or negedge rst) if (!rst) clk_1hz <= 1'b0; else if (cnt == c_25m ) clk_1hz <= !clk_1hz;

module freq(out,clk,reset);input clk,reset;output out;reg out;reg[2:0] count;always @(posedge clk or negedge reset)if(!reset) begin out 评论0 0 0

以4分频作为一个例子两比特计数器计数,在每个输入时钟的上升沿计数器加1这样计数器会计数 0 -》1 -》2-》3-》0表达为二进制为:00011011可以看到计数器的高位每四个输入时钟的变化是 0,0,1,1.因此如果把计数器的高位作为一个输出时钟,它每四个输入时钟的周期完成一次0011的周期.因此相对于输入时钟实现了4分频

对于分频模块,一般设计中是采用PLL(锁相环,phase locked loop). 如果非要用verilog描述这个硬件电路的话,可以先计算矩形波高低电平所需时钟周期, 低电平所需即为cnt1,高为cnt2,将时钟按所需系数分频为新的时钟clk2, 用clk2根据cnt1、cnt2分频就得到所需结果了.

这个要设置rom的,设置好rom然后直接调用,可以在rom里面设置好你自己需要的各个分频,然后在程序里面调用,还可以实现调频和歌曲的频率调整,详细的话你可以参考别人的歌曲是如果编程的,大概也是差不多

网站首页 | 网站地图
All rights reserved Powered by www.sgdd.net
copyright ©right 2010-2021。
内容来自网络,如有侵犯请联系客服。zhit325@qq.com