You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用另一模块变量重置本模块变量是否为不良设计实践?

自动售货机复位方案的可行性分析

问题背景

我正在开发一台自动售货机,希望支付总额在糖果售出或交易取消前保持其数值。为简化实现,请问采用如下方式实现重置是否可行?

代码实现

module m1(
  input clk,
  input m2_reset,
  output enough_payment);
   
  always@(posedge clk, posedge m2_reset) begin
    if (m2_reset) begin
        payment<=0;
        enough_payment<=0; end
    else if(payment<=CANDY_PRICE) begin //当支付金额不足时继续收款
            payment<= coin_5*5 + coin_10*10; 
            enough_payment<=0; end 
         else //支付金额将等于或略高于CANDY_PRICE
            enough_payment<=1;  
  end
endmodule

module m2(
  input clk, enough_payment,
  output m2_reset);

  always@(posedge clk) begin
    if(enough_payment)
        if(counter==RANDOM_NUM)
           m2_reset<=1;
        else begin
           m2_reset<=0;
           counter<=counter+1; 
  end
endmodule

可行性结论:该方案不可行,核心问题如下

  • 支付金额无法保持:m1模块中,当支付不足时,payment被直接赋值为coin_5*5 + coin_10*10,这是用当前硬币输入的总金额覆盖原有值,而非累加之前的支付总额,完全不符合“保持支付总额”的需求。比如用户先投10元,再投5元,代码里的payment会变成5元,而不是15元。
  • 复位逻辑脱离实际需求:m2模块的复位触发依赖counter计数到RANDOM_NUM,这和“糖果售出”或“交易取消”的实际事件完全无关,无法正确对应售货机的业务流程——正常应该是当糖果出货完成(或用户触发取消)时立即复位支付金额,而非随机等待计数。
  • 代码存在编译与设计缺陷:
    • m1模块未将coin_5、coin_10定义为输入端口,也未声明payment、CANDY_PRICE变量;
    • m2模块未声明counter、RANDOM_NUM变量,且counter无初始化逻辑,上电后会处于未知状态;
    • m2的m2_reset信号在enough_payment为0时没有明确赋值,会产生锁存器,违反时序逻辑设计规范。

修正方向建议

  1. 修复支付金额累加逻辑:将payment的赋值改为累加形式,比如payment <= payment + coin_5*5 + coin_10*10,同时需要添加硬币输入的边沿检测(避免同一硬币被重复计数)。
  2. 关联复位与实际业务事件:新增“糖果售出完成”或“交易取消”的输入信号,当这些事件发生时触发m2_reset,而非依赖随机计数。
  3. 补全代码定义:添加缺失的输入端口、变量声明,为时序变量添加初始化逻辑(比如通过复位信号初始化counter)。

内容的提问来源于stack exchange,提问作者Ilan Mermelstein

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 05:42:44