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

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

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 3839|回复: 14

[求助] 菜鸟请教代码问题

[复制链接]
发表于 2012-2-11 13:32:02 | 显示全部楼层 |阅读模式

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

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

x
代码功能如下:
fq_chs:通过不同的confg0,confg1,confg2选择输出的fq_out为频率略有差别的时钟信号。在一段时间内对fq_out进行计数输出  
          cnt_numb。
问题:1.代码风格有没有问题,如果有,怎么改进?
       2.写testbench测试confg不同cnt_numb数值时,会出现一些未知的不定态,我问题出在哪?

fq_chs fq_chs(.ctrl(ctrl),.confg0(confg0),.confg1(confg1),
                     .confg2(confg2),.fq_out(fq_out));
always@(negedge cnt_rst or posedge clk_std)
   begin
     if(!cnt_rst)
       std_numb <= 8'h0;
     else
       std_numb <= std_numb+1;
   end
  assign compare_out=(std_numb==8'h77)?1:0;  
  always@(negedge cnt_rst or posedge compare_out)
   begin
     if(!cnt_rst)
       param<=0;
     else
       param<=1;
   end   
  always@(negedge cnt_rst or posedge fq_out )
     begin
       if(!cnt_rst)
          cnt_numb <= 8'h0;
       else
          if(param)
            cnt_numb<=cnt_numb;
          else
            cnt_numb<=cnt_numb+1;      
     end
发表于 2012-2-11 14:03:17 | 显示全部楼层
你的param会是个latch。 最后的 if(param) cnt_numb<=cnt_numb; 没有必要。实际等效是 if(!param) cnt_numb <= cnt_numb + 1;
 楼主| 发表于 2012-2-11 14:09:08 | 显示全部楼层
本帖最后由 longjilb 于 2012-2-11 14:30 编辑

回复 2# freeme_up

谢谢。。latch会造成什么影响?怎么改为好
发表于 2012-2-11 14:28:24 | 显示全部楼层
当 第一个posedge compare_out出现以后,param就不会再变了。

不太清楚你的第三态是什么意思,Z?
 楼主| 发表于 2012-2-11 15:33:12 | 显示全部楼层
本帖最后由 longjilb 于 2012-2-11 17:22 编辑

回复 4# freeme_up


不确定状态,X。
我的目的是:在标准时钟clk_std作用一定(比方说500个)周期,在这段时间来对f_out计数,从而测f_out的频率。所以我要param保持不变。
我把latch改成如下之后还是仿真还是会出现部分X状态
  always@(negedge cnt_rst or posedge fq_out or posedge param )
     begin
       if(!cnt_rst)
          cnt_numb <= 8'h0;
       else
          if(param)
            cnt_numb<=cnt_numb;
          else
            cnt_numb<=cnt_numb+1;      
     end
发表于 2012-2-12 05:22:56 | 显示全部楼层
always@(negedge cnt_rst or posedge clk_std)
   begin
     if(!cnt_rst)
       std_numb <= 8'h0;
     else
       std_numb <= std_numb+1;
   end

  always@(negedge cnt_rst or posedge fq_out )
       if(!cnt_rst)  
            cnt_numb <= 8'h0;
       else if(std_numb <= 8'h77)
            cnt_numb<=<=cnt_numb+1;
  
逻辑上应该实现你所想象的功能。除非你的fq_chs里面有其他的bug
发表于 2012-2-12 07:56:29 | 显示全部楼层
问题:
       2.写testbench测试confg不同cnt_numb数值时,会出现一些未知的不定态,我问题出在哪?
你这个问题本身就有问题。根据你的code,cnt_numb怎么可以config呢?
cnt_numb是这个always block控制的,测定是多少就是多少。不知道你说的config是何意思?
发表于 2012-2-12 08:00:08 | 显示全部楼层
你要测频率,也可以对待测时钟进行分频,让后用基准clock去测分频后的高电平或低电平长。这样不是思路很清晰吗?
 楼主| 发表于 2012-2-12 09:59:23 | 显示全部楼层
本帖最后由 longjilb 于 2012-2-12 10:03 编辑

回复 7# wrhwindboy

我在问题中有提到:always block前面还有个模块
    fq_chs fq_chs(.ctrl(ctrl),.confg0(confg0),.confg1(confg1),
                     .confg2(confg2),.fq_out(fq_out));
fq_chs:通过不同的confg0,confg1,confg2选择输出的fq_out为频率略有差别的时钟信号。我指的confg就是信号confg0,confg1,confg2
发表于 2012-2-12 11:02:59 | 显示全部楼层
周末闲着也是闲着,以下是我的思路写出的TB程序。既然是 TB就不必拘泥于正沿、负沿。

没测过,仅供参考。
reg [1:0] detector;
reg [7:0] cycle_cnt, std_numb;
wire raise_edge;

always @(negedge clk_std) detector <= {detector[0],fq_out};

assign raise_edge = (detector == 2'b01)? 1:0;

always @(posedge clk_std or negedge cnt_rst)
  begin
    if(!cnt_rst) begin
      cycle_cnt <= 'h0; std_numb = 'h0;
    end
    else begin
      if(cycle_cnt >1) begin
        if(cycle_cnt[0] == 0 && std_numb <= 8'h77) std_numb = std_numb + 1;
        else begin
          $display("time %4d std_numb = %h", $time, std_numb);
        end
      end
      if(raise_edge) cycle_cnt <= cycle_cnt + 1;
    end
  end
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

X

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

GMT+8, 2025-6-9 05:35 , Processed in 0.023390 second(s), 7 queries , Gzip On, MemCached On.

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