0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Verilog语法中运算符的用法

FPGA开源工坊 来源:FPGA开源工坊 2024-10-25 15:17 次阅读

Verilog语法--位选择运算(+: 和 -:)

verilog语法中使用以下两个运算符可以简化我们的位选择代码

+:

-:

这两个的用法如下

wire[7:0]a;
a[base_addr+:width]
a[base_addr-:width]

其中base_addr指的是起始选择位,width指的是选择的位宽

比如以下使用说明

wire[31:0]a;
a[0+:8]等价于a[7:0]
a[0+:16]等价于a[15:0]
a[16+:8]等价于a[23:16]

a[7-:8]等价于a[7:0]
a[15-:16]等价于a[15:0]
a[15-:2]等价于a[15:14]

这样写有什么好处呢,比如下面两个使用场景

假设有一个128bit的数据,怎么方便的将其分割为16个8bit的数据

对一个32比特的数据进行按字节的大小端翻转

问题一

假设有一个128bit的数据,怎么方便的将其分割为16个8bit的数据

如果要解决上面的问题,我们可以直接手动的进行位选择,代码如下:

`timescale1ns/1ps
moduletb(

);
wire[127:0]a;
wire[7:0]b[15:0];

assigna={8'd1,8'd2,8'd3,8'd4,8'd5,8'd6,8'd7,8'd8,8'd9,8'd10,8'd11,8'd12,8'd13,8'd14,8'd15,8'd16};

assignb[0]=[7:0];
assignb[1]=[15:8];
assignb[2]=[23:16];
assignb[3]=[31:24];
assignb[4]=[39:32];
assignb[5]=[47:40];
assignb[6]=[55:48];
assignb[7]=[63:56];
assignb[8]=[71:64];
assignb[9]=[79:72];
assignb[10]=[87:80];
assignb[11]=[95:88];
assignb[12]=[103:96];
assignb[13]=[111:104];
assignb[14]=[119:112];
assignb[15]=[127:120];
endmodule

为了方便观察,我们将a的值赋值为1到16的特殊值,下面b里面的每一个元素都从a里面进行截取,如果bit数比较少的话,可以按上述代码这样完成,但是这个代码看着也很啰嗦,所以可以按照下面的代码进行改进

`timescale1ns/1ps
moduletb(

);
wire[127:0]a;
wire[7:0]b[15:0];
genvari;

assigna={8'd1,8'd2,8'd3,8'd4,8'd5,8'd6,8'd7,8'd8,8'd9,8'd10,8'd11,8'd12,8'd13,8'd14,8'd15,8'd16};

generate
for(i=0;i< 16; i = i+1) begin
        assign b[i] = a[(i*8) +: 8];
    end
endgenerate

endmodule

可以看到使用位选择加for循环的方式会很方便,以后即使位宽改变了,也仅仅只是在for循环这边改一下就好

e6e92a54-9291-11ef-a511-92fbcf53809c.png

问题二

对一个32比特的数据进行按字节的大小端翻转

最直接的代码可以按下面这样写

`timescale1ns/1ps
moduletb(

);
wire[31:0]a;
wire[31:0]b;

assigna={8'd1,8'd2,8'd3,8'd4};

assignb={a[7:0],a[8:15],a[23:16],a[31:24]};
endmodule

当位宽比较小的时候可以按上面的方式进行,如果位宽比较大的话,上面的这种方法就显得很冗余了,我们就可以使用位选择的方式来进行赋值

`timescale1ns/1ps
moduletb(

);
wire[31:0]a;
wire[31:0]b;

genvari;

assigna={8'd1,8'd2,8'd3,8'd4};

generate
for(i=0;i< 4; i = i + 1) begin
        assign b[(4 - i) * 8 - 1 -: 8] = a[i * 8 +: 8];
    end
endgenerate

endmodule

e6f70cf0-9291-11ef-a511-92fbcf53809c.png

可以看到正确的完成了我们的需求

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Verilog
    +关注

    关注

    28

    文章

    1345

    浏览量

    110009
  • 代码
    +关注

    关注

    30

    文章

    4762

    浏览量

    68408
  • 语法
    +关注

    关注

    0

    文章

    44

    浏览量

    9800
  • 运算符
    +关注

    关注

    0

    文章

    172

    浏览量

    11070

原文标题:Verilog语法--位选择运算(+: 和 -:)

文章出处:【微信号:FPGA开源工坊,微信公众号:FPGA开源工坊】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    C语言中位运算符的高级用法(1)

    在上一篇文章,我们介绍了&运算符的基础用法,本篇文章,我们将介绍& 运算符的一些高级用法
    发表于 08-22 10:44 309次阅读
    C语言中位<b class='flag-5'>运算符</b>的高级<b class='flag-5'>用法</b>(1)

    C语言中位运算符的高级用法(2)

    在上一篇文章,我们介绍了&运算符的高级用法,本篇文章,我们将介绍| 运算符的一些高级用法
    发表于 08-22 10:45 314次阅读
    C语言中位<b class='flag-5'>运算符</b>的高级<b class='flag-5'>用法</b>(2)

    C语言中位运算符的高级用法(3)

    在上一篇文章,我们介绍了|运算符的高级用法,本篇文章,我们将介绍^ 运算符的一些高级用法
    发表于 08-22 10:47 244次阅读
    C语言中位<b class='flag-5'>运算符</b>的高级<b class='flag-5'>用法</b>(3)

    C语言中位运算符的高级用法(4)

    在上一篇文章,我们介绍了^运算符的高级用法,本篇文章,我们将介绍~ 运算符的一些高级用法
    发表于 08-22 10:48 216次阅读
    C语言中位<b class='flag-5'>运算符</b>的高级<b class='flag-5'>用法</b>(4)

    C语言中位运算符的高级用法(5)

    在上一篇文章,我们介绍了~运算符的高级用法,本篇文章,我们将介绍
    发表于 08-22 10:49 319次阅读
    C语言中位<b class='flag-5'>运算符</b>的高级<b class='flag-5'>用法</b>(5)

    C语言运算符的使用方法

    详细介绍了C语言表达式、算术运算符、赋值运算符、关系运算符、条件结构、逻辑运算符、位运算符语法
    发表于 11-02 11:30 1540次阅读
    C语言<b class='flag-5'>运算符</b>的使用方法

    算术运算符的相关资料分享

    一:算术运算符算术运算符非常地简单,就是小学数学里面的一些加减乘除操作。不过呢,还是有一些语法细节需要注意的。1.加法运算符 + 1 在第3行利用加法
    发表于 11-30 06:09

    条件运算符是什么_条件运算符有哪些

    运算符优先级高于赋值、逗号运算符,低于其他运算符。关系运算实际上是逻辑比较运算,它是逻辑运算
    发表于 11-16 16:02 1.1w次阅读
    条件<b class='flag-5'>运算符</b>是什么_条件<b class='flag-5'>运算符</b>有哪些

    条件运算符用法_C运算符的结合方向

    。 每个操作拥有某一级别的优先级,同时也拥有左结合性或右结合性。优先级决定一个不含括号的表达式操作数之间的“紧密”程度。例如,在表达式a*b+c,乘法运算的优先级高于加法
    发表于 02-24 16:36 9689次阅读

    浅析MySQL的各类运算符

    MySQL支持多种运算符,我们在写SQL脚本时经常会需要用到各种各样的运算符,这些运算符可以用来连接表达式,进而从数据库查询我们需要的结果集等。这些类型主要包括算术
    的头像 发表于 05-03 17:41 2036次阅读
    浅析MySQL<b class='flag-5'>中</b>的各类<b class='flag-5'>运算符</b>

    python运算符是什么

    python运算符 0. 什么是运算符? 本章节主要说明Python的运算符。举个简单的例子 4 +5 = 9 。 例子,4和5被称为操作数,“+”号为
    的头像 发表于 02-21 16:44 2361次阅读

    Verilog逻辑设计的循环语句和运算符

    “ 本文主要分享了在Verilog设计过程中一些经验与知识点,主要包括循环语句(forever、repeat、while和for)、运算符。”
    的头像 发表于 03-15 11:41 5146次阅读

    C语言中位运算符的基础用法

    运算符是一组用于在二进制数之间进行操作的运算符
    发表于 08-21 14:52 507次阅读
    C语言中位<b class='flag-5'>运算符</b>的基础<b class='flag-5'>用法</b>

    verilog的逻辑运算符

    写在前面 之前曾经整理过verilog的各类运算符的表达方式,但是在学习的过程并未深入研究关于逻辑运算符的相关知识,导致在实际使用过程
    的头像 发表于 09-21 10:07 2254次阅读
    <b class='flag-5'>verilog</b>的逻辑<b class='flag-5'>运算符</b>

    python运算符的优先级大小

    Python运算符的优先级决定了表达式各个运算符的计算顺序。了解运算符的优先级对于正确理解和编写复杂的表达式非常重要。本文将详细介绍Py
    的头像 发表于 11-29 16:21 3296次阅读