rising_edge(clk)不可综合

时间:2015-05-14 15:49:02

标签: vhdl synthesis

我正在学习和编程用于莱迪思FPGA的VHDL,以模仿74HCT245的功能。以下是我的代码。

我一直得到语句不可综合,因为它在NOT(时钟边缘)条件下不保持其值。 VHDL-1242 错误,

 entity HCT541 is
  port (Clk       : in    std_logic;
        A         : inout std_logic_vector(15 downto 0) := "1011101010111010";
        BA        : out   std_logic_vector(15 downto 0);
        n_OE, DIR : in    std_logic;
        M_D       : inout std_logic_vector(15 downto 0) := "0000000000000001";
        D         : inout std_logic_vector(15 downto 0) := "1011101010111010";
        BD        : inout std_logic_vector(15 downto 0) := "1011101010111010");
end HCT541;

architecture df of HCT541 is
  signal n_OE_1, n_OE_2 : std_logic := '0';
begin

  process(Clk, n_OE, DIR)
  begin

    if ((BD = "ZZZZZZZZZZZZZZZZ" or D = "ZZZZZZZZZZZZZZZZ") and n_OE = '0') then
      BD <= "0000000000000000";
      D  <= M_D;
    end if;

    M_D <= M_D + '1';

    CLK1 : if(rising_edge(Clk)) then

      if(n_OE_1 = '0' and n_OE_2 = '0') then
        A  <= A - '1';
        BA <= A;
      else
        BA <= "ZZZZZZZZZZZZZZZZ";
      end if;

      if (n_OE = '0' and DIR = '1') then
        D  <= M_D;
        BD <= D;
      elsif (n_OE = '0' and DIR = '0') then
        BD <= BD - '1';
        D  <= BD;
      elsif (n_OE = '1') then
        BD <= "ZZZZZZZZZZZZZZZZ";
        D  <= "ZZZZZZZZZZZZZZZZ";
      end if;

    end if CLK1;

  end process;

end df;

任何想法?

使用rising_edge有什么问题吗?

2 个答案:

答案 0 :(得分:3)

一些指导原则:

  1. 绘制您想要的硬件图片。然后对图片进行编码。
  2. 硬件只能检查1&0和0。所以你对Z的检查是 有问题的
  3. 只在组合过程中驱动三态。否则会有很多惊喜和错误。
  4. 许多FPGA没有内部三态,因此只支持初级输出。
  5. 解读@ Jonathan Drolet关于&#34;将组合过程与同步过程混合的评论。&#34;从输出角度考虑这一点。

    理想情况下,您的同步过程的格式如下:

    SyncProc : process (Clk) is
    begin
      -- do not do logic here
      if rising_edge(Clk) then
       -- do synch stuff.  
       -- logic is ok in here
      end if ; 
      -- do not do logic here
    end process SyncProc ; 
    

    理想情况下,您的组合流程具有以下形式:

    CombProc : process (sig1, sig2, ...) is
    begin
      -- do logic stuff here
      -- do not do clocks here
    end process CombProc ; 
    

    有些工具可以让你获得更多。

答案 1 :(得分:2)

我无法确定您的帖子格式难以阅读。看来你在{strong>之外的rising_edge(clk)语句中指定BD,这是不可能的。 BD或者是注册,或者不是。

不要将组合过程与同步过程混合在一起。虽然VHDL标准在技术上没有错,但它很容易像你所拥有的那样出错。基本上,clk上合理的过程对任何其他信号都不应该是明智的,除了异步复位。

将您的流程分为n_OEDIR合理的流程,以及CLK的合理流程。很明显,您在两个进程中分配BD,这转换为信号的多个驱动程序,这在合成中通常是错误的。