1

我正在 vhdl - 比较器上创建小芯片块。
用途:QuartusII、ModelSim,在 Cyclone ii 上进行仿真。

INPUT:  
    IN_FIRST: in UNSIGNED(255 downto 0);  
    IN_SECOND: in UNSIGNED(255 downto 0);  

OUTPUT:  
    OUT_IS_RIGHT_RESULT: out STD_LOGIC; -- IN_SECOND < IN_FIRST  

我有一些不同的并行和顺序实现。但在某些情况下,并行工作比顺序更糟糕。而且我找不到最好的方法。

一些不同的实现:

带生成(时间-18.5ns)

architecture ComparatorArch of Comparator is
    signal T: UNSIGNED(7 downto 0) := (others => 'U');
    signal H: UNSIGNED(7 downto 0) := (others => 'U');
begin
    generateG: for i in 7 downto 0 generate
        T(i) <= '1' when (IN_FIRST((i + 1) * 32 - 1 downto i * 32) > IN_SECOND((i + 1) * 32 - 1 downto i * 32)) else '0';
        H(i) <= '1' when (IN_FIRST((i + 1) * 32 - 1 downto i * 32) < IN_SECOND((i + 1) * 32 - 1 downto i * 32)) else '0';
    end generate generateG;

    OUT_TARG <= T;
    OUT_HASH <= H;
    OUT_IS_RIGHT_RESULT <= (T(7) or ((not T(7)) and ((not H(7)) and 
        (T(6) or ((not T(6)) and ((not H(6)) and 
        (T(5) or ((not T(5)) and ((not H(5)) and 
        (T(4) or ((not T(4)) and ((not H(4)) and 
        (T(3) or ((not T(3)) and ((not H(3)) and 
        (T(2) or ((not T(2)) and ((not H(2)) and 
        (T(1) or ((not T(1)) and ((not H(1)) and T(0))))))))))))))))))))));
end ComparatorArch;

最后一部分 - 它是比较T和的逻辑表示H

进行中(时间-35ns)

architecture ComparatorArch of Comparator is
begin
  mainP: process(IN_READY) begin
        if (rising_edge(IN_READY) and IN_READY = '1') then
            if (IN_SECOND < IN_FIRST) then
                OUT_IS_RIGHT_RESULT <= '1';
            else
                OUT_IS_RIGHT_RESULT <= '0';
            end if;
        end if;
  end process;
end ComparatorArch;

可能有人知道更好的方法。

如果我改变它就不起作用

if (rising_edge(IN_READY) and IN_READY = '1') then  

if (IN_READY = '1') then  

为什么?

我在例子上研究了一些基本的东西,并意识到芯片有特殊输入数据大小的逻辑和计算块。它比较或计算大小从最小值到特定最大值的信号的逻辑运算常量时间。它同时比较 BIT/BIT 或 BIT_VECTOR(7 down to 0)/BIT_VECTOR(7 down to 0) - 大约 9ns。为什么这么长时间?有人可以解释一下吗?

4

1 回答 1

1

如前所述,当您扩大比较器时,并行树将具有最佳性能。然而,对于窄至 8 位的比较器,布线延迟可能占主导地位,并且 Cyclone II 将使用其进位链(参见Cyclone II 器件手册的第 2-2 节)表现更好,因为它们直接连接到相邻的 LE。这就是为什么串行逻辑可以胜过并行。

至于rising_edge,您编写了两种约定的混合。在上升沿成为标准之前,使用clk'event and event='1';执行相同的功能 由于rising_edge 已经将新状态定义为“1”,因此无需对其进行测试。另一方面,仅对高电平进行测试产生的不是D触发器而是透明锁存器——大多数 FPGA 没有针对这种很少需要的功能进行优化,综合工具往往会对此发出警告。

至于你的计时结果,没有看到你提到的测试方法,我什么都看不懂。甚至是关于拟合后的模拟吗?对于这么小的功能,很少有值得这样做的。

于 2013-06-05T00:06:17.883 回答