【发布时间】:2013-11-06 22:37:14
【问题描述】:
请注意,这是一道学习题。
我必须在vhdl中描述一个简单的d-latch,然后合成它。问题在于它是一个“一元”d-latch,它的单个输入直接映射到它的输出(Q 和 nQ)。您可以将其想象为经典的异步 d-latch,其中 clk 信号始终为高电平。这是逻辑中无用的元素,而 xilinx 合成器在大多数情况下会给出一个空的技术架构。但是保留这个元素的原因是,例如,创建硬件“水印”,它出现在架构上,但不影响其逻辑。
我想出了以下代码:
entity dLatch is
port(
d: in std_logic;
q: out std_logic);
end dLatch;
architecture dLatch_beh of dLatch is
signal o: std_logic;
begin
latch: process(d)
begin
if d = '1' then
o <= '1';
elsif d = '0' then
o <= '0';
end if;
end process;
q <= o;
end;
此代码产生以下技术架构
但是当我尝试添加 nQ 输出端口时,我获得了锁存器的重复
entity dLatch is
port(
d: in std_logic;
q, nq: out std_logic);
end dLatch;
architecture dLatch_beh of dLatch is
signal o: std_logic;
begin
latch: process(d)
begin
if d = '1' then
o <= '1';
elsif d = '0' then
o <= '0';
end if;
end process;
q <= o;
nq <= not o;
end;
技术架构:link
我不明白,为什么我在这里得到两个完全相等的闩锁。我预计只有一个额外的“非”门。 所以我的问题是如何避免锁存器的重复,或者可能有其他方法来解决这个问题。 我使用 Xilinx ISE Web Pack 14.6 进行综合。
UPD 解决方案是将合成器的标志 -register_duplication 设置为 false。
【问题讨论】:
-
我从来没有使用过 Xilinx/FPGA,所以我不能给你一些答案。但是,在我看来,我认为合成器试图通过重复锁存器来优化您的延迟以避免扇出。为什么你不添加一些关于区域优化的约束?希望你能有更好的成绩!
-
"但是保留这个元素的原因是,例如,创建硬件“水印”,它出现在架构上,但不影响其逻辑。"你能向我解释一下为什么有人想首先获得硬件水印吗?
-
如果它不影响逻辑,您将不得不与工具链的各个部分进行斗争以防止它被简单地删除:仅综合属性是不够的;映射器还会优化您说服合成工具留下的内容。(@Russell;我相信目标是在法庭上追踪可证明的设计“克隆”)