VHDL组合逻辑中信号赋值语句并发执行机制及仿真疑问
理解VHDL组合逻辑中的并发信号赋值
这是个非常经典的VHDL新手误解——把软件里的并行执行逻辑套到了硬件描述语言的并发模型上,咱们一步步拆解清楚你的疑问:
首先要明确:VHDL的并发信号赋值不是“执行一次”的并行代码,而是对硬件持续连接关系的建模。你写的每一条并发赋值语句,本质上都对应着一块组合逻辑电路(比如与门),这些电路在硬件里是同时存在、时刻工作的,而不是像软件线程那样“跑一遍就停”。
你的代码对应的硬件逻辑
先看你给出的代码:
entity test1 is port (a, b, c, d : in bit; y : out bit); end entity test1; architecture basic of test1 is signal wire1, wire2 : bit; begin wire1 <= a and b; -- 对应一个2输入与门,输入a/b,输出wire1 wire2 <= c and d; -- 对应第二个2输入与门,输入c/d,输出wire2 y <= wire1 and wire2; -- 对应第三个2输入与门,输入wire1/wire2,输出y end architecture basic;
这三条语句在硬件里是三个独立的与门,通过wire1、wire2直接连线。当输入a/b/c/d中的任何一个变化时:
- 对应的与门会立刻计算出新的输出(比如
a变了,第一个与门的输出wire1立刻更新); wire1或wire2的变化会直接触发第三个与门,立刻计算出y的新值。
为什么仿真中y会“立即”变化?
你觉得“并发执行的话y无法感知wire1和wire2的变化”,是把VHDL的并发当成了软件里的“一次性并行任务”——比如三个线程同时启动,各自计算一次就结束。但VHDL的并发赋值是持续敏感的:
- 每条并发赋值语句背后都隐含着一个组合逻辑进程,比如
wire1 <= a and b等价于:
这个进程会时刻监控process(a, b) begin wire1 <= a and b; end process;a和b,只要其中任何一个信号变化,就会重新计算并更新wire1。 - 同理,
y <= wire1 and wire2对应的隐式进程会监控wire1和wire2,只要这两个信号有变化,就立刻更新y。
在仿真的零延迟模型中(默认行为),这些信号的更新是瞬间完成的——a变化→wire1变化→y变化,整个过程没有时间延迟,所以你会看到y“立即”跟着输入变化。如果加上门延迟(比如wire1 <= a and b after 1ns;),你就能看到信号变化的先后顺序,但本质上还是并发的硬件逻辑在工作。
核心结论
VHDL的并发赋值不是“多次执行语句”,而是建模硬件中永久存在的并行连接。每个赋值语句对应一块时刻工作的逻辑电路,信号的变化会沿着这些连接路径实时传播,这就是组合逻辑的本质——输入变,输出立刻变,没有存储、没有等待,完全是硬件连线的直接反应。
内容的提问来源于stack exchange,提问作者Koli
相关产品推荐
相关产品推荐

