我可以在“过程”中使用“端口图”吗?

时间:2019-05-05 13:18:44

标签: vhdl

library ieee;
use ieee.std_logic_1164.all;
-- create a entity
entity ex1_3 is 
port(
    a,b,c,d: in std_logic_vector (3 downto 0);
    ctrl: in std_logic;

    sum: out std_logic );
end ex1_3;

architecture impl of ex1_3 is

-- declare a component of four bit ripple carry adder 
component four_bit_ripple_carry_adder is
port(
    a,b: in std_logic_vector (3 downto 0);
    cin: in std_logic;

    s:   out std_logic_vector (3 downto 0);
    cout:out std_logic
);
end component;

signal s: std_logic_vector (3 downto 0);

begin

process(a,b,c,d,ctrl)
begin
-- error:Illegal sequential statement.
if ctrl = '0' then
    u0: four_bit_ripple_carry_adder port map(a,b,ctrl,s,sum);
elsif ctrl = '1' then
    u1: four_bit_ripple_carry_adder port map(c,d,ctrl,s,sum);
end if;

end architecture;
  

**错误:/home/atomman/drs_exercises/exercise_04/ex1_3.vhd(30):非法的顺序语句。

     

**错误:/home/atomman/drs_exercises/exercise_04/ex1_3.vhd(32):非法的顺序语句。

     

**错误:/home/atomman/drs_exercises/exercise_04/ex1_3.vhd(35):“体系结构”附近:(vcom-1576)期望进行此操作。

1 个答案:

答案 0 :(得分:3)

永远不要忘记HDL中的“ H”代表“硬件”。

您要说的是“如果ctrl = 0,则使用一块硬件,将其命名为u0,将其连接为...,否则替换该硬件,现在将其命名为u1,并将其连接为.. 。” 。 没有简单的等效硬件可以根据信号(在本例中为“ ctrl”)动态地切入和切出两个组件。

唯一的区别在于前两个端口,这使解决方案变得简单:制作一个组件,并对前两个输入端口使用多路复用器 1

signal a_or_c_mux: std_logic_vector (3 downto 0);
signal b_or_d_mux: std_logic_vector (3 downto 0);

  a_or_c_mux <= a when ctrl='0' else c;
  b_or_d_mux <= b when ctrl='0' else d;

现在,您可以实例化模块(一次!在进程外部),并使用信号a_or_c_muxb_or_d_mux作为模块前两个端口的输入。

1 我故意使用“硬件”命名法。