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
相关产品推荐
相关产品推荐

