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)期望进行此操作。
答案 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_mux
和b_or_d_mux
作为模块前两个端口的输入。
1 我故意使用“硬件”命名法。