程序:
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位数据是随机产生的,仿真结果的截图放在附件了。
本人新手,求高人解答。
此帖出自
小平头技术问答
我用最简单的方式回答一下吧。
下面是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是在时钟上升沿后变化的。
always@(posedge clk)
A<=B;
B<=C;
endmodule
(verilog我不熟,不知对不对,意思就是上升沿, A<=B;B<=C;)
你后仿一下看看,就可以明显看到,A,B的变化都是延迟与时钟的。
所以有些人写代码时,会A<=B# 2;这么写,
我认为这样就可以在前仿真时,看到延迟,节省仿真时间。
verilog VHDL是硬件描述语言,不要从软件的角度考虑问题,那样是行不通的。
谢谢,以后我会注意的!
特别要注意"描述" 两字, 不是C语言.
程序最终结果要看电路执行的结果. 所以不是每句话,都有硬件电路执行!
一周热门 更多>