首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在VHDL中#define equivalent是什么

在VHDL中#define equivalent是什么
EN

Stack Overflow用户
提问于 2013-10-24 23:26:00
回答 2查看 15.3K关注 0票数 5

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

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

代码语言:javascript
复制
generic (
  something : boolean := FALSE;
  CLK_MODE : string := "SINGLE_ENDED"
);

现在,如何根据泛型更改逻辑?当然,一个人可以用一个简单的if语句来写两种可能的逻辑描述,但是这两种逻辑描述都会被综合起来(尽管只有一种是真正使用的)。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-10-24 23:53:31

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

代码语言:javascript
复制
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已经有一段时间了,所以下面的内容可能已经过时了。对于输出,您可以将互补的值分配给两个输出管脚:

代码语言:javascript
复制
diff_out_p <= my_signal;
diff_out_n <= not my_signal;

然后,在您的项目设置文件中,将它们分配给差分对,并将输出标准设置为LVDS或您使用的任何值。

对于输入,我的工具手册建议实例化一个原语。这个原语有两个输入和一个输出。您应该将输入连接到差分对,并在VHDL代码中使用输出(以下示例中的<data_out>)。

代码语言:javascript
复制
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>
);
票数 8
EN

Stack Overflow用户

发布于 2013-10-25 16:39:15

时钟

我会避免在你的内部HDL中使用单端时钟信号以外的任何信号。

在顶层,实例化您的差分对缓冲区(Xilinx-land中的IBUFDS )以转换为内部时钟信号,然后始终使用该信号。

端口

没有办法更改基于通用的端口引脚的数量。您可以做的是为可选输入分配一个默认值,这意味着在实例化实体时不必连接它。您可以使用泛型来决定是否使用信号。

代码语言:javascript
复制
generic (
  something : boolean := FALSE

);
port (
   some_normal_port : std_logic;
   some_optional_port : std_logic := 'U';
....

然后

代码语言:javascript
复制
if something generate
   some logic using the optional port
else
   some logic not using the optional port
end generate;
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19570094

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档