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) 期待 PROCESS。
解决方案
永远不要忘记 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我故意使用“硬件”命名法。
推荐阅读
- xamarin.mac - xamarin.mac 添加 netstandard 库但构建错误
- perl - 如何让 ansible playbook 为我的 perlscript.pl 输入,其中包含
? - c# - 使用自定义数据库表在 asp.net core 2.2 中实现社交登录而不使用身份
- python-3.x - 具有多个依赖项的 tox.ini 环境
- java - 如何解决这个 NullPointerException 问题?
- python - 具有相对频率或密度曲线的计数图
- google-app-engine - 为什么 gcloud components update 命令总是显示重启命令
- java - 如何使用 GeoFire 和 Firebase 查询特定位置的文档?
- mql4 - 如何将 MT4 中的文件夹结构粘贴到 Tradingview 中的文件夹结构中
- bash - 如何添加命令以刷新 Firefox 使用命令的新设置?