根据条件合成不同硬件电路的一种方法是使用generic
与if-generate
陈述。在下面的例子中,当泛型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 http://vhdlpp.sourceforge.net/README.
对于可重用 VHDL 基础知识的非常全面的介绍,我强烈推荐 VLSI Technology 的白皮书.
自从我上次使用 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>
);