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

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

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 4349|回复: 10

[求助] 主时钟clk的分频信号 能在always中 作为被检测的时钟么? 下面是我遇到的问题

[复制链接]
发表于 2011-11-16 13:06:59 | 显示全部楼层 |阅读模式

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

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

x
module music(clk,ret,fm,fm1,fm2);
  input clk;
  input ret;
  output fm,fm1,fm2;
  reg clk1;
  reg clk2;
  reg h,fm;
  reg [9:0] cnt;
  reg [5:0] cnt1;
  reg [2:0] cnt2;
  reg [2:0]  cnt3;
  reg  [5:0] div;
  parameter a=6'd50,
            b=6'd40,
            c=6'd30,
            d=6'd20,
            e=6'd10,
            f=6'd5;
  
  
  always @(posedge clk or posedge ret)
  if(!ret)
    begin
      clk1<=0;
      cnt1<=0;
    end
  else
    if(cnt1==6'b111111)
      begin
        clk1<=~clk1;
        cnt1<=0;
      end
    else
      cnt1<=cnt1+1;
     
     
     always @(posedge clk or posedge ret)
     if(!ret)
       begin
          clk2<=0;
          cnt2<=0;
       end
     else
       if(cnt2==3'b111)
         begin
           clk2<=~clk2;
           cnt2<=0;
           end
      else
        cnt2<=cnt2+1;
        
        
   always @(posedge clk1  or posedge ret)
    if(!ret)
      begin
        fm<=0;
        cnt<=0;
      end
    else if(cnt==10)
       begin
         fm<=~fm;
         cnt<=0;
       end
     else
       cnt<=cnt+1;
      
      
      
/* always @( posedge clk2 or posedge ret)
    begin
      if(!ret)
          begin
           cnt3<=0;
          end
      else
          if(cnt3==3'b101)
            cnt3<=0;
          else
            cnt3<=cnt3+1;
            case(cnt3)
              0: div=a;
              1: div=b;
              2: div=c;
              3: div=d;
              4: div=e;
              5: div=f;
              default : div=0;
            endcase
    end */
              
        
         
      assign fm1=clk1;
      assign fm2=clk2;
     // assign fm=h;
      
      
   endmodule



整个程序中 为什么 红色的部分 我用clk产生的分频信号 clk1 去做被检测的时钟  fm 就没有输出;

而如果 我把 clk1 换成 clk 输出就是正常的  求教 !!
发表于 2011-11-16 13:39:13 | 显示全部楼层
综合成了不能预知的逻辑,把always @(posedge clk or posedge ret)换成always @(posedge clk or negedge ret)试试。
 楼主| 发表于 2011-11-16 14:31:16 | 显示全部楼层
回复 2# wjhdmmm


    您太棒了 谢谢您 这样就可以了 但是 我不明白 为什么上升沿 会出现逻辑的错误  这就是这门学问的潜规则么?
发表于 2011-11-16 19:43:03 | 显示全部楼层
回复 3# leomeng

你程序中用的是if( !ret )就代表的是下降沿。如果用if(ret)就是上升沿,我推荐你用同步复位,即always @( posedge clk)。
发表于 2011-11-17 00:35:12 | 显示全部楼层



方法一:把红色代码部分的posedge ret改成negedge ret这么明显的问题....
你用posedge ret 触发,然后还用!ret 检测..
方法二:把红色always里面的的复位信号判断改成ret,即去掉"!"
 楼主| 发表于 2011-11-17 15:03:24 | 显示全部楼层
回复 5# jack888518


    我是新手 以前没有太注意 现在理解了   自学的 所以好多地方感觉会了 但是理解的不到位 在实践中 问题就暴露出来了 谢谢大家的帮助
 楼主| 发表于 2011-11-17 15:07:10 | 显示全部楼层
回复 4# wjhdmmm


    谢谢啊 我自己做的音乐发生器  根本听不出来 是什么玩意  努力的修改中  自学累 写代码累 检查代码更累   ;我把代码 用modelsim 仿真 时间太久了 有好办法不 ,我把数换 小了 逻辑是对的 但是换大了 下到板子中 却乱七八糟的
发表于 2011-11-17 15:08:26 | 显示全部楼层
你的代码可以综合通过? 肯定综合都过不了的
 楼主| 发表于 2011-11-17 21:39:54 | 显示全部楼层
回复 8# kalote module music(clk,ret,fm,fm1,fm2,div);
  input clk;
  input ret;
  output fm,fm1,fm2;
  output [12:0] div;
  reg clk1;
  reg clk2;
  reg h;
  reg [12:0] cnt;
  reg [23:0] cnt1;
  reg [2:0] cnt2;
  reg [4:0]  cnt3;
  reg  [12:0] div;
  parameter
            x=13'd0,
            m1=13'd4777,
            m2=13'd4257,
            m3=13'd3792,
            m5=13'd3189,
            m6=13'd2841,
            h1=13'd2389,
            h2=13'd2128,
            h3=13'd1896;
  
  
  always @(posedge clk or negedge ret)
  if(!ret)
    begin
      clk1<=0;
      cnt1<=0;
    end
  else
    if(cnt1==24'd6249999)
      begin
        clk1<=~clk1;
        cnt1<=0;
      end
    else
      cnt1<=cnt1+1;
     
     
     always @(posedge clk or negedge ret)
     if(!ret)
       begin
          clk2<=0;
          cnt2<=0;
       end
     else
       if(cnt2==3'd4)
         begin
           clk2<=~clk2;
           cnt2<=0;
           end
      else
        cnt2<=cnt2+1;
        
        
   always @(posedge clk2  or negedge ret)
    if(!ret)
      begin
        h<=0;
        cnt<=0;
      end
    else if(cnt==div)
       begin
         h<=~h;
         cnt<=0;
       end
     else
       cnt<=cnt+1;
      
      
      
always @( posedge clk1 or negedge ret)
    begin
      if(!ret)
          begin
           cnt3<=0;
          end
      else
          if(cnt3==5'd19)
            cnt3<=0;
          else
            cnt3<=cnt3+1;
            case(cnt3)
              0: div=x;
              1: div=x;
              2: div=m6;
              3: div=m6;
              4: div=m5;
              5: div=m5;
              6: div=m6;
              6: div=m6;
              7: div=m3;
              8: div=m3;
              9: div=m3;
              10: div=m5;
              11: div=m2;
              12: div=m2;
              13: div=m1;
              14: div=m1;
              15: div=m1;
              16: div=m2;
              17: div=m2;
              18: div=m3;
              19: div=m2;
              default : div=12'hfff;
            endcase
    end
      assign fm1=clk1;
      assign fm2=clk2;
      assign fm=h;
      
      
   endmodule

这个是我修改后的  fm接蜂鸣器 可以演奏音乐的
发表于 2011-11-17 22:12:41 | 显示全部楼层


回复  wjhdmmm


    谢谢啊 我自己做的音乐发生器  根本听不出来 是什么玩意  努力的修改中  自学累 写 ...
leomeng 发表于 2011-11-17 15:07




    根据你写的代码,我看着是产生了不同频率的时钟,然后根据这些不同频率的时候综合产生了cnt3,再由cnt3生成输出的div。
音乐的8个音阶是由于频率不同而发音不同,如果你打算在modelsim仿真时,时间能变短,不妨你的基准clk可以适当选择小一些,可以适当的从比较大的时钟输入分频到比较小的范围内,这样你再产生clk1和clk2的时候计数器的值就不会太大了。另外,你仿真文件中的时间精度`timescale xxns/xns可以适当增大一些,这样也可以帮助你减小仿真时间。
   当然,最重要的是,你修改了基准clk以后,div的赋值你要自己选择好。时间精度要选择能整除你div的。仅供参考
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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


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

GMT+8, 2024-11-22 10:05 , Processed in 0.031128 second(s), 7 queries , Gzip On, Redis On.

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