(1)一个进程中不允许出现两个时钟沿触发,(Xilinx公司CoolRunner系列CPLD支持单个时双钟的双触发沿除外)
(2)对同一信号赋值的语句应出现在单个进程内,不要在时钟沿之后加上elsif,else语句,如
if clk’event and clk=’1’ then - else … 的结构,现有综合工具支持不了这种特殊的触发器结构
(3)不能在两个以上的进程内对同一信号赋值操作,引起输出多驱动源的发生
例子
隐含触发器
如以下代码:
library ieee;
use ieee.std_logic_1164.all;
entity and2 is
port ( a, b : in std_logic;
c : out std_logic);
end and2;
architecture behave of and2 is
begin
process (a, b)
begin
if ( a='1' and b='1') then
c<='1'
end if;
end process;
end behave;
use ieee.std_logic_1164.all;
entity and2 is
port ( a, b : in std_logic;
c : out std_logic);
end and2;
architecture behave of and2 is
begin
process (a, b)
begin
if ( a='1' and b='1') then
c<='1'
end if;
end process;
end behave;
设计指原意是设计一个二输入与门,但因“if”语句中无“else”语句,在对此语句逻辑综合时为“else”语句中为:“C<=C;”,即保持不变。因此可能形成下图所示的电路:
利用MAX+PLUSII软件仿真时,除了“a=1”及“b=1”时“c=1”外,其他时刻的值都不确定。为改正此错误,仅需加上如下语句即可。
else
c<='0';
这类错误在利用“if-then-else”语句设计组合电路时常犯的。
时钟处理
如以上所述,是为了设计一个带计数使能的计数器,但将falling_edge (clk)和ci='1'在一起,有些综合器可能会生成错误电路或不能综合。
IF ( falling_edge (clk) and ci='1') then
qcnt<=qcnt+1;
end if;
最好如下:
if falling_edge (clk) then
if (ci='1') then
qcnt<=qcnt+1;
end if;
end if;
此外,对于时钟电路,可省略“else”语句,它隐含表示“qcnt<=qcnt+1”。可加上此句,但下面的描述则无法综合:
if (falling_edge (clk)) then
qcnt<=qcnt+1;
else
qcnt<=datain;
end if;
综合时会出现如下错误信息:
“Else Clause following a Clock edge must hold the state of signal”