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. 编译时宽度必须是确定的,不能是变量

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

相关推荐
嵌入式-老费3 小时前
Linux Camera驱动开发(fpga + csi rx/csi tx)
fpga开发
ALINX技术博客15 小时前
【202601芯动态】全球 FPGA 异构热潮,ALINX 高性能异构新品预告
人工智能·fpga开发·gpu算力·fpga
JJRainbow1 天前
SN75176 芯片设计RS-232 转 RS-485 通信模块设计原理图
stm32·单片机·嵌入式硬件·fpga开发·硬件工程
s9123601011 天前
FPGA眼图
fpga开发
北京青翼科技1 天前
【PCIe732】青翼PCIe采集卡-优质光纤卡- PCIe接口-万兆光纤卡
图像处理·人工智能·fpga开发·智能硬件·嵌入式实时数据库
minglie11 天前
verilog信号命名规范
fpga开发
XINVRY-FPGA1 天前
中阶FPGA效能红线重新划定! AMD第2代Kintex UltraScale+登场,记忆体频宽跃升5倍
嵌入式硬件·fpga开发·硬件工程·dsp开发·fpga
南檐巷上学1 天前
基于FPGA的音频信号监测识别系统
fpga开发·音频·verilog·fpga·傅立叶分析·fft·快速傅里叶变换
Aaron15882 天前
基于RFSOC的数字射频存储技术应用分析
c语言·人工智能·驱动开发·算法·fpga开发·硬件工程·信号处理
碎碎思2 天前
当 FPGA 遇见怀旧计算:486 与 Atari ST 的硬件级重生
fpga开发