写VHDL程序时想到的一个问题,请指教,if (clk'event and clk=0)
if (clk'event and clk=0)
.......
.......
end if
在下降沿来的时候,开始执行里面的语句。
我的问题是:if 里面的语句是在下降沿来了之后开始执行,如果if里面的语句很多,多到在下个上升沿来的时候还没执行完,会出现什么状况呢?
我不明白在下降沿来了之后(即:clk'event and clk=0),里面的语句是不是一定在半个时钟周期内执行完?
或是:clk'event and clk=0 只起到一个激发语句执行的作用?无论里面的语句执行多长时间都可以?
请大家指教。
谢谢
小编这是杞人忧天啊....不会出现小编说的那样的情况的..在进程内,多条语句并行执行,
那么可以无限多的语句吗?
里面有很多process进程等,process里是顺序执行的。我只想明白 下降沿 的作用,是不是程序必须在下个上升沿来之前执行完?或是无所谓,下降沿来了就开始执行,直到执行完为止,不管上升沿是不是来了?
下降沿来了就执行,很快的,应该没有小编想得那么漫长...可以看下仿真波形图就知道了...
呵呵,我只想知道我说的那种情况发生后会怎么样?
因为我要做一个傅里叶变换在process里,有modulation 和 demodulation.
谢谢
还有人解释吗,呵呵
有时钟是顺序执行的,但不会什么无止境的执行,只可能有延迟的吧
如果你在写代码的时候想的是硬件,就不会有这个疑惑了,实际上就是时钟在驱动很多的触发器完成一个操作,所以就不会有完不成一说(如果真有就是你的设计放到fpga里面,要用更大的FPGA),也不回有上升沿来不来的问题的。如果说你的组合逻辑在一个时钟周期内完成不了,那么你需要进行优化你的组合逻辑,或者约束成多周期。
建议你去看看verilog的相关语法解释标准。
其实多数仿真软件在一个时钟点上是分4个delta时间的,每个detal时间内会执行某些特定的操作或运算。执行完后,时间才往上加。
如果你的设计中的某些部分的输入,来自于你的设计中的其它部分的输出,那么就有可能存在时间问题。
此时要考虑使用逻辑拆分及流水线方式。
除此之外,没有时间问题,因为所有的代码(只要没有上面所说的前后级的关联)都是并行实现的
同意8楼的说法,建议小编先去写代码前先想想基本的硬件应该怎样搭电路,这样就不会有类似的疑问了。
谢谢啦
谢谢啦
如果有演算或很长的if else语句,有可能来不及的。需要自己优化。
谢谢
很多的else if和演算, 可能是这个情况
获益匪浅啊,呵呵
我也是,呵呵,多问多学嘛,等明白的多了再多给别人解答,好论坛就是这么形成的,呵呵
综合的时候,系统时钟速率会上不去,有时需要用流水线结构,有的综合工具会自动实现这点的。
谢谢
又学了一点,呵呵
如果没说错的话,发帖以前写软件,然后用软件的思想去想if-else,做硬件最好还是先看看硬件设计的一些基本原理。
说的有道理
应该多看看书,呵呵
楼上说的“都是平行执行的”,在process中是串行的吧
我觉着glenchan 说法正确。
“process” 内顺序执行指的是逻辑层面上,合成工具为正确理解设计者的意思而言,并非实际硬件电路上具有 ”顺序执行” 的特性。
例如:
process (a, b)
begin
if a=’0’ then
c <= b;
else
c <= not b;
end if;
end process;
就concurrent电路的角度来看,在一块电路中,同时将c设为b,与not b是自我矛盾的。但是就process内来看,则受到a的条件制约,在a = ‘0’ 的条件成立时,与不成立时,分别指定不同的信号。
合成时,会以一由信号a选择的双输入multiplexer切换选择b与not b的信号,并将multiplexer的输出指定给c。
亦即,若将MUX的输入与输出关系给考虑进来,就能正确理解电路的功能:
MUX_SEL <= a; -- multiplexer SELECT input
MUX_IN0 <= b; -- multiplexer IN0, enabled if MUX_SEL = ‘0’
MUX_IN1 <= not b; -- multiplexer IN1, enabled if MUX_SEL = ‘1’
c <= MUX_O; -- multiplexer output
实际硬件电路上,b与not b这两条路径的运算,分别有各自独立的电路,在信号b进入模块后是同时执行的。
此时,电路的最长时间延迟,包括一个not 闸,与一个MUX的delay。最短时间延迟,则仅包括一个MUX。
这种现象,与透过CPU或micro-controller顺序执行程序代码的概念有很大的不同。
另一个例子如:
process ( clk )
begin
if clk’event and clk=’0’ then
if a=’0’ then
c <= b;
else
c <= not b;
end if;
end if;
end process;
在这个电路中,由于指定了下降沿产生变化的信号c,所以会infer一个register存储组件。
但是,此时multiplexer的输出就不会直接指定给c,实际上是指定给register的输入,经过clk触发后的register输出才接到c。
此时电路的最长时间延迟,包括not、MUX与一个FF。
此时就牵涉到clk的period时间长度、输入信号a、b、运算所需时间、register的setup与hold time等时序上的问题。
进一步又牵涉到输入信号a, b的来源是asynchronous或synchronous、clock domain、clock skew、net delay等问题。深入的话就谈不完了。
但是针对顶层所提的问题来讲,确实:
1. 时序电路在process里面,确实要考虑到clock period timing与运算延迟的问题。但是,各别的信号路径所产生的运算延迟,是分开计算的,而非依序迭加计算的。
2. 换句话说,发生信号延迟无法满足时序要求的时候,首要针对最长路径来作分析与优化。
3. 最后,每一条路径的运算都是同时在进行的,这跟CPU执行软件的概念有很大的差异,要特别留意的。
4. 最后的最后,注意实务上每个模块彼此间的信号交连的过程中,除频率频率外还牵涉到时域差异的问题,设计时间没考虑清楚的话,在模拟与测试过程中易有各种奇怪的意外发生。
个人认为小编的问题在于,小编将vhdl当作C语言去分析了。其实PROCESS对应的是一块电路,而不是一段程序。写这个代码的时候你要明白这是个什么电路,自然就不会当作C语言去分析了。
