verilog按要求分频和调节占空比。新手,感觉问题比较复杂,请高手点拨。
条件:1.两个时钟输入,10KHZ和10MHZ;2.有四个选频的引脚sele_frq【3:0】输入,分别对应产生
1hz/5hz/10hz/50hz/100hz/1khz/5khz/10khz这9种频率;3.有3个选占空比的引脚sele_wid【2:0】输入,用来产生对应的占空比0.5us/1us/5us/10us/50us/100us/500us/1ms这8种脉宽(一周期高电平持续时间)。当有脉宽大于某频率的周期时,就不设置该脉宽。希望能够给出意见,最好能够给出相应的代码,或者主要代码也行。感激不尽!
计数分频
根据sele_frq【3:0】选择分频系数
根据sele_wid【2:0】选择占空比参数
这个我当然知道,只是怎么用两个时钟,我是想用10khz来分频,10mhz来产生占空比,能够用两个always吗,一个always @(posedge mclk or ..) 一个用always @(posedge clk or..)行不?
如果我的GLB足够的话,我肯定用一个10mhz的就轻松解决问题了,但是现在就是因为GLB不够了,所以才想着怎么能够减少GLB的使用,我贴出我写的代码,综合通过了,但是我在用波形仿真时,提示:WARNING 26567:CLK pluse width for signal D^A5_CLK violation found at 20.200ns类似这样的警告。我的程序如下:
module xc(mclk,clk,reset,sele_frq,sele_wid,clk_div);
input mclk,reset,clk;
input [3:0] sele_frq;
input [2:0] sele_wid;
output clk_div;
reg clk_div;
reg[13:0] divcount;
reg [13:0] counter1;
reg[13:0] counter2;
reg[13:0] widcount;
reg flag;
always @(sele_frq or reset) //选频
if(!reset)
divcount<=0;
else
case(sele_frq) /* synthesis full_case */
1:divcount<=1;
2:divcount<=2;
3:divcount<=10;
4:divcount<=20;
5:divcount<=100;
6:divcount<=200;
7:divcount<=1000;
8:divcount<=2000;
9:divcount<=10000;
endcase
always @(sele_wid or reset) //选脉宽
if(!reset)
widcount<=0;
else
case(sele_wid) /* synthesis full_case */
1: widcount<=5;
2:widcount<=10;
3:widcount<=50;
4:widcount<=100;
5:widcount<=500;
6:widcount<=1000;
7:widcount<=5000;
8:widcount<=10000;
endcase
always @(posedge mclk or negedge reset) //一周期高电平持续时间(脉宽)
if(!reset)
begin
counter2 <= 0;
clk_div<=1;
end
else
begin
if(counter2<widcount)
begin
counter2<=counter2+1;
clk_div<=1;
end
else
begin
clk_div<=0;
if(flag)
begin
clk_div<=1;
counter2<=0;
end
end
end
always @(posedge clk or negedge reset) //选频,一周期的持续时间
if(!reset)
counter1 <= 0;
else
begin
if(counter1<divcount-1)
begin
counter1<=counter1+1;
flag<=0;
end
else
begin
counter1<=0;
flag<=1;
end
end
endmodule
这个问题,还望您在百忙之余帮帮忙!在此先谢谢了!
正如你说的,可以优先选用10khz分频得到各个频率,这样的默认占空比应该是50%。
然后再各个时钟频率下,计算出各个占空比相应的计数值。用高频10mhz计数生成占空比。
可以同时用好多个always语句。并行执行。
?不知小编是大牛,还是只是随便一说。我是觉得这个方法不太高明,而且很多always语句并行,会存在一些问题,比如同一变量在不同always语句中赋值是不行的。不知小编能不能细说你的想法。
既然是新手,可以先把功能仿真做一做,确定代码功能可以实现后再综合做仿真,否则综合之后更多是考虑芯片内部结构的问题了,这时候同时考虑功能的话,就有点辛苦了。
也是新手。
举个例子:用10khz分频生成1khz的时钟,相当于做10分频。这样生成的是50%占空比的1khz时钟。
然后假设要生成占空比为100us的1khz时钟,用10mhz(0.1us)采样1khz的上升沿,检测到上升沿之后,保持1,直到计数到1000 (100us/0.1us), 清0. 然后继续检测1khz的上升沿,每个1khz的周期都做这样的处理,就可以改变占空比了。
然后将各种情况组合起来就好了。
我觉得应该不会有问题,你可以试试看~
首先感谢的回答,我估计你也没有看我的代码。呵呵。而你提的方案,比如就以你举的例子,我给出以下疑问:在50%占空比的1khz,你用1mhz检测到1khz的上升沿后,你通过计数1000产生时间为100us的高电平,而50%占空比的1khz高电平持续时间是500us,剩下的400u怎么处理。在这里你的10khz和10mhz是用两给always并行运行的。我感觉按你的想法很有难度。如果你感觉没有难度,能否耽误你一点时间,把主要代码写一下。感谢!
剩下的400us清0啊。1khz,其中100us高电平,剩下的400us+500us都清0.。
