VHDL中4位与3位无符号数相加异常及后续问题咨询
VHDL ALU加法输出'X'问题原因解析
核心本质:进程敏感列表的触发逻辑
VHDL进程仅会在敏感列表中列出的信号发生跳变时才会启动执行,重新计算内部逻辑并更新输出信号。你的问题完全是由于敏感列表未覆盖所有输入变化导致的。
情况1:c赋值在进程内时的问题
- 最初敏感列表未包含
c,而c是进程内由b生成的位宽调整信号(拼接/resize)。当b变化时,进程不会被触发(因为b不在敏感列表),c的更新无法传递到加法逻辑,导致输出始终为X。 - 把
c加入敏感列表后,b变化会先更新c,c的跳变再触发进程执行,加法逻辑能获取到最新的c值,输出恢复正常。
情况2:c赋值移到进程外时的问题
- 进程外的
c <= resize(b, a'length)属于并发赋值,c会随b实时更新,但此时你把敏感列表改成仅保留ch:- 只有当操作选择信号
ch变化时,进程才会执行;如果b变化但ch保持不变,进程不会重新运行,加法逻辑仍然使用之前的旧值(甚至是初始的未知态X),所以输出还是X。
- 只有当操作选择信号
- 正确的敏感列表应该包含所有参与进程内运算的输入信号:
a、b(或c)、ch,确保任何一个输入变化都能触发进程重新计算输出。
关于位宽调整的补充
你用的('0' & b)拼接或resize(b, a'length)都是无符号数扩位的正确方式(补0符合无符号数的数值含义),本身没有问题,输出X的根源不在位宽调整逻辑,而在进程的触发条件。
内容的提问来源于stack exchange,提问作者Dhruv Jain
相关产品推荐
相关产品推荐

