复合文件/组件实例

问题描述 投票:1回答:1

我是新的(ISH)以VHDL。我想了解如何使用不同的组件.vhd文件建立一个完整的结构。我与Digilent的PmodA7工作,并希望有两个LED指示灯交替闪烁。

我曾尝试是Inverter.vhd和LedBlink.vhd

Inverter.vhd:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity Inverter is
Port (
      Inv_in  : in  std_logic;
      Inv_out : out std_logic
      );
end Inverter;
architecture Behavioral of Inverter is
begin
    Inv_out <= not Inv_in;
end Behavioral;

Ledblink-1.vhd:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.std_logic_unsigned.all;
use IEEE.numeric_std.all;
entity LedBlink is
Port ( 
    clk: in  std_logic;
    rst: in  std_logic;
    led_0 : out std_logic;
    led_1 : out std_logic
    );
end LedBlink;
architecture Behavioral of LedBlink 
-- Inverter.vhd
component Inverter is 
    port ( 
        Inv_in   : in std_logic;
        Inv_out  : out std_logic
        );        
end component;

constant CLK_FREQ    : integer := 12500000;
constant BLINK_FREQ  : integer := 1;
constant CNT_MAX     : integer := CLK_FREQ/BLINK_FREQ/2 - 1;
signal cnt : unsigned(24 downto 0);
signal blink_0 : std_logic := '1';
signal blink_1 : std_logic := '1';

begin

process(clk)
begin
    if (rst = '1') then
        blink_0 <= '0';
        blink_1 <= '0';        
    elsif (clk='1' and clk'event ) then
        if cnt = CNT_MAX then
            cnt <= (others => '0');          
            -- blink_1 <= blink_0;
            A1: Inverter 
                Port map ( Inv_in => blink_0, Inv_out => blink_1); 
            blink_0 <= not blink_0;                     
        else
            cnt <= cnt + 1;
        end if; 
    end if;
end process;
led_0 <= blink_0;
led_1 <= blink_1;
end Behavioral;

要了解如何合并文件,我想更换线blink_1 <= blink_0;用逆变器组件,即7404,但无法弄清楚如何做到这一点。我下面的示例不使用图书馆,让我最感兴趣的是方法,但是如何将一个库来完成,这将是有益的。我所拥有的是:

vhdl
1个回答
2
投票

您还没有具备误差最小,完整,可验证的例子。问题要求对计算器编程有帮助的实用,而不是理论。这意味着在此特定问题。

分析(编译)将不会完全Ø与在未标记的过程中,建筑bodyr或组件实例失踪is

你不能实例化的过程的组成部分(并发语句)(只能包含连续的语句)。移动过程外的组件实例。

触发器输出blink_0inverter的输入。这则输出blink_1分配的过程中,而不是blink_0not blink_0

blink_1inverter的架构在详尽的过程中只分配从并发赋值语句。在设计层次每一个过程都有司机。多个驱动器的数值模拟过程中得到解决。等效后合成由具有两个设备驱动相同的信号,并将生成的合成误差。

制定LedBlink之前分析Inverter.vhd。

cnt必须复位模拟增量,加1所有“将导致所有所有的” U的。不要使用包std_logic_unsigned。

library ieee;
use ieee.std_logic_1164.all;
-- use ieee.std_logic_unsigned.all;
use ieee.numeric_std.all;

entity ledblink is
    port ( 
        clk:    in  std_logic;
        rst:    in  std_logic;
        led_0:  out std_logic;
        led_1:  out std_logic
    );
end entity ledblink;

architecture behavioral of ledblink is  -- ADDED is
    component inverter is 
        port ( 
            inv_in:     in  std_logic;
            inv_out:    out std_logic
        );        
    end component;
    constant clk_freq:      integer := 12500000;
    constant blink_freq:    integer := 1;
    constant cnt_max:       integer := clk_freq/blink_freq/2 - 1;
    signal cnt:             unsigned(24 downto 0);
    signal blink_0:         std_logic := '1';
    signal blink_1:         std_logic := '1';
begin
    process (clk)  -- contains counter cnt and flip flop blink_0
    begin
        if rst = '1' then
            blink_0 <= '0';
            -- blink_1 <= '0';  -- ONLY one driver for blink_1, the component
            cnt <= (others => '0'); -- ADD cnt to reset
        elsif  clk = '1' and clk'event then -- OR rising_edge(clk)
            if cnt = cnt_max then
                cnt <= (others => '0');          
                -- blink_1 <= blink_0;
                -- a1: inverter   MOVED to architecture body
                --     port map ( inv_in => blink_0, inv_out => blink_1);
                -- blink_0 <= not blink_0;  CHANGED
                blink_0 <= blink_1;                
            else
                cnt <= cnt + 1;
            end if; 
        end if;
    end process;
a1: 
    inverter   -- MOVED to architecture body a place for concurrent statements
        port map ( inv_in => blink_0, inv_out => blink_1);

    led_0 <= blink_0;
    led_1 <= blink_1;
end architecture behavioral;

在这之后你的设计分析与测试台提供时钟和复位,阐述和模拟:

ledblink_tb simulation

注意cnt只要求的23的长度(22 DOWNTO 0),CNT(24)和CNT(23)总是 '0' 具有12.5MHz的时钟(12500000)。

现在的问题指出:“我下不使用图书馆的例子,让我最感兴趣的是方法,但是如何将一个库来完成,这将是有帮助的。”

第一句是不完全准确的。见IEEE标准1076至2008年13.2设计库:

一个设计库是先前分析设计单位实现相关的储存设施。给定的实现需要支持任意数量的设计库。 ... 有两种类型的设计库:工作库和资源库。一个工作库是成从设计单元的分析得到的库单元被放置在库中。资源库是一个包含有内的设计单元被分析引用的库单元的库。仅一个库是任何给定的设计单位的分析过程中的工作库;相反,任何数量的库(包括其自身的工作库)可以是这样的分析过程中的资源库。

除了上下文声明和包STANDARD每一个设计单元被假定为包含以下隐式上下文的项目,如它的上下文子句的一部分:

库STD工作;使用STD.STANDARD.all;

库逻辑名称STD表示设计库中包标准,TEXTIO和ENV驻留(见第16条)。 (使用第使得包STANDARD之内的所有声明相应的设计单元内直接可见的;参见12.4。)库逻辑名WORK一个给定的分析期间表示当前工作库。库逻辑名称IEEE表示设计库,其中的数学,多值逻辑和合成产品的合成上下文声明驻留(见第16条)。

设计规范被分析为能够由work被引用,并且可以依赖于实现方法重定向工作库。

存在用于确定缺省绑定指示(代替在配置说明书中作为一个块声明性项目绑定指示的一个块(包括结构体)含有成分实例化或在配置声明(规则由综合工具没有被广泛使用,如果有的话)。见11.7组件实例化和3.4.3组件配置。

如果没有明确的绑定指示如下VHDL依赖于默认绑定指示(7.3.3默认绑定指示):

在某些情况下,默认绑定指示将应用在没有明确的绑定指示的。默认装订指示由一个默认的实体方面的,具有默认通用映射方面和默认的端口映射方案中,酌情在一起。

如果没有可见的实体声明具有相同的简单的名称作为实例化的组件,那么默认的实体方面是开放的。看得见的实体声明是第一个实体声明,如果有的话,以下列表:

一个),其具有相同的简单名称作为实例化的组件的,这是直接可见的(参见12.3)的实体声明, b)中具有相同的简单名称作为实例化的组件的和实体声明将是在不存在的直接可见的直接可见的(参见12.3)具有相同的简单名称组件声明作为实体声明的,或 c)按L.C,其中L是目标库和C表示的实体声明是被实例化的组件的简单名称。目标库是包含在其中的组分C中声明的单元设计库的库逻辑名称。

这些可见性检查是在使默认绑定指示应用没有明确的绑定指示的点进行。

在这种情况下,因为inverter分析为以下规则B相同的资源库(不变work))。你可以注意到,这些规则被设置为尽可能无痛。有可以与库中的相同的名称是只能有一个主单元(这里的实体)。

总之一点是,有参与在原岗位的代码库。这里没有配置规范inverter预计在库work被发现,无论何种资源库它的实现定义庄园引用。

这是出了标签的范围和原来的职位不识别特定工具的应用和VHDL工具的方法对工作和资源库与库逻辑名称关联变化。

对于一个资源库由库条款可见形式的使用条款“使用library_logical_name.all;”可以使一个资源库直接可见的所有命名实体(见12.4使用条款,12.3能见度,12.5重载的情况下)。否则可用于实例化的实体所选择的名称(8.3选定的名称)。

© www.soinside.com 2019 - 2024. All rights reserved.