微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > verilog按要求分频和调节占空比。新手,感觉问题比较复杂,请高手点拨。

verilog按要求分频和调节占空比。新手,感觉问题比较复杂,请高手点拨。

时间:10-02 整理:3721RD 点击:
用Lattice的isplsi1016E,16个GLB。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.。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top