请教一个问题,老鸟们请指教。
process (clk)
begin
if rising_edge (clk) then
S_1<=S_1 +1;
O_1<=S_1;
else
null;
end if;
end process;
其中,S_1是signal(std_logic_vector (3 downto 0)),O_1 是输出,连接到IO引脚上。
问题来了:
当我把输出的赋值(O_1<=S_1)放在进程外面的时候,仿真结果变了,O_1的值变化要比之前的程序快上一个周期,但是当我查看technology schmatic的时候,发现这两个程序所形成的technology schmatic并没有区别,这是为什么?
前者受到时钟的采样,所以晚一拍。至于为什么原理图上一样,不好解释了。
2# gaurson
可否这么理解:
当输出赋值语句在process里面的时候,输出的变化以时钟的上升沿为触发条件,即以clk上升沿为敏感信号;
当输出赋值语句在process外面的时候,输出的变化有时钟的上升沿和输入信号两个敏感元。
呵呵
不知道我说的对不对。
第一个理解是正确的,第二个理解在process外应该没有敏感的概念,如果在process外部,可能综合出来就是一条连线而已。在process里面应该是受到时序处理中顺序执行的控制,在process外面的话,则两个进程处于并发执行的控制。
我觉得你说的很有道理,但是为什么两者的technology SChmatic是一样的呢?
呵呵,有没有感兴趣的,大家一起讨论讨论啊!
另外,对于“Process内语句是顺序执行”这句话我一直不太理解,
例如:
process(clk)
begin
if rising_edge (clk) then
A<=B;
C<=D;
E<=F;
else
null;
end if;
end process;
这个程序中,综合出来的结果,从硬件上来看应该是并行的,但为什么说是“顺序执行”?难道说“顺序执行”的意思是综合的时候从第一句开始顺序综合?
我觉得你是看错了图了吧?不可能一样啊。或者到chip planner上看一下。
没看错,
chipplaner是什么?
7# cdsmakc
6# qd0090
通常意义上是顺序执行,但是如果在时序控制下的<=赋值,需要考虑一个时间点上纵向的问题,而不是横向时间的问题。如果你在这里换成:=赋值,就能看到是顺序执行了。
继续求解
就像verilog里面的阻塞与非阻塞赋值一样,会差一个时钟周期;
technology SChmatic里面不应该一样的吧,前者是不是要有个输入与输出的闭环连接呢?
就像verilog里面的阻塞与非阻塞赋值一样,会差一个时钟周期;
technology SChmatic里面不应该一样的吧,前者是不是要有个输入与输出的闭环连接呢?
继续关注中。
放在外面,赋值不延迟!里面延迟一个时钟周期~
1# qd0090
大哥你说的快一个周期是对的。没啥问题,放外面肯定要先一个时钟step出来结果,
至于你说的 schmatic里面看到的一样,我严重怀疑,打死我也不相信啊。
写代码的关键不是像C语言一样,写C语言的关键是流程图要清晰,写RTL CODE的关键是BLOCK图要清晰,HDL的语言是 hardware discription language 注意其中的D是discription的意思,而不是design的意思这个就是他的关键所在
