VHDL中 #define 等效的是什么



VHDL中 #define,#ifdef 和 #ifndef 的等价物是什么?

我想使用泛型作为 #define,并根据它们更改设计。 举一个简单的例子:定义一个字符串泛型,并使用它来确定时钟是单时钟还是差时钟。

generic (
  something : boolean := FALSE;
  CLK_MODE : string := "SINGLE_ENDED"
);

现在,如何根据泛型更改逻辑? 当然,人们可以用一个简单的 if 语句编写 2 个可能的逻辑描述,但随后两者都会被合成(尽管实际上只使用了一个)。

另外,是否可以根据通用更改端口? 对于CLK示例,差分时钟需要2个输入端口,但单端时钟只需要一个输入端口。 如何根据通用启用或禁用第二个端口?

根据条件合成不同硬件电路的一种方法是使用带有if-generate语句的generic。在下面的示例中,当泛型ARITHMETIC_OPERATION_IS_ADD为 true 时,将生成一个加法器。当它为假时,将生成减法器。

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity conditional_hardware is
    generic (
        ARITHMETIC_OPERATION_IS_ADD: boolean := true
    );
    port (
        a, b: in unsigned(7 downto 0);
        y: out unsigned(7 downto 0)
    );
end;
architecture example of conditional_hardware is
begin
    adder: if ARITHMETIC_OPERATION_IS_ADD generate
        y <= a + b;
    end generate;
    subtractor: if not ARITHMETIC_OPERATION_IS_ADD generate
        y <= a - b;
    end generate;
end;

注意:如果你真的想要它,有一些VHDL预处理器的工作方式与它们的C++对应处理器一样。例如,看看 http://vhdlpp.sourceforge.net/README。

为了很好地全面

介绍可重用VHDL的基础知识,我强烈推荐VLSI Technology的白皮书Coding Tips and Techniques for Synthesize, Reuse VHDL。

自从我上次使用LVDS以来已经有一段时间了,所以以下内容可能已经过时了。对于输出,您可以将互补值分配给两个输出引脚:

diff_out_p <= my_signal;
diff_out_n <= not my_signal;

然后,在项目设置文件中,将它们分配给差分对,并将输出标准设置为 LVDS 或您使用的任何标准。

对于输入,我的工具手册建议实例化基元。此基元有两个输入和一个输出。应将输入连接到差分对,并在 VHDL 代码中使用输出(<data_out>以下示例中

)。
library altera; 
use altera.altera_primitives_components.all; 
lvds_input_buffer : ALT_INBUF_DIFF
generic map (
    IO_STANDARD => "LVDS",
    LOCATION => "IOBANK_1A",
    ENABLE_BUS_HOLD => "off",
    WEAK_PULL_UP_RESISTOR => "off"
)  port map ( 
    i => <data_in_pos>,
    ibar => <data_in_neg>,
    o => <data_out>
);

时钟

我会避免在内部HDL中使用单端时钟信号以外的任何东西。

在顶层,实例化差分对缓冲器(Xilinx-land中的IBUFDS)以转换为内部时钟信号,然后始终使用该信号。

港口

无法根据通用更改端口引脚的数量。 您可以做的是为可选输入分配默认值,这意味着在实例化实体时不必连接它。 您可以使用泛型来决定是否使用信号。

generic (
  something : boolean := FALSE
);
port (
   some_normal_port : std_logic;
   some_optional_port : std_logic := 'U';
....

然后

if something generate
   some logic using the optional port
else
   some logic not using the optional port
end generate;

最新更新