解析信号:VHDL中的关键概念与应用
立即解锁
发布时间: 2025-08-16 01:28:51 阅读量: 5 订阅数: 11 


VHDL设计指南:从入门到精通
# 解析信号:VHDL中的关键概念与应用
## 1. 多值逻辑子类型与解析规则
在多值逻辑建模中,有一些特殊的解析规则需要我们注意。当“无关”值(‘–’)与任何其他值进行解析时,结果为未知值‘X’。这意味着模型尚未对其输出状态做出选择。而当“未初始化”值(‘U’)与任何其他值解析时,结果仍为‘U’,表明模型未正确初始化所有输出。
除了这些基本规则,还定义了一些更受限的多值逻辑子类型,如下所示:
```vhdl
subtype X01 is
resolved std_ulogic range 'X' to '1'; -- ('X','0','1')
subtype X01Z is
resolved std_ulogic range 'X' to 'Z'; -- ('X','0','1','Z')
subtype UX01 is
resolved std_ulogic range 'U' to '1'; -- ('U','X','0','1')
subtype UX01Z is
resolved std_ulogic range 'U' to 'Z'; -- ('U','X','0','1','Z')
```
这些子类型都是封闭的,即解析结果都在子类型的范围内。例如,子类型X01Z对应于之前介绍的MVL4类型。
## 2. 解析信号、端口和参数
### 2.1 解析信号与端口的基本概念
在之前对解析信号的讨论中,我们主要关注了多个驱动或组件实例的输出端口驱动一个信号的简单情况。当进行事务处理时,连接到解析信号的任何输入端口都会将最终解析值作为端口值。现在,我们深入探讨inout模式端口连接到解析信号的情况。
对于inout模式端口,其输入侧看到的值是连接到该端口的解析信号的最终值,而不是组件实例驱动的值。这是因为inout端口模拟了一种连接,其中驱动对关联信号的值有贡献,而组件的输入侧感知的是实际信号,而非驱动值。
### 2.2 分布式同步示例
一些异步总线协议使用基于线与控制信号的分布式同步机制。每个模块使用低电平有效、集电极开路或漏极开路驱动器驱动该信号,并通过总线终端上拉。
以下是一个总线模块的实体声明,它有一个未解析类型std_ulogic的端口,用于连接到同步控制信号:
```vhdl
library ieee; use ieee.std_logic_1164.all;
entity bus_module is
port ( synch : inout std_ulogic; ... );
end entity bus_module;
```
包含多个此类模块的系统的架构主体如下:
```vhdl
architecture top_level of bus_based_system is
signal synch_control : std_logic;
...
begin
synch_control_pull_up : synch_control <= 'H';
bus_module_1 : entity work.bus_module(behavioral)
port map ( synch => synch_control, ... );
bus_module_2 : entity work.bus_module(behavioral)
port map ( synch => synch_control, ... );
...
end architecture top_level;
```
总线模块的行为架构主体概述如下:
```vhdl
architecture behavioral of bus_module is
begin
behavior : process is
...
begin
synch <= '0' after Tdelay_synch;
...
-- ready to start operation
synch <= 'Z' after Tdelay_synch;
wait until synch = 'H';
-- proceed with operation
...
end process behavior;
end architecture behavioral;
```
每个实例最初将其同步端口驱动为‘0’,该值作为实体实例对解析信号的贡献。当实例准备好进行操作时,将驱动值更改为‘Z’,模拟集电极开路或漏极开路驱动器关闭。然后进程暂停,直到同步端口的值变为‘H’。
### 2.3 解析端口
与信号可以是解析子类型一样,实体接口列表中声明的端口也可以是解析的。如果架构主体中有多个进程必须驱动一个端口,或者多个组件实例必须将输出连接到一个端口,则该端口必须是解析的。最终驱动解析端口的值是通过解析架构主体内的所有源来确定的。
例如,以下是一个具有解析端口的实体声明:
```vhdl
library ieee; use ieee.std_logic_1164.all;
entity IO_section is
port ( data_ack : inout std_logic; ... );
end entity IO_section;
```
对应的架构主体可能会实例化多个I/O控制器组件,每个组件的数据确认端口都连接到实体的data_ack端口。每次任何控制器更新其数据确认端口时,都会调用标准逻辑解析函数来确定data_ack端口的驱动值。
### 2.4 三态总线内存系统示例
我们可以为具有三态数据总线的多内存设备组成的内存系统编写模型。内存设备的实体声明如下:
```vhdl
library ieee; use ieee.std_logic_1164.all;
entity memory_256Kx8 is
port ( ce_n, oe_n, we_n : in std_ulogic;
a : in std_ulogic_vector(17 downto 0);
d : inout std_ulogic_vector(7 downto 0) );
end entity memory_256Kx8;
```
内存系统的实体声明如下:
```vhdl
library ieee; use ieee.std_logic_1164.all;
entity memory_1Mx8 is
port ( ce_n, oe_n, we_n : in std_ulogic;
a : in std_ulogic_vector(19 downto 0);
d : inout std_logic_vector(7 downto 0) );
end entity memory_1Mx8;
```
内存系统的d端口是具有解析元素的std_logic_vector类型,因为内部有多个源。其结构架构如下:
```vhdl
architecture struct of memory_1Mx8 is
signal ce_decoded_n : std_ulogic_vector(3 downto 0);
begin
with a(19 downto 18) select
ce_decoded_n <= "1110" when "00",
"1101" when "01",
"1011" when "10",
"0111" when "11",
"XXXX" when others;
chip0 : component memory_256Kx8
port map ( ce_n => ce_decoded_n(0),
oe_n => oe_n, we_n => we_n,
a => a(17 downto 0), d => d );
chip1 : component memory_256Kx8
port map ( ce_n => ce_decoded_n(1),
oe_n => oe_n, we_n => we_n,
a => a(17 downto 0), d => d );
...
end architecture struct;
```
我们可以将每个内存设备实例的d端口直接连接到内存系统的d端口,所有实例的贡献将被解析以形成内存系统d端口的驱动值。
### 2.5 层次化解析示例
在计算机系统模型中,可能存在多层次的层次结构。例如,单主板计算机系统由视频显示帧缓冲器、输入/输出控制器部分、CPU/内存部分和总线扩展块组成。这些都是解析数据总线信号的源。
当其中一个缓存部分更新其数据端口时,新的驱动值将与其他缓存部分的当前驱动值解析,以确定CPU/缓存块数据端口的驱动值。然后,该结果将与内存块的当前驱动值解析,以确定CPU/内存部分的驱动值。最后,该驱动值将与其他顶级部分的当前驱动值解析,以确定数据总线信号的有效值。这个有效值将作为每个in模式或inout模式端口的有效值传回端口层次结构,并在每个端口的输入侧使用。
### 2.6 不同模式端口的读取差异
在实体架构中,读取buffer模式或out模式端口的值与读取inout模式端口的值有重要区别。对于inout模式端口,内部看到的值是外部连接信号的有效值,信息从外部连接传入架构。而对于buffer模式或out模式端口,内部看到的值是端口的驱动值,没有信息传入架构。我们通常使用buffer模式或out模式端口进行具有缓冲内部连接的设计,或用于内部验证,例如使用断言。
以下是一个验证三态断开时序的示例:
```vhdl
entity device is
port ( en : in std_ulogic;
d_out : out std_ulogic_vector(7 downto 0); ... );
end entity device;
architecture verifying of device is
constant T_z : delay_length := 200 ps;
begin
d_out <= ... when en else
... when not en else
"XXXXXXXX";
assert en or (not en'delayed(T_z) and d_out ?= "ZZZZZZZZ");
end architecture verifying;
```
### 2.7 驱动值属性
由于信号或inout模式端口上看到的值可能与进程驱动的值不同,VHDL提供了一个属性'driving_value,允许进程读取其对前缀信号的贡献值。例如,如果一个进程驱动解析信号s为‘Z’,但s的解析函数可能使其值为‘0’,进程可以通过s'driving_value获取‘Z’。需要注意的是,进程只能使用此属性确定自己对信号的贡献,不能直接了解其他进程的贡献。
### 2.8 解析信号参数
对于带有信号参数的子程序,在解析信号存在的情况下,其行为如下:
- 当调用具有out模式信号参数的过程时,过程会收到调用者对实际信号的驱动引用。过程体内的任何信号赋值语句实际上是在调用者的驱动上执行的。如果实际信号参数是解析信号,则过程赋值的值用于解析信号值,过程内部不进行解析。
- 当读取函数或过程的信号参数时,调用子程序时会传递实际信号参数的引用,子程序使用信号的实际值。如果信号是解析的,
0
0
复制全文
相关推荐










