南京观海微电子----Verilog基础(一)——数据类型、运算符

1. 数据类型

1.1 常量

整数:整数可以用二进制b或B,八进制o或O,十进制d或D,十六进制h或H表示,例如,8’b00001111表示8位位宽的二进制整数,4’ha表示4位位宽的十六进制整数。

XZ:X代表不定值,z代表高阻值,例如,5’b00x11,第三位不定值,3’b00z表示最低位为高阻值。

下划线:在位数过长时可以用来分割位数,提高程序可读性,如8’b0000_1111

1.2 参数

参数 parameter:parameter可以用标识符定义常量,运用时只使用标识符即可,提高代码可读性及维护性,如定义parameterwidth = 8 ; 定义寄存器reg[width-1:0] a; 即定义了8位宽度的寄存器。

参数的传递:在一个模块中如果有定义参数,在其他模块调用此模块时可以传递参数,并可以修改参数,如下所示,在module后用#()表示。

1.3 传参示例

例如模块定义如下,该ROM模块有两个输入参数,其中addr变量为15位位宽,data变量为8位位宽:

module ROM

#(

    parameter depth=15,

    parameter width = 8

)

(

    input [depth-1:0] addr,

    input[width-1:0] data,

    output result

) ;

endmodule

调用该ROM模块时,可以在调用时修改传参来修改参数。如下代码,在调用ROM模块时,将depth和width变量的位宽分布修改成了32位位宽和16位位宽。

module top() ;

wire [31:0] addr ;

wire [15:0] data ;

wire result ;

ROM

#(

    .depth(32),

    .width(16)

)

ROM1

(

    .addr(addr) ,

    .data(data) ,

    .result(result)

) ;

endmodule

Parameter可以用于模块间的参数传递,而localparam仅用于本模块内使用,不能用于参数传递。Localparam多用于状态机状态的定义。

1.4 变量

变量是指程序运行时可以改变其值的量,下面主要介绍几个常用了变量类型。

1.4.1 Wire

Wire 类型变量,也叫网络类型变量,用于结构实体之间的物理连接,如门与门之间,不能储存值,用连续赋值语句assign赋值,定义为wire[n-1:0] a ;其中n 代表位宽,如定义wire a ; assign a = b ;是将b的结点连接到连线a上。如下图所示,两个实体之间的连线即是wire类型变量。

1.4.2 Reg

Reg类型变量,也称为寄存器变量,可用来储存值,必须在always语句里使用。其定义为reg [n-1:0] a ;表示n位位宽的寄存器,如reg [7:0] a;表示定义8位位宽的寄存器a。

如下所示定义了寄存器q

module TOP

(

    input d,

    input clk,

    output reg q

) ;

always @(posedge clk)

begin

    q <= d ;

end

endmodule

生成的电路为时序逻辑,下图为其结构,为D触发器。

也可以生成组合逻辑,如下面代码所示为一个数据选择器,敏感信号没有时钟

module TOP

(

    input a,

    input b,

    input c,

    input d,

    input[1:0] sel,

    output reg Mux

) ;

always @(sel or a or b or c or d)

begin

    case(sel)

    2'b00 : Mux = a ;

    2'b01 : Mux = b ;

    2'b10 : Mux = c ;

    2'b11 : Mux = d ;

    endcase

end

endmodule

最终生成电路为组合逻辑。

图片

1.4.3 Memory

可以用memory类型来定义RAM、ROM等存储器,其结构为reg [n-1:0]存储器名[m-1:0],意义为m个n位宽度的寄存器。例如,reg [7:0] ram [255:0]表示定义了256个8位寄存器,256也即是存储器的深度,8为数据宽度。

2. 运算符

运算符可分为以下几类:

(1)算术运算符(+,-,*,/,%)

(2)赋值运算符(=,<=)

(3)关系运算符(>,<,>=,<=,==,!=)

(4)逻辑运算符(&&,||,!)

(5)条件运算符(?:)

(6)位运算符(~,|,^,&,^~)

(7)移位运算符(<<,>>)

(8)拼接运算符({ })

大部分运算符与C/C++语言中定义的运算符用法基本上一致,这里主要介绍几种与C/C++语言中差异较大的运算符。

2.1 赋值运算符

“=”为阻塞赋值,”<=”为非阻塞赋值。阻塞赋值为执行完一条赋值语句,再执行下一条,可理解为顺序执行,而且赋值是立即执行;非阻塞赋值可理解为并行执行,不考虑顺序,在always块语句执行完成后,才进行赋值。

2.1.1 阻塞赋值运算符

下面先介绍阻塞赋值,代码如下:

module TOP

(

    input din,

    input clk,

    output reg a,b,c

) ;

always @(posedge clk)

begin

    a = din;

    b = a;

    c = b;

end

endmodule

下面是上面模块对应的仿真代码(用于给上面模块提供时钟、激励信号用于仿真模块功能的正确性):

module SimFile ();

reg din ;

reg clk ;

wire a,b,c ;

initial

begin

    din = 0 ;

    clk = 0 ;

    forever

    begin

        #({$random}%100)      // 随机等待一段时间(0~99ns之间)

        din = ~din ;

    end

end

always #10 clk = ~clk ;

TOP TOP_i

(

    .clk(clk),

    .din(din),

    .a(a),

    .b(b),

    .c(c)

);

clk时钟的周期是20ns,从仿真结果可以看到,在clk的上升沿时,寄存器a的值等于输入din的值,并立即赋给寄存器b,b的值赋给c。

上面编写的阻塞赋值TOP模块在FPGA内部布局成的电路(RTL)如下图所示,由RTL可以明显看出,在每个时钟周期上沿到来时,寄存器a、b、c的值都被统一赋值成了输入din的值。

图片

2.1.2 非阻塞赋值运算符

将上面编写TOP模块的赋值方式改为非阻塞赋值方式,代码如下:

module TOP

(

    input din,

    input clk,

    output reg a,b,c

) ;

always @(posedge clk)

begin

    a <= din;

    b <= a;

    c <= b;

end

endmodule

仿真代码仍然使用2.1.1节的仿真代码提供时钟和激励信号,仿真结果如下:

在每个时钟clk上升沿时,寄存器a的值没有立即赋值给b,b为a原来的值,同样,c为b原来的值。上面编写的非阻塞赋值TOP模块在FPGA内部布局成的电路(RTL)如下图所示。

图片

一般情况下,在时序逻辑电路中使用非阻塞赋值,可避免出现竞争冒险现象。在组合逻辑中使用阻塞赋值,执行赋值语句后立即改变。在assign语句中必须用阻塞赋值。

2.2 位拼接运算符

“{ }”拼接运算符,将多个信号按位拼接,如{a[3:0], b[1:0]},将a的低4位,b的低2位拼接成6位数据。

{n{a[3:0]}}表示将n个a[3:0]拼接,{n{1’b0}}表示n位的0拼接。如{8{1’b0}}表示为8’b0000_0000。

2.3 运算符的优先级

各种运算符的优先级别如下图所示:

图片

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/708379.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

算法沉淀——动态规划之子序列问题(下)(leetcode真题剖析)

算法沉淀——动态规划之子序列问题 01.最长定差子序列02.最长的斐波那契子序列的长度03.最长等差数列04.等差数列划分 II - 子序列 01.最长定差子序列 题目链接&#xff1a;https://leetcode.cn/problems/longest-arithmetic-subsequence-of-given-difference/ 给你一个整数数…

编码技巧——Springboot工程加密yml配置/Maven引入本地二方包

1. 背景 基于Springboot的工程项目&#xff0c;通常很多信息都是在application.yml中直接明文配置的&#xff0c;比如数据库链接信息&#xff0c;redis链接信息等&#xff1b; 为了安全考虑&#xff0c;公司打算将yml配置文件中的数据库连接信息的账号&#xff0c;密码进行加…

mini-spring|关于Bean对象作用域以及FactoryBean的实现和使用

需求 FactoryBean 直接配置FactoryBean 获取FactoryBean中的Bean对象 FactoryBean的getObject方法通过反射获取Bean对象 由此省去对实体Dao类的定义 解决方法 对外提供一个可以二次从 FactoryBean 的 getObject 方法中获取对象的功能即可 整体架构 整个的实现过程包括了两部…

Redis持久化的两种方式RDB和AOF详解

小伙伴们好&#xff0c;欢迎关注&#xff0c;一起学习&#xff0c;无限进步 以下内容为学习 Redis 过程中的笔记 文章目录 Redis持久化RDB&#xff08; Redis DataBase &#xff09;触发机制&#xff1a;如何恢复rbd文件&#xff1a;优点&#xff1a;缺点&#xff1a; AOF &…

【文献管理】zotero插件4——获取知网pdf、中文文献识别与目录生成

文章目录 zotero获取知网PDFzotero——中文文献识别&#xff08;茉莉花插件&#xff09;学位论文目录生成 zotero获取知网PDF zotero——中文文献识别&#xff08;茉莉花插件&#xff09; 为下载的学位论文添加目录中文文献识别&#xff1a;jasminum 下载pdflabs下载茉莉花插…

C++——类的6个默认成员函数

目录 类中的6个默认成员函数 构造函数 构造函数的特点 初始化列表 隐式类型转换 析构函数 拷贝构造函数 赋值重载 运算符重载 赋值重载 取地址重载 类中的6个默认成员函数 类中的6个默认成员函数根据不同的作用可以分为&#xff1a; 初始化和使用后清理&#xff1a;…

YOLOv8改进,添加GSConv+Slim Neck,有效提升目标检测效果,代码改进(超详细)

目录 摘要 主要想法 GSConv GSConv代码实现 slim-neck slim-neck代码实现 yaml文件 完整代码分享 总结 摘要 目标检测是计算机视觉中重要的下游任务。对于车载边缘计算平台来说&#xff0c;巨大的模型很难达到实时检测的要求。而且&#xff0c;由大量深度可分离卷积层构…

Java Web(十一)--JSON Ajax

JSON JSon在线文档&#xff1a; JSON 简介 JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式。轻量级指的是跟xml做比较。数据交换指的是客户端和服务器之间业务数据的传递格式。 它基于 ECMAScript (W3C制定的JS规范)的一个子集&#xff0c;采…

Stable Cascade发布:比SDXL更快、更强的图像生成模型

前言 StabilityAI在春节期间发布了新的一代文生图模型Stable Cascade&#xff0c;Stable Cascade是基于Wuerstchen架构包含三阶段的文生图扩散模型&#xff0c;为质量、灵活性、微调和效率设定了新的标准&#xff0c;着重于进一步消除硬件障碍。相比Stable Diffusion XL&#…

《Decoupling Representation and Classifier for Long-Tailed Recognition》阅读笔记

论文标题 《Decoupling Representation and Classifier for Long-Tailed Recognition》 用于长尾识别的解耦表示和分类器 作者 Bingyi Kang、Saining Xie、Marcus Rohrbach、Zhicheng Yan、 Albert Gordo、Jiashi Feng 和 Yannis Kalantidis 来自 Facebook AI 和 新加坡国…

Linux笔记--文件权限

一、相关概念 Linux最优秀的地方之一就在于多人多任务环境。为了让各个使用者有较为保密的文件数据&#xff0c;文件的权限管理尤为重要。 ●文件的可存取身份: owner:文件拥有者 group:文件所属用户组 others:其他人 ●文件权限: r: read&#xff0c;读 文件:是否能查看文件内…

Carla自动驾驶仿真八:两种查找CARLA地图坐标点的方法

文章目录 前言一、通过Spectator获取坐标二、通过道路ID获取坐标总结 前言 CARLA没有直接的方法给使用者查找地图坐标点来生成车辆&#xff0c;这里推荐两种实用的方法在特定的地方生成车辆。 一、通过Spectator获取坐标 1、Spectator&#xff08;观察者&#xff09;&#xf…

2W字-35页PDF谈谈自己对QT某些知识点的理解

2W字-35页PDF谈谈自己对QT某些知识点的理解 前言与总结总体知识点的概况一些笔记的概况笔记阅读清单 前言与总结 最近&#xff0c;也在对自己以前做的项目做一个知识点的梳理&#xff0c;发现可能自己以前更多的是用某个控件&#xff0c;以及看官方手册&#xff0c;但是没有更…

深入探究【观察者模式】:简单音乐会售票系统案例分析

文章目录 1.观察者模式概述基本概念&#xff1a;工作原理&#xff1a; 2.案例-音乐会抢票2.1.具体实现2.1.1.被观察者接口2.1.2.被观察者实现类2.1.3.定义观察者接口2.1.3.定义观察者实现类2.1.4.测试观察者 3.总结3.1.优点和局限性3.2.思考 1.观察者模式概述 观察者模式是一种…

如何远程访问内网数据库?

远程访问内网数据库是在安全可靠的前提下&#xff0c;能够实现从外部网络访问内网数据库的一种技术。在现代信息化的背景下&#xff0c;随着企业发展和分布式办公的普及&#xff0c;远程访问内网数据库成为了一项必需的技术。通过远程访问内网数据库&#xff0c;企业可以在不同…

2.3~2.7碎片

P是位置&#xff0c;v是速度

弹窗内容由后端返回,如何让点击按钮的事件交由前端控制?

一、场景 背景&#xff1a;因为系统里经常有新活动或者公告需要通知所有用户&#xff0c;希望前端维护的这个弹窗里的内容可以由后端接口返回。这样就不需要每次上新活动的时候&#xff0c;前端项目都发版了。因此&#xff0c;前端维护了这个弹窗和它的关闭事件&#xff0c;至…

qt5.15 升级 qt 6.5 部分问题 解决修复

报错 QT5_USE_MODULES 升级 QT6_ADD_RESOURCES qt_add_resources Compiles binary resources into source code. CMake Commands in Qt6 Core | Qt Core 6.6.2

用Flutter开发App:助力您的移动业务腾飞

一、Flutter简介 Flutter是Google推出的用于构建多平台应用程序的开源UI框架。它使用Dart语言编写&#xff0c;可以编译为原生机器代码&#xff0c;从而提供卓越的性能和流畅的用户体验。 二、Flutter的优势 一套代码&#xff0c;多平台部署&#xff1a;Flutter可以使用一套代…

《互联网的世界》第二讲-最短路径优先

昨天讲 dns 时讲过&#xff0c;“你问一个当地人最近的厕所在哪&#xff0c;路人给你一个地址…”&#xff0c;可是只有地址还不够&#xff0c;如何到达那里呢&#xff1f;这是本节的内容。 自然的方式是&#xff0c;一边走一边问&#xff0c;根据路人的指示继续一边走一边问…