FPGA语法基础(三):Verilog 位选择语法详解

位选择是Verilog中用于选择向量部分位的语法,主要有以下几种形式:

1. 基本位选择语法

复制代码
// 固定位置选择
wire [7:0] data = 8'b1010_1100;
wire [3:0] lower_nibble = data[3:0];    // 4'b1100
wire [3:0] upper_nibble = data[7:4];    // 4'b1010

// 变量索引选择
reg [2:0] index = 2;
wire bit_selected = data[index];        // data[2] = 1'b1

2. 可变位宽选择语法 (+:-:)

+: 语法(从起始位向上选择)

复制代码
// 语法:starting_index +: width
// 从 starting_index 开始,向上选择 width 位

wire [15:0] word = 16'hA5F3;
wire [7:0] byte1 = word[7:0];           // 传统写法
wire [7:0] byte2 = word[15:8];          // 传统写法

// 使用 +: 语法
wire [7:0] byte1_plus = word[0 +: 8];   // 从0位开始向上8位:word[7:0]
wire [7:0] byte2_plus = word[8 +: 8];   // 从8位开始向上8位:word[15:8]

-: 语法(从起始位向下选择)

复制代码
// 语法:starting_index -: width  
// 从 starting_index 开始,向下选择 width 位

wire [15:0] word = 16'hA5F3;
wire [7:0] byte1_minus = word[7 -: 8];  // 从7位开始向下8位:word[0:7]
wire [7:0] byte2_minus = word[15 -: 8]; // 从15位开始向下8位:word[8:15]

3. 解决你的问题

对于具体需求:

复制代码
// 输入
input [127:0] A;    // 128位数据
input [1:0] i;      // 选择索引 (0-3)
output [31:0] B;    // 选择的32位数据

// 解决方案
assign B = A[i*32 +: 32];

详细解释:

  • i = 0: A[0*32 +: 32] = A[0 +: 32] = A[31:0]

  • i = 1: A[1*32 +: 32] = A[32 +: 32] = A[63:32]

  • i = 2: A[2*32 +: 32] = A[64 +: 32] = A[95:64]

  • i = 3: A[3*32 +: 32] = A[96 +: 32] = A[127:96]

4. 更多示例

复制代码
// 32位字中选择不同的字节
reg [31:0] data_word = 32'h1234_5678;
wire [7:0] byte0 = data_word[0 +: 8];   // 8'h78
wire [7:0] byte1 = data_word[8 +: 8];   // 8'h56  
wire [7:0] byte2 = data_word[16 +: 8];  // 8'h34
wire [7:0] byte3 = data_word[24 +: 8];  // 8'h12

// 使用变量索引
reg [1:0] sel = 2'b01;
wire [7:0] selected_byte = data_word[sel*8 +: 8];  // data_word[8 +: 8] = 8'h56

// 从64位数据中选择16位段
reg [63:0] big_data = 64'h0123_4567_89AB_CDEF;
reg [2:0] segment = 3'b010;
wire [15:0] segment_data = big_data[segment*16 +: 16];  // big_data[32 +: 16] = 16'h89AB

5. 关键要点

  1. +: 向上选择:从起始索引向更高位选择

  2. -: 向下选择:从起始索引向更低位选择

  3. 起始索引可以是变量 ,但宽度必须是常量

  4. 比传统的 [MSB:LSB] 语法更适合参数化设计

  5. 编译时宽度必须是确定的,不能是变量

这种语法在参数化模块和需要动态选择数据段的情况下非常有用!

相关推荐
ZPC82103 天前
docker 镜像备份
人工智能·算法·fpga开发·机器人
ZPC82103 天前
docker 使用GUI ROS2
人工智能·算法·fpga开发·机器人
tiantianuser3 天前
RDMA设计53:构建RoCE v2 高速数据传输系统板级测试平台2
fpga开发·rdma·高速传输·cmac·roce v2
博览鸿蒙3 天前
FPGA 和 IC,哪个前景更好?怎么选?
fpga开发
FPGA_小田老师3 天前
xilinx原语:ISERDESE2原语详解(串并转换器)
fpga开发·iserdese2·原语·串并转换
tiantianuser3 天前
RDMA设计50: 如何验证网络嗅探功能?
网络·fpga开发·rdma·高速传输·cmac·roce v2
Lzy金壳bing3 天前
基于Vivado平台对Xilinx-7K325t FPGA芯片进行程序在线更新升级
fpga开发·vivado·xilinx
unicrom_深圳市由你创科技3 天前
医疗设备专用图像处理板卡定制
图像处理·人工智能·fpga开发
tiantianuser3 天前
RDMA设计52:构建RoCE v2 高速数据传输系统板级测试平台
fpga开发·rdma·高速传输·cmac·roce v2
luoganttcc4 天前
Taalas 将人工智能模型蚀刻到晶体管上,以提升推理能力
人工智能·fpga开发