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

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

相关推荐
XINVRY-FPGA17 小时前
XC95288XL-10TQG144I Xilinx AMD CPLD
arm开发·单片机·嵌入式硬件·mcu·fpga开发·硬件工程·fpga
i道i19 小时前
Verilog 利用伪随机,时序,按键消抖等,实现一个(打地鼠)游戏
游戏·fpga开发·verilog
奋斗的牛马21 小时前
OFDM理解
网络·数据库·单片机·嵌入式硬件·fpga开发·信息与通信
ThreeYear_s1 天前
【FPGA+DSP系列】——PWM电平光耦转换电路实验分析----电路原理分析,器件选型
单片机·嵌入式硬件·fpga开发
FPGA_小田老师2 天前
FPGA语法基础(一):Verilog 数组清零方法详解
fpga开发·verilog语法·数组清零·verilog数组清零
奋斗的牛马2 天前
FPGA--zynq学习 PS与PL交互(二) HP接口
单片机·嵌入式硬件·学习·fpga开发·信息与通信
ThreeYear_s2 天前
【FPGA+DSP系列】——CCS联合proteus仿真DSP工程,以TMS320f28027芯片为例,LED闪烁仿真。
单片机·fpga开发·proteus
LCMICRO-133108477462 天前
长芯微LPS5820完全P2P替代NCP51820,LPS5820 是一款高速半桥驱动器,可用来驱动半 桥功率拓扑的 GaN 功率管。
stm32·单片机·嵌入式硬件·fpga开发·硬件工程
云雾J视界2 天前
预测电流控制在光伏逆变器中的低延迟实现:华为FPGA加速方案与并网稳定性验证
华为·fpga开发·dsp·光伏逆变器·mpcc