关于VHDL进程语句内if块中信号赋值执行顺序的技术问询
VHDL进程内信号赋值的执行逻辑解析
首先直接给结论:你代码里进程if语句中的a <= b;、b <= c;、c <= a;这三条信号赋值语句是顺序执行的,但信号值的更新是并发生效的——这是VHDL里信号赋值的核心特性,很容易搞混,我给你拆解清楚:
1. 进程内语句的执行顺序
VHDL的进程内部确实是顺序执行的,也就是说当rising_edge(clk)触发时,代码会严格按照从上到下的顺序执行这三条赋值语句:
- 第一步执行
a <= b;:此时会读取时钟沿到来前b的旧值,把这个值存入a的信号驱动队列(不是立刻把a改成b); - 第二步执行
b <= c;:同样读取时钟沿到来前c的旧值,存入b的驱动队列; - 第三步执行
c <= a;:读取时钟沿到来前a的旧值,存入c的驱动队列;
2. 信号值的更新时机
VHDL中信号的赋值不是立即生效的,所有在进程内被触发的信号赋值,都会等到进程执行完毕(也就是这次时钟沿触发的进程逻辑走完)后,才会同时更新所有信号的值。
所以回到你的代码,当进程结束后:
- a会变成原来的b;
- b会变成原来的c;
- c会变成原来的a;
相当于三个信号的值完成了一次轮换,而不是按“a等于b,b等于新的c,c等于新的a”这种即时更新的逻辑走——如果是变量赋值(用:=)才会是后者的结果,但信号不一样。
举个直观的例子
假设时钟沿到来前,a=1,b=2,c=3:
- 进程执行时,分别把2、3、1存入对应信号的驱动队列;
- 进程结束后,a=2,b=3,c=1——完美轮换,这就是信号赋值延迟更新带来的结果。
内容的提问来源于stack exchange,提问作者user9736196
相关产品推荐
相关产品推荐

