使用另一模块变量重置本模块变量是否为不良设计实践?
自动售货机复位方案的可行性分析
问题背景
我正在开发一台自动售货机,希望支付总额在糖果售出或交易取消前保持其数值。为简化实现,请问采用如下方式实现重置是否可行?
代码实现
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时没有明确赋值,会产生锁存器,违反时序逻辑设计规范。
- m1模块未将
修正方向建议
- 修复支付金额累加逻辑:将
payment的赋值改为累加形式,比如payment <= payment + coin_5*5 + coin_10*10,同时需要添加硬币输入的边沿检测(避免同一硬币被重复计数)。 - 关联复位与实际业务事件:新增“糖果售出完成”或“交易取消”的输入信号,当这些事件发生时触发
m2_reset,而非依赖随机计数。 - 补全代码定义:添加缺失的输入端口、变量声明,为时序变量添加初始化逻辑(比如通过复位信号初始化
counter)。
内容的提问来源于stack exchange,提问作者Ilan Mermelstein
相关产品推荐
相关产品推荐

