我正在学习和编程用于莱迪思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有什么问题吗?
答案 0 :(得分:3)
一些指导原则:
解读@ 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_OE
和DIR
合理的流程,以及CLK
的合理流程。很明显,您在两个进程中分配BD
,这转换为信号的多个驱动程序,这在合成中通常是错误的。