关于VHDL中的时钟是不是可综合的问题
1。VHDL综合器中把通过边沿触发其他信号的东西统统定义为时钟信号。比如说,一个信号B的变化需要A的下降沿来触发,那么在相应的进程中就把A看作是时钟信号,即使A可能只变化了这一次。2。明确了1,就来看2。任意一个信号或者变量只能有一个时钟驱动。多时钟驱动的信号或变量会在综合时报错。比如说,如下语句在一个进程中:
if (clk'event and clk = '1') then
B <= '1';
end if;
if (A'event and A = '0') then
B < = '0';
end if;
这里面的B就叫做被时钟clk和时钟A同时驱动了,虽然我们平时不习惯把A也叫做时钟,但是它在综合时似确实被这样认为的。
因此,这就要求我们在写程序之前,要把所有的信号都拼尽全力的用不多于一个时钟来驱动,当然不用时钟也是可以的。同时也引申出一点,就是一个进程的敏感表表示的是进程间的驱动关系,这个需要极其认真地考虑,要弄清楚进程间究竟是用什么通信的,尤其牵扯到时钟的时候,到搞懂究竟是哪个时钟触发了信号。切不可随意添加信号,在仿真时可能问题不大,但是综合的时候可能会有大问题。
这个从物理上也好理解,一个又边沿触发的信号物理上就是用一个D触发器实现的,无论这个触发信号是变化很长时间还是只变化一次,只要是牵扯到检测边沿,就需要一个D触发器。而一个信号只能对应一个D触发器,一个D触发器只能由一个时钟驱动,所以以上语句是无法综合的。也就是说,两个时钟同时触发的D触发器现阶段无法实现。为什么无法实现呢?留个问题。
3。使用异步电路只有如下一种书写方式可以综合:
process(clk,reset)
begin
if (reset = '1') then
B <= '1';
elsif (clk'event and clk = '0') then
B < = '0';
end if;
end process;
下面的语句会在综合中报错:
process(clk,reset)
begin
if (reset = '1') then
B <= '1';
end if;
if (clk'event and clk = '0') then
B < = '0';
end if;
end process;
报的错误是同步时钟前面存在异步信号。原因是什么呢?留个问题
下面的语句也会报错:
process(clk,reset)
begin
if (clk'event and clk = '0') then
B <= '1';
elsif (A = '1') then
B < = '0';
end if;
end process;
这回报的错误是:在有时钟存在的if的else中为信号赋值。也留个问题。 这回报的错误是:在有时钟存在的if的else中为信号赋值。也留个问题。 因为可能存在同时满足的情况,输出信号会出现混乱 因为可能存在同时满足的情况,输出信号会出现混乱
页:
[1]