小泡泡 发表于 2010-4-23 12:14:20

关于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中为信号赋值。也留个问题。

小泡泡 发表于 2010-4-26 20:50:32

这回报的错误是:在有时钟存在的if的else中为信号赋值。也留个问题。

slyman 发表于 2010-5-11 21:29:52

因为可能存在同时满足的情况,输出信号会出现混乱

Sunlife 发表于 2015-5-16 10:42:29

因为可能存在同时满足的情况,输出信号会出现混乱
页: [1]
查看完整版本: 关于VHDL中的时钟是不是可综合的问题