微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > 主时钟clk的分频信号 能在always中 作为被检测的时钟么? 下面是我遇到的问题

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

时间:10-02 整理:3721RD 点击:
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 输出就是正常的  求教 !

综合成了不能预知的逻辑,把always @(posedge clk or posedge ret)换成always @(posedge clk or negedge ret)试试。



    您太棒了 谢谢您 这样就可以了 但是 我不明白 为什么上升沿 会出现逻辑的错误  这就是这门学问的潜规则么?


你程序中用的是if( !ret )就代表的是下降沿。如果用if(ret)就是上升沿,我推荐你用同步复位,即always @( posedge clk)。

方法一:把红色代码部分的posedge ret改成negedge ret这么明显的问题....
你用posedge ret 触发,然后还用!ret 检测..
方法二:把红色always里面的的复位信号判断改成ret,即去掉"!"



    我是新手 以前没有太注意 现在理解了   自学的 所以好多地方感觉会了 但是理解的不到位 在实践中 问题就暴露出来了 谢谢大家的帮助



    谢谢啊 我自己做的音乐发生器  根本听不出来 是什么玩意  努力的修改中  自学累 写代码累 检查代码更累   ;我把代码 用modelsim 仿真 时间太久了 有好办法不 ,我把数换 小了 逻辑是对的 但是换大了 下到板子中 却乱七八糟的

你的代码可以综合通过? 肯定综合都过不了的


这个是我修改后的  fm接蜂鸣器 可以演奏音乐的

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

学习中……

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

网站地图

Top