微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > 帮忙看下代码问题

帮忙看下代码问题

时间:10-02 整理:3721RD 点击:





能否抽点时间帮我看一下。
原始代码:
module COUNTER(              
              Rst,
                Clk_ro,      
                Clk_std,
               Cnt_numb);
input Rst;
input Clk_ro;
input Clk_std;
output [7:0]Cnt_numb;
reg Flag_ro;
wire Flag_std;
reg bdat1;
reg bdat2;
reg [7:0]Ro_numb;
reg [7:0]Cnt_numb;
  
always@(negedge Rst or posedge Clk_ro)
   begin
     if(!Rst)
       begin
         Ro_numb <= 8'h00;
         Flag_ro<=0;
       end
     else
       if(Ro_numb==8'h77)
          Flag_ro<=1;
       else
          Ro_numb <= Ro_numb+1;
   end
always@(negedge Rst or posedge Clk_std)
   begin
     if(!Rst)
       {bdat2,bdat1}<=2'b00;
     else
       {bdat2,bdat1}<={bdat1,Flag_ro};
   end
assign Flag_std=bdat2;   
  
always@(negedge Rst or posedge Clk_std)
   begin
      if(!Rst)
         Cnt_numb<=8'h00;
      else
        if(Flag_std==0)         
           Cnt_numb<=Cnt_numb+1;
        else ;
  end
endmodule
测试文件:
initial
  begin
        Rst=0;
        Clk_ro=0;
        Clk_std=0;
    #20  Rst=1;
    #2000  Rst=0;
    #20  Rst=1;
    #2000 Rst=0;
    #20  Rst=1;
    #2000  Rst=0;
    #20  Rst=1;
  end
always #5 Clk_std=~Clk_std;
always #20 Clk_ro=~Clk_ro;
initial
  begin
    #10000;
    $stop;
  end

不好意思哈,第一次发图片,有点乱。也没找到删除的地方

我不知道你这个代码想要实现什么功能,但是这段代码
     else
       if(Ro_numb==8'h77)
          Flag_ro<=1;
       else
          Ro_numb <= Ro_numb+1;
会把Ro_numb固定在8'h77上的.
另外,你的仿真rst信号给的时间点不对导致unknown出来了



  Cnt_numb固定在这个值是我想要的。请教下Rst给的时间点不对指的是?

从波形看,好像rst和clk同时跳变,虽然前仿没有时序问题,但是同时变化会有问题的,你最好错开一点时间.
另外你的问题到底是什么,你还没说过?



    我的问题其实就在这,clk频率相对rst来说变化会很快,我怎么去控制这两个不同时变化呢。尤其是在后仿真有布线延时的影响会变得很难去估计吧


用时钟去同步复位信号,寄存器用异步复位,仿真的时候同步器要用非时序模型代替



   十分感谢。仿真的时候同步器要用非时序模型代替。这句话是什么意思哦

异步复位同步撤离。

你这个是后仿的么?貌似加了timingcheck啊,理由上面的人已经说了,clk_ro和rst同时作用的问题。你可以通过以下方法来做:
1. 用clk_ro和clk_std同步rst生成每个时钟域的rst。如下:
always @ ( negedge clk_ro )
  begin
     rst_ro_sync1 <= rst;
     rst_ro_sync2 <= rst_ro_sync1;
  end
always @ ( negedge clk_std )
  begin
    rst_std_sync1 <= rst;
    rst_std_sync2 <= rst_std_sync1;
  end
然后使用rst_ro_sync2作为clk_ro的异步复位,使用rst_std_sync2作为clk_std的异步复位。
需要注意:clk_std和clk_ro要是一直有的,不能被门控,或者说不能跟rst有关系。另外,仿真还是会出问题,我不知道modelsim怎么设置,你在vcs里面应该对rst_ro_sync1和rst_std_sync1设置notimingcheck,否则的话还是会有x,虽然实际电路中不会有x。
2.如果你只是想仿真的话。在testbench里面用以下语句来释放rst。
initial
  begin
    rst = 1'b0;
    .....
    @(negedge clk_ro); //这里也有可能使用clk_std。
    #10; //这个延迟是根据clk_ro和clk_std之间的相位关系来设置,保证clk_ro没问题后,clk_std也没问题。
    rst = 1'b1;
    ......
   end
这个方法就是去适应仿真器脾气的。玩玩的时候用用就可以了。

这种情况还没有遇到过,另外有个问题,你的仿真都没有放到过Ro_numb==8'h77的情况么?

学习!

是想通过已经标准时钟频率,测量未知输入时钟频率吗?



    是的,不知这样可行不

功能上好像没有问题的,但建议先做功能仿真,功能仿真通过了再考虑后仿真或者实现

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

网站地图

Top