亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Industrial programming >> VHDL

利用VHDL常量与泛型映射实现灵活模块设计

创建可复用模块是高效VHDL设计基石,但微小变化常导致代码重复。泛型和泛型映射通过允许编译期配置模块参数解决此问题,保持代码DRY且可维护。

常量避免重复硬编码相同值。它们适合定义信号向量宽度等编译期参数,甚至可映射到泛型常量。与信号或变量不同,常量值在精化后不可变,确保设计一致性。

本文属基础VHDL教程系列。

上一教程构建了8位总线宽度的4输入多路选择器。若现在需要不同宽度的类似MUX,复制粘贴整个模块不是唯一选项。

改为声明保存所需总线宽度的常量,通过泛型传递给模块。仅需在测试平台的常量声明处修改宽度。

VHDL声明常量语法:

constant <constant_name> : <type> := <value>;

常量可与信号并列出现在文件声明部,或与变量并列在进程内。

在实体声明中用generic关键字暴露常量给模块:

entity <entity_name> is generic( <entity_constant_name> : <type> [:= default_value]; ... ); port( <entity_signal_name> : in|out|inout <type>; ... ); end entity;

在别处用generic map和port map实例化泛型模块:

<label> : entity <library_name>.<entity_name>(<architecture_name>) generic map( <entity_constant_name> => <value_or_constant>, ... ) port map( <entity_signal_name> => <local_signal_name>, ... );

练习

本视频教程演练创建并实例化泛型4输入MUX模块。

测试平台 – 泛型MUX

library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; entity T16_GenericMapTb is end entity; architecture sim of T16_GenericMapTb is constant DataWidth : integer := 8; signal Sig1 : signed(DataWidth-1 downto 0) := x"AA"; signal Sig2 : signed(DataWidth-1 downto 0) := x"BB"; signal Sig3 : signed(DataWidth-1 downto 0) := x"CC"; signal Sig4 : signed(DataWidth-1 downto 0) := x"DD"; signal Sel : signed(1 downto 0) := (others => '0'); signal Output : signed(DataWidth-1 downto 0); begin i_Mux1 : entity work.T16_GenericMux(rtl) generic map(DataWidth => DataWidth) port map( Sel => Sel, Sig1 => Sig1, Sig2 => Sig2, Sig3 => Sig3, Sig4 => Sig4, Output => Output ); process is begin wait for 10 ns; Sel <= Sel + 1; wait for 10 ns; Sel <= Sel + 1; wait for 10 ns; Sel <= Sel + 1; wait for 10 ns; Sel <= Sel + 1; wait for 10 ns; Sel <= "UU"; wait; end process; end architecture;

泛型MUX模块

library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; entity T16_GenericMux is generic(DataWidth : integer); port( -- Inputs Sig1 : in signed(DataWidth-1 downto 0); Sig2 : in signed(DataWidth-1 downto 0); Sig3 : in signed(DataWidth-1 downto 0); Sig4 : in signed(DataWidth-1 downto 0); Sel : in signed(1 downto 0); -- Output Output : out signed(DataWidth-1 downto 0) ); end entity; architecture rtl of T16_GenericMux is begin process(Sel, Sig1, Sig2, Sig3, Sig4) is begin case Sel is when "00" => Output <= Sig1; when "01" => Output <= Sig2; when "10" => Output <= Sig3; when "11" => Output <= Sig4; when others => Output <= (others => 'X'); end case; end process; end architecture;

ModelSim仿真波形(时间线放大):

利用VHDL常量与泛型映射实现灵活模块设计

分析

在测试平台一次性定义DataWidth,即可在不修改模块代码的情况下将同一MUX适配任意总线宽度。波形确认功能与硬编码版本完全一致。

利用VHDL常量与泛型映射实现灵活模块设计

要点

进入下一教程 »

VHDL

  1. PIC18 单片机全解析:特性、性能、编程与应用指南
  2. 利用进程内过程简化VHDL状态机设计
  3. 使用VHDL不纯函数提升FSM可读性与可维护性
  4. 掌握VHDL函数:高效设计实战指南
  5. 在VHDL中使用过程:用可复用代码简化设计
  6. 利用VHDL常量与泛型映射实现灵活模块设计
  7. 掌握VHDL端口映射实例化实战指南
  8. 掌握VHDL Case-When语句:高效多路选择器设计
  9. 掌握VHDL Signed与Unsigned类型实战指南
  10. 掌握VHDL std_logic:状态、分辨函数与波形分析
  11. 掌握 VHDL 条件逻辑:If-Then-Elsif-Else 详解
  12. 免费 VHDL 仿真器与编辑器安装指南:学生版