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

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

3天内不再提示

关于Verilog语法你不知道的方法

FPGA之家 ? 来源:开源博客 ? 作者:电子电路开发学习 ? 2021-03-21 10:01 ? 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

动态截取固定长度数据语法,即+:和-:的使用,这两个叫什么符号呢?运算符吗?

Verilog比较方便的一个特点就是数据的截取和拼接功能了,截取使用方括号[],拼接使用大括号{},例如

reg [7:0] vect; wire a; wire [3:0] b, wire [5:0] c; assign a = vect[1]; //取其中1Bit assign b[3:0] = vect[7:4];//截取4Bit assing c[5:0] = {a, b[3:0], 1‘b1}; //拼接

于是举一反三(zi zuo cong ming),为了实现动态截取固定长度数据的功能,使用软件编程的思维写了如下语句,功能很好理解,根据cnt的值,每次截取vect的5Bit数据。:

reg [7:0] vect; reg [1:0] cnt; wire [4:0] out; assign out = vect[cnt+4:cnt];

一顿操作猛如虎,编译一看傻如狗。使用ModelSim编译之后,提示有如下语法错误:

** Error: test.v(10): Range must be bounded by constant expressions.

提示vect的范围必须为常量表达式。也就是必须为,vect[6:2]或vect[7:4],不能是vect[a:0],vect[4:b],或vect[a:b]。额,这该怎么办呢?

既然有这个使用场景,那Verilog在设计之初就应该会考虑到这个应用吧!于是就去翻IEEE的Verilog标准文档,在5.2.1章节发现了一个用法可以实现我这个需求,那就是+:和-:符号,这个用法很少,在大部分关于FPGA和Verilog书籍中都没有提到。

大致意思就是,可以实现动态截取固定长度的数据,基本语法为:

vect[base+:width]或[base-:width]

其中base可以为变量,width必须为常量。

下面来举几个例子来理解这个符号。

有如下定义:

reg [7:0] vect_1; reg [0:7] vect_2; wire [2:0] out;

以下写法分别表示什么呢?

vect_1[4+:3]; vect_1[4-:3]; vect_2[4+:3]; vect_2[4-:3];

分为三步:

1.先看定义。

vect_1[7:0]定义是大端模式,则vect_1[4+:3]和vect_1[4-:3]转换后也一定为大端模式;vect_2[0:7]定义是小端模式,则vect_2[4+:3]和vect_2[4-:3]转换后也一定为小端模式。

2.再看升降序。

其中+:表示升序,-:表示降序

3.看宽度转换。

vect_1[4+:3]表示,起始位为4,宽度为3,**升序**,则vect_1[4+:3] = vect_1[6:4] vect_1[4-:3]表示,起始位为4,宽度为3,**降序**,则vect_1[4-:3] = vect_1[4:2]

90395bd0-8925-11eb-8b86-12bb97331649.jpg

同理,

vect_2[4+:3]表示,起始位为4,宽度为3,升序,则vect_2[4+:3] = vect_2[4:6] vect_2[4-:3]表示,起始位为4,宽度为3,降序,则vect_2[4-:3] = vect_2[2:4]

90935130-8925-11eb-8b86-12bb97331649.jpg

ModelSim仿真验证,新建test.v文件:

module test; reg [7:0] vect_1; reg [0:7] vect_2; initial begin vect_1 = ’b0101_1010; vect_2 = ‘b0101_1010; $display(“vect_1[7:0] = %b, vect_2[0:7] = %b”, vect_1, vect_2); $display(“vect_1[4+:3] = %b, vect_1[4-:3] = %b”, vect_1[4+:3], vect_1[4-:3]); $display(“vect_2[4+:3] = %b, vect_2[4-:3] = %b”, vect_2[4+:3], vect_2[4-:3]); $stop; end endmodule

在ModelSim命令窗口输入:

//进入到源文件所在文件夹 cd c:/users/whik/desktop/verilog //编译 vlog test.v //仿真 vsim work.test //运行 run -all //运行结果 # vect_1[7:0] = 01011010, vect_2[0:7] = 01011010 # vect_1[4+:3] = 101, vect_1[4-:3] = 110 # vect_2[4+:3] = 101, vect_2[4-:3] = 011 # ** Note: $stop : test.v(15) # Time: 0 ps Iteration: 0 Instance: /test # Break in Module test at test.v line 15

这种语法表示需要注意,前者起始位可以是变量,后者的宽度必须是常量,即vect[idx+:cnt]不符合语法标准,vect[idx+:4]或vect[idx-:4]才符合。
编辑:lyn

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

    关注

    30

    文章

    1368

    浏览量

    112591
  • 编程
    +关注

    关注

    88

    文章

    3694

    浏览量

    95569

原文标题:这个Verilog语法你一定不知道

文章出处:【微信号:zhuyandz,微信公众号:FPGA之家】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    编译错误: error: unrecognizable insn,不知道原因,请教!

    用start_gui.exe生成的代码,再用SEGGER Embedded打开,编译有错,不知道是什么原因,请教各位大佬?
    发表于 06-23 14:45

    不知道怎么画原理图了

    时,这样的问题,也有这么多?!1、电阻的表示方法是第一种,还是第二种?中间是方框还是折线?方框做多大?现场一片混乱立马分成N派。普通的电阻都这样,这么多种电阻现
    的头像 发表于 04-30 18:40 ?521次阅读
    <b class='flag-5'>不知道</b>怎么画原理图了

    FPGA Verilog HDL语法之编译预处理

    Verilog HDL语言和C语言一样也提供了编译预处理的功能。“编译预处理”是Verilog HDL编译系统的一个组成部分。Verilog HDL语言允许在程序中使用几种特殊的命令(它们不是一般
    的头像 发表于 03-27 13:30 ?728次阅读
    FPGA <b class='flag-5'>Verilog</b> HDL<b class='flag-5'>语法</b>之编译预处理

    关于射频导纳物位开关不知道的知识点

    它作为一种重要的工业自动化设备,在生产领域中扮演者重要的角色,这款物位仪表就是射频导纳物位开关,它可以用于测量和控制物料的位置和数量。它之所以受欢迎是因为产品的防刮料功能好、测量数值准确、适用的范围广,能够帮助工业生产领域的人们有效的解决一些传统物位开关的限制问题。 这款物位开关的稳定性高、测量数值准、适用场合多等优点,且他还能配备报警指示灯等功能,能够让用户更为直观的获取到它测量出来的数值信息,方便
    的头像 发表于 01-21 13:56 ?588次阅读
    <b class='flag-5'>关于</b>射频导纳物位开关<b class='flag-5'>你</b><b class='flag-5'>不知道</b>的知识点

    ADS805E测量跳跃幅度很大,不知道是为什么?

    我按照手册上直流耦合连接电路,输入是1.5V~3.5V范围,SEL与VREF相连,用430定时器输出转换时钟,结果测量直流时,AD测量结果在几个值之间跳跃,跳跃幅度很大,不知道是为什么,引脚电压控制用3.3V。
    发表于 01-21 07:46

    测的值不定然后开始减小直到为0,不知道怎么回事?

    ADS1247对寄存器可读可写 可是配置完02这个地址的时(写0x30)在vrefout测不到2.048v,测的值不定然后开始减小直到为0,不知道怎么回事?
    发表于 01-21 06:27

    压力变送器接线方法不知道

    压力变送器
    jzyb
    发布于 :2024年12月18日 10:44:17

    Verilog 测试平台设计方法 Verilog FPGA开发指南

    Verilog测试平台设计方法Verilog FPGA开发中的重要环节,它用于验证Verilog设计的正确性和性能。以下是一个详细的Verilog
    的头像 发表于 12-17 09:50 ?1243次阅读

    Verilog与VHDL的比较 Verilog HDL编程技巧

    Verilog 与 VHDL 比较 1. 语法和风格 VerilogVerilog语法更接近于 C 语言,对于有 C 语言背景的工程
    的头像 发表于 12-17 09:44 ?1962次阅读

    有关UV固化不知道的技术细节

    UV固化技术中,光引发剂吸收UV光产生活性自由基触发聚合反应,包括链引发、增长、终止和交联。反应速率受UV光强、光引发剂浓度、单体类型等因素影响,UV固化技术具有快速固化特性。
    的头像 发表于 12-06 09:33 ?1039次阅读

    Verilog硬件描述语言参考手册

    一. 关于 IEEE 1364 标准二. Verilog简介三. 语法总结四. 编写Verilog HDL源代码的标准五. 设计流程
    发表于 11-04 10:12 ?4次下载

    Verilog语法中运算符的用法

    verilog语法中使用以下两个运算符可以简化我们的位选择代码。
    的头像 发表于 10-25 15:17 ?2784次阅读
    <b class='flag-5'>Verilog</b><b class='flag-5'>语法</b>中运算符的用法

    Verilog HDL的基础知识

    本文继续介绍Verilog HDL基础知识,重点介绍赋值语句、阻塞与非阻塞、循环语句、同步与异步、函数与任务语法知识。
    的头像 发表于 10-24 15:00 ?1313次阅读
    <b class='flag-5'>Verilog</b> HDL的基础知识

    关于陶瓷电路板不知道的事

    陶瓷电路板(Ceramic Circuit Board),又称陶瓷基板,是一种以陶瓷材料为基体,通过精密的制造工艺在表面形成电路图形的高技术产品,快来看看哪些是您还不知道的事?
    的头像 发表于 10-21 11:55 ?1120次阅读
    <b class='flag-5'>关于</b>陶瓷电路板<b class='flag-5'>你</b><b class='flag-5'>不知道</b>的事

    又一电工不知道,施耐德变频器怎么复位,如果不告诉知道怎么复位吗?

    维修 我给他说,可能以前没接触过施耐德的变频器,就不知道它还有一个盖子,要复位的话,就要把盖子打开,第一次找不到也正常,要是经常断电重启的话,对设备不好。 变频器修理 之所以分享给大家,就是想告诉那些没接触过施耐
    的头像 发表于 10-12 15:15 ?1400次阅读
    又一电工<b class='flag-5'>不知道</b>,施耐德变频器怎么复位,如果不告诉<b class='flag-5'>你</b>,<b class='flag-5'>你</b><b class='flag-5'>知道</b>怎么复位吗?