根据条件合成不同硬件电路的一种方法是使用generic
withif-generate
语句。在下面的示例中,当泛型ARITHMETIC_OPERATION_IS_ADD
为真时,会生成一个加法器。当它为假时,产生一个减法器。
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 Synthesizeable, Reusable 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>
);