Generics 在VHDL中定义等价物是什么

Generics 在VHDL中定义等价物是什么,generics,vhdl,Generics,Vhdl,VHDL中#define、#ifdef和#ifndef的等价物是什么 我想使用泛型作为定义,并根据它们更改设计。举个简单的例子:定义一个字符串泛型,并使用它来确定时钟是单时钟还是差分时钟 generic ( something : boolean := FALSE; CLK_MODE : string := "SINGLE_ENDED" ); 现在,如何根据泛型更改逻辑?当然,我们可以用一个简单的if语句编写两个可能的逻辑描述,但是这两个描述都将被合成(尽管实际上只使用了一个) 此外,

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

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

generic (
  something : boolean := FALSE;
  CLK_MODE : string := "SINGLE_ENDED"
);
现在,如何根据泛型更改逻辑?当然,我们可以用一个简单的if语句编写两个可能的逻辑描述,但是这两个描述都将被合成(尽管实际上只使用了一个)


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

根据条件合成不同硬件电路的一种方法是使用带有
if generate
语句的
通用端口。在下面的示例中,当通用的
算术运算\u为\u 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;
ieee库;
使用ieee.std_logic_1164.all;
使用ieee.numeric_std.all;
实体条件硬件是
一般的(
算术运算为加:布尔:=真
);
港口(
a、 b:无符号(7到0);
y:输出未签名(7到0)
);
结束;
条件_硬件的架构示例如下
开始
加法器:如果算术运算为加法生成
y“关”,
弱上拉电阻=>“关闭”
)港口地图(
i=>,,
ibar=>,,
o=>
);
时钟 我会避免在内部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;

港口呢?它们可以根据泛型进行更改吗?根据您想要完成的任务,您可以创建一个顶级实体,该实体将所有管脚作为端口。然后使用if-generates只连接实际使用的那些。
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;