如何在VHDL中添加独立进程实现MyVariable等于1时的设备状态上报
VHDL测试用例改造实现状态上报
现有代码的核心问题
你计划新增的进程目前无法正常运行,核心原因有三点:
- 作用域限制:原代码中的
MyVariable是第一个进程内部定义的局部变量,仅对该进程可见,外部进程无法直接访问,直接引用会触发编译报错 - 语法混淆:VHDL中相等判断使用单等号
=,你写的MyVariable = 1;只是独立的无执行逻辑的表达式,没有嵌套在条件分支中,不会触发任何判断动作;另外变量赋值用:=、信号赋值用<=,和相等判断的=是完全不同的语义,新手很容易混淆 - 进程逻辑缺陷:新增的进程没有敏感列表、没有wait类的阻塞语句,直接写顺序执行逻辑会导致仿真器空转死锁,进程永久阻塞无法退出
具体改造步骤
1. 调整跨进程变量的定义
把原来第一个进程内部的MyVariable从局部变量,上移到架构声明区,改成和MySignal同级的全局信号:
architecture sim of T06_SignalTb is signal MySignal : integer :=0; -- 将原进程内的局部变量改为架构级信号,实现跨进程可见 signal MyVariable : integer :=0; begin
这里必须用信号类型而非变量:VHDL的变量是纯顺序执行语义,赋值后立即生效且不会产生仿真事件,其他进程完全无法感知它的数值变化,只有信号能通过事件触发机制,被其他进程监听。
2. 修改原激励进程的赋值逻辑
因为MyVariable已经改为信号,原进程里对应的赋值语句要从变量赋值符:=改成信号赋值符<=:
process is begin report "***Process begin***"; -- 对应修改为信号赋值 MyVariable <= MyVariable + 1; MySignal <= MySignal + 1; report "MyVariable=" & integer'image(MyVariable) & ", MySignal=" & integer'image(MySignal); MyVariable <= MyVariable + 1; MySignal <= MySignal + 1; report "MyVariable=" & integer'image(MyVariable) & ", MySignal=" & integer'image(MySignal); wait for 10 ns; -- 注:当前代码跑完两次自增、等待10ns后进程就会退出,如果需要持续跑激励,可把上述逻辑包在无限循环中 end process;
3. 编写正确的状态上报进程
替换你计划新增的进程,通过敏感列表监听MyVariable的变化,触发条件上报:
-- 新增监听进程,将MyVariable加入敏感列表,数值变化时自动唤醒 process(MyVariable) begin -- 判断数值,满足等于1的条件时打印上报信息 if MyVariable = 1 then report " the device is on" severity note; end if; end process;
这种写法不需要手动编写wait语句,只要
MyVariable的数值发生跳变,进程就会自动执行,不会空转消耗仿真资源;判断语法完全符合VHDL规范,编译无报错。
实际运行效果
当第一个进程第一次给MyVariable赋值为1时,监听进程会被立刻触发,在仿真日志中打印the device is on的上报信息,完全实现需求。
内容的提问来源于stack exchange,提问作者JOHNPAUL LANZADERAS
相关产品推荐
相关产品推荐

