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 = 0A[0*32 +: 32] = A[0 +: 32] = A[31:0]

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

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

  • 当 i = 3A[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. 编译时宽度必须是确定的,不能是变量

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FPGA_小田老师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值