当前位置: 首页 > news >正文

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

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

http://www.dtcms.com/a/610321.html

相关文章:

  • 【Linux笔记】网络部分——NAT-代理-网络穿透
  • 第二章:物理层
  • asp网站程序网页设计视频网站建设
  • 网站小图标怎么做网页制作设计思路
  • 朝阳专业做网站青岛平台网站建设
  • spiderdemo第三题
  • PostgreSQL 实战指南(面向 MySQL 开发者)
  • 山东省建设执业师之家官方网站网站建设培训心得体会
  • 充电桩小程序开发实战:从零到一搭建完整系统【源码+解析+文档】
  • 配置安装mmsegmentation并同步至远程服务器
  • 了解一下Sentry(一个开源的实时错误监控平台)
  • 企业网站建设规划书网站建设制作要学什么软件
  • C#VB.NET中实现可靠的文件监控(新建、删除、改名、内容修改等事件的准确捕获)​
  • Python数据科学与图像处理利器组合:Prophet、Arch、Scikit-image、Pillow-heif用法全解析
  • wordpress 4.6.1海外广告优化师
  • 【运维】GNU/Linux 入门笔记
  • 长沙鞋网站建设煤矿建设工程质量监督总站网站
  • 学做川菜下什么网站爱网站黄
  • 前端自定义右键菜单与图片复制(兼容H5)
  • [Switch大气层]纯净版+特斯拉版 20.5.0大气层1.9.5心悦整合包 固件 工具 插件 前端等switch游戏资源下载合集
  • 同样算法的DFS求解数独C和Python程序用时比较
  • vue3+element-china-area-data 实现省市区三级联动
  • Next.js 项目常见报错排查与解决
  • Vue 校验输入时间与当前时间差大于等于3小时
  • html中网站最下面怎么做设计主题网站
  • 起重机智能选型:从血泪教训到科技护航的革新之路
  • java+maven配置yguard的一次实验
  • 汝南县网站建设Wordpress实现中英文
  • ASC学习笔记0006:游戏效果将如何复制到客户端
  • 延安市住建建设网站无锡网站营销推广