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

如何设计支持起始位置与固定长度配置的译码器电路

64位定长连续1掩码组合逻辑实现方案

需求说明

  • 输入:两个6位信号start_id(取值范围063,标记连续1序列的起始位位置)、`id_num`(取值范围063,标记连续1序列的位长度)
  • 输出:64位信号id_mask,从start_id对应位开始连续id_num位为1,其余位为0
  • 边界规则:id_num=0时输出全0;start_id + id_num > 64属于非法输入,无需做特殊处理

输入输出对应规则示例:

// 输入start_id  输入id_num  输出id_mask
// 0            0           64位全0
// 0            2           高62位为0、低2位为1
// 2            16          高46位为0、中间16位为1、低2位为0
// ...          ...         ...
// 60           16          和为76>64,非法输入无需处理

实现方案

以下两种方案均为纯组合逻辑实现,资源开销小,容易满足时序收敛要求。

方案1:移位生成法(资源最优)

核心逻辑是先生成低id_num位为1的基底掩码,再左移start_id位得到目标位置的掩码,Verilog实现代码如下:

wire [63:0] base_mask;
wire [63:0] id_mask;

// 生成低id_num位连续1的基底,兼容id_num=64的边界场景
assign base_mask = (id_num == 6'd64) ? 64'hFFFFFFFFFFFFFFFF : (1 << id_num) - 1;
// 左移对应起始位置,得到最终掩码
assign id_mask = base_mask << start_id;

对应示例场景的验证结果:

  • start_id=0、id_num=0:base_mask=0,移位后输出全0,符合要求
  • start_id=0、id_num=2:base_mask=64'h3,移位后低2位为1,匹配{62{0},2{1}}的输出要求
  • start_id=2、id_num=16:base_mask=64'hFFFF,左移2位后bit2~bit17共16位为1,匹配{46{0},16{1},2{0}}的输出要求

如果需要额外识别非法输入,加1位valid信号即可:

wire input_valid = (start_id + id_num) <= 64;

方案2:位级比较法(可读性最优)

对输出的每一位单独做判断:当位索引大于等于起始位置、且小于起始位置加连续长度时,该位输出1,否则输出0。用Verilog generate语法实现如下:

genvar bit_idx;
generate
    for(bit_idx = 0; bit_idx < 64; bit_idx = bit_idx + 1) begin : gen_each_bit
        assign id_mask[bit_idx] = (bit_idx >= start_id) && (bit_idx < start_id + id_num);
    end
endgenerate

这种写法不需要手动处理移位溢出的边界问题,综合器会自动优化为和移位法性能接近的电路,适合对代码可维护性要求高的场景。

内容的提问来源于stack exchange,提问作者donat jack

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 07:31:27