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

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

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 7638|回复: 15

[求助] modelsim分模块仿真的延时问题

[复制链接]
发表于 2013-5-19 20:25:40 | 显示全部楼层 |阅读模式

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

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

x
在编写代码时,开始写在一个模块里,实现了目标功能。后来,想把每个模块的功能细化一下,就把之前的整体代码分解成了几个子模块,再用上层模块调用,可是分解为子模块后,信号延迟了一个时间周期。

为什么会产生延迟,怎样才能分模块并取消延迟?
还有,怎样的代码风格是好的呢?我这种写法有什么问题呢?
PS:原代码要复杂一些,需要阻塞赋值。

我把我的代码简化成了下面的样子,仿真效果如图

整体模块的实现:
==============================================
`timescale 1ns/10ps
module all_in_one(clk,rst,a,b,k);
  input clk;
  input rst;
  input a;
  output k;
  output b;
  reg k;
  reg b;

  always@(posedge clk or negedge rst)
  begin
  if(!rst)
    begin
      k=1'b0;
      b=1'b0;
    end
  else
    if(a==0)
      k=1'b0;
    else
      k=1'b1;

  if(k==0)
    b=1'b0;
  else
    b=1'b1;
  end

    endmodule





分解为子模块的的代码
===========================================
`timescale 1ns/10ps
module module_1(clk,rst,a,k);
  input clk;
  input rst;
  input a;
  output k;
  reg k;

  always@(posedge clk or negedge rst)
  if(!rst)
    k=1'b0;
  else
    if(a==0)
      k=1'b0;
    else
      k=1'b1;

endmodule

————————————————————————————————————
`timescale 1ns/10ps
module module_2(clk,rst,a,k,b);
  input clk;
  input rst;
  input a;
  input k;
  output b;
  reg b;

  always@(posedge clk or negedge rst)
  if(!rst)
    b=1'b0;
  else
    if(k==1)
      b=1'b1;
    else
      b=1'b0;

endmodule

------------------------------------------------------------------
`timescale 1ns/10ps
module module_top(clk,rst,a,k,b);
  input clk;
  input rst;
  input a;
  output b;
  output k;

  module_1 module_1_try(.clk(clk),.rst(rst),.a(a),.k(k));
  module_2 module_2_try(.clk(clk),.rst(rst),.a(a),.k(k),.b(b));

  endmodule


提问.png
 楼主| 发表于 2013-5-19 21:35:03 | 显示全部楼层
求各位大大发表看法 能拓宽一下我的思路也好啊
发表于 2013-5-19 23:07:28 | 显示全部楼层
时序逻辑里面阻塞赋值是不对滴!
 楼主| 发表于 2013-5-19 23:29:05 | 显示全部楼层
回复 3# tiangua
唔 完全不可以吗  我有把全代码都改成非阻塞赋值过,然后延迟悲剧的变成了两个时钟周期,感觉还没阻塞的效果好,于是就选用阻塞了 - -! 是我的代码编写思路有问题么?
发表于 2013-5-20 09:20:08 | 显示全部楼层
把module_2中
if(k==1)
改为
if(a==1)
 楼主| 发表于 2013-5-20 09:40:04 | 显示全部楼层
回复 5# 加油99
额 可能是我把代码简化后a和k的功能看起来重复了吧,但在具体的代码中,a是10位的,k是1位的,k要根据a的取值来决定,而b的值不仅与k有关也跟其他的参数有关,我只是为了问题的简明把其他的参数去掉了

其实,我问题的关键是,为什么会产生延时?
发表于 2013-5-20 09:56:14 | 显示全部楼层
从你贴出来的代码看,分解后的和未分解的并不等价。
 楼主| 发表于 2013-5-20 10:31:03 | 显示全部楼层
回复 7# 加油99

是指在model_2里 if(k==1)
      b=1'b1;
    else
      b=1'b0;
在if(!rst)的嵌套里吗? 我把这一段拿出来了,改成了和all_in_one一样和复位语句并列的样子了,仿真出来后还是有一个时钟周期的延时。

求问大大,还有哪里是我没注意到的吗?
发表于 2013-5-20 10:59:58 | 显示全部楼层
未分解的时候,a决定k的值,这个k又决定b的值。所以我在5楼的改法,是与未分解的等价的。如果这样改后,仿真波形还有差异,我也不知道了。
 楼主| 发表于 2013-5-20 11:22:30 | 显示全部楼层
回复 9# 加油99

去掉a和b中间的过渡k后,波形确实一样了。 可是这样就是a决定b了。在应用的时候我想用k控制b,我的写法上是在哪里不等价呢
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

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

GMT+8, 2024-11-16 14:04 , Processed in 0.027491 second(s), 10 queries , Gzip On, Redis On.

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