我正在为我的一类用结构化 VHDL 编写 ROM。该设计采用 6 位地址并通过 6 到 64 二进制解码器运行它。每个解码器输出启用或禁用由三态反相器组成的单个 6 位字线。每个位的字线位输入要么是“1”,要么是“0”。最重要的是,每个字线都写入相同的输出向量。
当我检查 Xilinx 9.2 中的语法时,它很好,但是当我合成时,我得到了这个错误:
ERROR:Xst:528 - Multi-source in Unit <ufm6bit> on signal <N0>
Sources are:
Output signal of BUFT instance <rom/word63rom/tri0/Z>
Output signal of BUFT instance <rom/word62rom/tri0/Z>
Output signal of BUFT instance <rom/word...rom/tri0/Z>
Output signal of BUFT instance <rom/word00rom/tri0/Z>
我使用了一个程序来编写解码器 VHDL,因此端口映射太大而无法放在这里(如果需要,可以将其放在 pastebin 上)。字线如下所示:
entity tribuffer6 is
PORT (
A : in std_logic_vector(5 downto 0);
E : in std_logic;
Z : out std_logic_vector(5 downto 0));
end tribuffer6;
它使用的 6 个 tribuffers 如下所示:
entity tribuffer is
Port ( A : in std_logic;
E : in std_logic;
Z : out std_logic);
end tribuffer;
architecture Behav of tribuffer is
begin
z <= not a after 120 ps when e = '1' else
'Z' after 120 ps;
end Behav;
最后,字线是这样绑起来的:
SIGNAL dataline : std_logic_vector(5 downto 0);
word00rom : tribuffer6 PORT MAP (
A=>"000000",
Z=>dataline,
E=>word00en );
word01rom : tribuffer6 PORT MAP (
A=>"000000",
Z=>dataline,
E=>word01en );
从错误中可以明显看出,VHDL 对在那条线上有多个驱动程序不满意,但是我无法制作 64 个缓冲区向量并将它们链接在一起来阻止检查。64 层深的 OR 树也不实用。我该怎么做才能让 VHDL 能够接受这个?
更新:我应该澄清一些事情。Xilinx 9.2 是课程的必需品,因为它是免费的,而且我的大学很便宜。唯一的基本门(and,or,not,nand,tristate)可以是行为的,其他一切都必须是结构的。这是我用 C 语言生成 VHDL 的 ROM,因为否则会需要大量输入。