后仿真的结果不对,求解!

2019-03-25 10:25发布

程序: module time_delay_reg(in,
                      clk  ,reset ,out
           );
  input[11:0] in;
   input clk,reset;
  output[11:0] out;
   
  reg[11:0] out;
  always@(posedge clk)
  if(reset)
      out<=12'b0;
   else 
      out<=in;
   endmodule 用这个程序仿真出现的结果竟然不对,输入的12位数据是随机产生的,仿真结果的截图放在附件了。 本人新手,求高人解答。
此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
12条回答
x1022as
1楼-- · 2019-03-26 20:05
单从简单的仿真图上就看到这么多东西,太厉害了,受教受教!!!!
x1022as
2楼-- · 2019-03-27 00:54
 精彩回答 2  元偷偷看……
qd0090
3楼-- · 2019-03-27 04:06

我用最简单的方式回答一下吧。
下面是2个DFF的串联,假设A的初值是1,B的初值是0

假设DFF都是上升沿触发的,

由于1.DFF是沿触发 2.DFF是需要一定的响应时间 3.FPGA中clock tree可以保证在其中的所有DFF的时钟上升沿同时到达。

所以得出结论:当第一个时钟上升沿来临时,此时A从1=》0,B从0=》1

当第二个时钟升沿来临时,此时A保持0,B从1=》0.

目前你可以简单理解为:在第一个时钟上升沿来临时,A还没有来得及改变,所以B看到的是1,而且是一个“稳定”的1.

 

这里要注意,A是FPGA内部的信号,它是与时钟同步,而且一定是延迟与时钟上升沿的(原因如上)

 

 

 

你的问题在于,将A从FPGA内部拿到了FPGA外部,无法保证A是在时钟上升沿后变化的。

 

 

[ 本帖最后由 qd0090 于 2011-4-25 21:17 编辑 ]
qd0090
4楼-- · 2019-03-27 09:46
你可以写一个简单的代码,如下
always@(posedge clk)
 A<=B;
 B<=C;
   endmodule
(verilog我不熟,不知对不对,意思就是上升沿, A<=B;B<=C;)
你后仿一下看看,就可以明显看到,A,B的变化都是延迟与时钟的。
所以有些人写代码时,会A<=B# 2;这么写,
我认为这样就可以在前仿真时,看到延迟,节省仿真时间。

verilog VHDL是硬件描述语言,不要从软件的角度考虑问题,那样是行不通的。
x1022as
5楼-- · 2019-03-27 13:43
“verilog VHDL是硬件描述语言,不要从软件的角度考虑问题,那样是行不通的。”
谢谢,以后我会注意的!
eeleader
6楼-- · 2019-03-27 16:07

特别要注意"描述" 两字, 不是C语言.

 

程序最终结果要看电路执行的结果.  所以不是每句话,都有硬件电路执行!

一周热门 更多>