您的位置:首页 > 其它

VHDL设计中常见错误

2009-05-11 10:52 337 查看
(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;
  设计指原意是设计一个二输入与门,但因“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”
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: