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

Verilog中按跳过4位取8位模式提取向量位的方法咨询

位提取实现方案

首先修正代码笔误:你定义的wire [WIDTH*64-1:0] data_in看起来是多总线拼接,但结合需求,实际要处理的应为单条64位总线wire [WIDTH-1:0] data_in(WIDTH=64)。

直接拼接实现(对应结构化提取思路)

核心是利用Verilog的连续位选择语法([起始位+:位宽])和信号拼接,精准提取目标位段:
首先定义提取后的输出信号(总位数为3+8+8=19位):

localparam WIDTH = 64;
wire [WIDTH-1:0] data_in;
wire [18:0] extracted_data; // 19位输出,位宽从18到0

然后通过位选择拼接实现提取逻辑:

assign extracted_data = {
    data_in[31+:3],   // 提取31-29位(共3位)
    data_in[24+:8],   // 提取24-17位(共8位)
    data_in[11+:8]    // 提取11-4位(共8位)
};

通用循环实现(适配重复提取规则)

如果你的提取规则是跳过4位→提取8位→跳过4位的循环(从LSB往上),可以用generate循环实现通用化逻辑:

localparam WIDTH = 64;
localparam SKIP = 4;
localparam TAKE = 8;
localparam NUM_GROUPS = 2; // 对应11-4、24-17两组8位段
wire [WIDTH-1:0] data_in;
wire [TAKE*NUM_GROUPS + 2:0] extracted_data; // 8*2+3=19位

genvar i;
generate
    for(i=0; i<NUM_GROUPS; i=i+1) begin : extract_groups
        // 每组起始位计算:SKIP + i*(SKIP+TAKE) = 4 + i*12
        assign extracted_data[TAKE*i +: TAKE] = data_in[SKIP + i*(SKIP+TAKE) +: TAKE];
    end
    // 单独处理高位的31-29位(循环外的特殊段)
    assign extracted_data[TAKE*NUM_GROUPS +: 3] = data_in[31+:3];
endgenerate

语法说明

  • [起始位+:位宽] 是Verilog的连续位选择语法,data_in[a+:b] 等价于data_in[a+b-1 : a],能直观从起始位提取指定宽度的位段。
  • 直接拼接方式适合固定位段提取,代码简洁易读;循环方式适合有重复规则的批量提取,扩展性更强。

内容的提问来源于stack exchange,提问作者ZAKARIA BOUHANNA

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 12:50:25