写在前面:我对于verilog的学习只是足够编写一个简单的多周期cpu,对于verilog属于是浅浅的接触了一下了,其中可能会有一些写的不够准确的地方,欢迎指正讨论相互学习。
目录
数据类型
常量
整数的表示
X和Z
负数
下划线
参数类型-parameter
变量
wire
reg
数据类型
最常用最基本的四种:(我也只用到了这四种)
reg、wire、integer、parameter
其他的数据类型:
常量
整数的表示
按照进制分为四种:二进制,八进制,十进制,十六进制,分别用b/B,o/O,d/D,h/H表示。
位宽:将数字转换为二进制后有多少位就是该数字的位宽,一位只能是0或1
表示方式有如下三种
一、位宽+进制+数字
位宽和进制之间用一个英文单引号作分隔,这是必须的!进制后直接跟数字,该数字必须符合该进制的要求!
例如:二进制的1001可以表示为 4'b1001
例如:十六进制的7f可以表示为8'h7f (因为一位16进制数占4位,所以两位16进制数字位宽为8)
二、进制+数字
采用默认位宽,通常是32位
三、数字
默认为32位宽,十进制
X和Z
一、X代表不定值,Z代表高阻值
二、一个X 或 Z 可以代表一个任意进制的数字,Z 也可以用 ?代替
三、当 X 或 Z 代替16进制数字时一个 X 或 Z 占4位,表示二进制数字时则占1位,同理8进制3位
根据下方的例子来理解这两个类型
这两个类型的数据用的比较少,当然在编写CPU时可以不用(我就没用哈哈),把状态机的不定值默认当0即可。
负数
在位宽前加一个负号即可将一个整数定义为负数
下划线
可以用来分割数字达到更好的可读性,只能用在两个具体数字之间!
例如:8'b10010010 等于 8'b1001_0010
前面这个一看就让人眼花,后面这个是不是就好多啦,而且他们两个在程序里其实是一样的哦。
一些默认的情况
参数类型-parameter
用来定义一个常量(嗯,就这么简单)
定义的方式
就像c/c++里定义一个常量方式一样,类似与 const int 吧。
每次定义参数时都要给定初值,初值可以是确定的数字,也可以是之前定义过的参数 或者 常数表达式
示例:
变量
这里要明确且牢记,verilog是面向硬件的编程语言,这里的wire和reg最后都会是实际存在的器件,wire会被例化为一条导线,reg会例化为一个寄存器…这对以后的学习都有帮助。
wire
用来表示用以 assign 关键字指定的组合逻辑信号,模块中的输入、输出默认定义为 wire 型,wire 可以用作任何方程式的输入,也可以作assign语句或实例元件的输出。(这里提到的以后都会用到,如果暂时不理解什么是模块,assign之类的就先记住吧,反正以后还会具体说)
定义方式
那个中括号的意思是索引,从左到右依次为 第n-1位,…… ,第0位,一共是n位。也可以是wire[n:1] ,从左到右依次为 第n位,…… ,第1位,一共也是n位。
如果是wire [0:0]意思就是从0到0,一共是1位,这就等价于只写wire。
你也可以把0放在左边,n-1放在右边,例如:wire [0:n-1] 这也是定义一个n位的wire类型数据,只不过索引时低位在左边。
在一个程序里定义方式应该统一(为了清晰不出错),建议使用左高右低的定义方式。
示例
reg
寄存器数据类型,可以用来存储数据,可以通过赋值语句改变其值,默认初始值为不定值( X ),always 块内所有被赋值的信号都必须是 reg 型,reg 型表达式内运算时将被当作无符号数,比如一个 4 位 reg 型变量,赋初值 -1 ,那么其值实际上会被认为是 +15。(还是那句话,都会用到,都很重要)
定义方式
示例
存储器类型的另一种用法叫memory,我习惯直接叫它数组因为用起来和c/c++数组没啥区别
这里定义了一个memory,元素个数为m个,每个元素是位宽为n的reg变量。
在定义寄存器堆的时候会用到这个。
对存储器进行地址索引的表达式必须是常数表达式(就是第二个中括号内的内容)
注意分辨如下两个定义方式,完全不同哦!!
赋值操作
文章来源:https://www.toymoban.com/news/detail-545247.html
赋值时必须指明存储单元的标号,也就是确定存储单元的地址文章来源地址https://www.toymoban.com/news/detail-545247.html
到了这里,关于学习笔记1:认识Verilog中的数据类型与数字的表达方式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!