什么是VHDL中的#define等价物

Pro*_*oWi 2 generics vhdl

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

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

generic (
  something : boolean := FALSE;
  CLK_MODE : string := "SINGLE_ENDED"
);
Run Code Online (Sandbox Code Playgroud)

现在,如何根据泛型改变逻辑?一个人当然可以用一个简单的if语句写出2个可能的逻辑描述但是两者都将被合成(尽管只有一个被使用).

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

ric*_*ick 7

根据条件合成不同硬件电路的一种方法是使用a genericwith if-generate语句.在下面的示例中,当generic ARITHMETIC_OPERATION_IS_ADD为true时,将生成一个加法器.如果为false,则生成减法器.

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;
Run Code Online (Sandbox Code Playgroud)

注意:如果你真的需要它,那么VHDL预处理器就像它们的C++对应物一样工作.例如,看看http://vhdlpp.sourceforge.net/README.

为了对可重用VHDL的基础进行非常全面和全面的介绍,我强烈推荐VLSI Technology的白皮书" 可合成,可重用VHDL的编码技巧和技术".

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

diff_out_p <= my_signal;
diff_out_n <= not my_signal;
Run Code Online (Sandbox Code Playgroud)

然后,在项目设置文件中,将它们分配给差分对,并将输出标准设置为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>
);
Run Code Online (Sandbox Code Playgroud)