在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 4788|回复: 9

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

[复制链接]
发表于 2011-12-21 10:20:34 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
用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种脉宽(一周期高电平持续时间)。当有脉宽大于某频率的周期时,就不设置该脉宽。希望能够给出意见,最好能够给出相应的代码,或者主要代码也行。感激不尽!
发表于 2011-12-22 08:17:12 | 显示全部楼层
计数分频
根据sele_frq【3:0】选择分频系数
根据sele_wid【2:0】选择占空比参数
 楼主| 发表于 2011-12-22 10:15:43 | 显示全部楼层
回复 2# qlengyu


    这个我当然知道,只是怎么用两个时钟,我是想用10khz来分频,10mhz来产生占空比,能够用两个always吗,一个always @(posedge  mclk or ..)  一个用always  @(posedge clk or..)行不?
 楼主| 发表于 2011-12-22 10:38:29 | 显示全部楼层
本帖最后由 cococenstar 于 2011-12-22 11:22 编辑

回复 2# qlengyu


    如果我的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
这个问题,还望您在百忙之余帮帮忙!在此先谢谢了!
发表于 2011-12-22 10:45:02 | 显示全部楼层
正如你说的,可以优先选用10khz分频得到各个频率,这样的默认占空比应该是50%。。
然后再各个时钟频率下,计算出各个占空比相应的计数值。。用高频10mhz计数生成占空比。。

可以同时用好多个always语句。。。并行执行。。
 楼主| 发表于 2011-12-22 11:38:38 | 显示全部楼层
回复 5# wyj_whu


    ??不知楼主是大牛,还是只是随便一说。我是觉得这个方法不太高明,而且很多always语句并行,会存在一些问题,比如同一变量在不同always语句中赋值是不行的。不知楼主能不能细说你的想法。
发表于 2011-12-22 12:00:12 | 显示全部楼层
既然是新手,可以先把功能仿真做一做,确定代码功能可以实现后再综合做仿真,否则综合之后更多是考虑芯片内部结构的问题了,这时候同时考虑功能的话,就有点辛苦了。
发表于 2011-12-22 14:01:55 | 显示全部楼层
回复 6# cococenstar


    也是新手。。。

    举个例子:用10khz分频生成1khz的时钟,相当于做10分频。。。这样生成的是50%占空比的1khz时钟。
                  然后假设要生成占空比为100us的1khz时钟,用10mhz(0.1us)采样1khz的上升沿,检测到上升沿之后,保持1,直到计数到1000 (100us/0.1us), 清0. 然后继续检测1khz的上升沿,每个1khz的周期都做这样的处理,就可以改变占空比了。

    然后将各种情况组合起来就好了。
    我觉得应该不会有问题,你可以试试看~
 楼主| 发表于 2011-12-22 16:50:56 | 显示全部楼层
回复 8# wyj_whu

首先感谢的回答,我估计你也没有看我的代码。。呵呵。而你提的方案,比如就以你举的例子,我给出以下疑问:在50%占空比的1khz,你用1mhz检测到1khz的上升沿后,你通过计数1000产生时间为100us的高电平,而50%占空比的1khz高电平持续时间是500us,剩下的400u怎么处理。在这里你的10khz和10mhz是用两给always并行运行的。我感觉按你的想法很有难度。如果你感觉没有难度,能否耽误你一点时间,把主要代码写一下。感谢!
发表于 2011-12-23 14:30:06 | 显示全部楼层
剩下的400us清0啊。。1khz,其中100us高电平,剩下的400us+500us都清0.。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条

×

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-4-28 03:46 , Processed in 0.034909 second(s), 6 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表