集成电路技术分享

 找回密码
 我要注册

QQ登录

只需一步,快速开始

搜索
查看: 2363|回复: 3

关于VHDL中的时钟是不是可综合的问题

[复制链接]
小泡泡 发表于 2010-4-23 12:14:20 | 显示全部楼层 |阅读模式
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 下一条

QQ|小黑屋|手机版|Archiver|fpga论坛|fpga设计论坛 ( 京ICP备20003123号-1 )

GMT+8, 2025-6-21 11:27 , Processed in 0.063435 second(s), 20 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表