如何设计支持起始位置与固定长度配置的译码器电路
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
相关产品推荐
相关产品推荐

