VHDL中#define,#ifdef和#ifndef的等价物是什么?
我想将泛型用作#define,并根据它们更改设计。举个简单的例子:定义一个字符串泛型并用它来确定时钟是单个还是差分。
generic (
something : boolean := FALSE;
CLK_MODE : string := "SINGLE_ENDED"
);
现在,如何根据泛型改变逻辑?当然可以使用简单的if语句编写2个可能的逻辑描述,但两者都将被合成(尽管只使用了一个)。
另外,是否可以根据通用更改端口?对于CLK示例,差分时钟需要2个端口,但单端时钟只需要一个。如何根据通用?
启用或禁用第二个端口答案 0 :(得分:7)
根据条件合成不同硬件电路的一种方法是使用带有generic
语句的if-generate
。在下面的示例中,当通用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;
注意:如果你真的想要它,那么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>
);
答案 1 :(得分:2)
我会避免在你的内部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;