首页 > 解决方案 > 我可以在“进程”中使用“端口映射”吗?

问题描述

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) 期待 PROCESS。

标签: vhdl

解决方案


永远不要忘记 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我故意使用“硬件”命名法。


推荐阅读