gpt4 book ai didi

vhdl - rising_edge(clk) 不可合成

转载 作者:行者123 更新时间:2023-12-04 09:27:25 24 4
gpt4 key购买 nike

我正在为莱迪思 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 有什么问题吗?

最佳答案

一些准则:

  1. 画出您想要的硬件。然后对图片进行编码。
  2. 硬件只能检查 1 和 0。所以你对 Z 的检查是有问题的
  3. 仅在组合过程中驱动三态。否则会有很多意外和错误。
  4. 许多 FPGA 没有内部三态,因此只支持初级输出。

解读@Jonathan Drolet 关于“混合组合过程与同步过程”的评论。从输出的角度考虑这一点。

理想情况下,您的同步流程采用以下形式:

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 ;

一些工具可以让您获得更多 yield 。

关于vhdl - rising_edge(clk) 不可合成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30241663/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com