一、Verilog语言相关
Verilog是一种硬件描述语言,与C语言不同,Verilog通常操作的对象是数字硬件系统,Verilog可以表示逻辑电路或是有逻辑电路组成的一个复杂电路。它与VHDL是目前最为常用的两种硬件语言。Verilog可以从开关级,门级直到算法级对于硬件进行控制,具有很高的灵活性,可以充分发掘硬件的计算性能。但是在功能实现的过程中需要付出比高级语言更多的精力去设计整个系统。
二、Verilog基本结构
Verilog程序最重要的结构就是模块module,它在形式上与C语言的函数很像,但是由于Verilog是面向硬件的语言,因此在设计思想上与C语言是有一定的差别的。
一个Verilog模块通常必须有的变量:clk时钟,rst置位,input输入,output输出。 下面是一些verilog中常用的声明:
Parameter常量
Wire输入输出信号缺省时默认是wire,是assign关键字指定的组合逻辑信号
Wire [n:1] a1,…,ai 每个总线有n个线路,共i个总线
Reg 在always块里的指定信号,常代表触发器寄存器
Reg[4:1] a 一个4位的名为a的reg信号 编号从1到4由低位到高位
Reg变量可以是正数或负数,但是在运算时视为正数
如果需要中间赋值或运算,需声明成reg类型
一个verilog模块的主要结构如下:
Module 模块名(端口列表);
Wire reg 和其他类型声明;
Assign数据流声明;
Always initial块,行为语句 #verilog中各个always块都是并行执行的,不存在谁先谁后的关系
...
任务和函数...
...
Endmodule
顶层程序调用底层module和c语言函数格式类似,通过module定义的端口传递参数,但是使用思想不同。
模组类名 实例名(端口变量)
端口变量尽量书写规范
三、Verilog变量定义
verilog数据常量定义:
数字表达式:<位宽><进制><数字>
'b:二进制 4’b1110 表示4位二进制数1110
'h:十六进制 8’hef、4’ha
'd:十进制 2’d3、4’d15(不能写16,4位宽最大15)等
四、Verilog中的逻辑运算
verilog基本运算:
verilog有两种赋值符号分别是<=和=
<=是非阻塞赋值,在always块完成后才赋值
=是阻塞赋值,赋值完成后才进入下一句
-
一般时序逻辑用<=,组合逻辑用=
- 按位取反,例如:11110 取反后为00001
!逻辑取反 ,例如:!0 为1
&&:代表逻辑与。
&:代表与门运算(按位与)。
^:异或处理,对一个变量里面1的个数是奇数偶数的判断,偶数为0,奇数为1
例如^1001结果为0
^实际是对该变量相邻位逐一求异或。
五、Verilog的逻辑描述方式
1 组合逻辑:
组合逻辑的输出结果与信号的历史状态无关,只由当前的输入决定,组合逻辑主要有两种描述方式:
(1):always @(信号电平触发条件)
always模块通过信号电平的变化作为触发条件。在always 模块中可以使用if、case 和for 等各种处理语句。由于赋值语句有阻塞赋值和非阻塞赋值两类,对于组合逻辑通常采用阻塞赋值。注意always 模块中的信号必须定义为reg 型。
(2):assign描述的赋值语句。
信号只能被定义为wire型。
2 时序逻辑:
时序逻辑是逻辑电路设计的另一种描述,其特点为任意时刻的输出由该时刻的输入与电路的历史状态共同决定。电路里面有锁存器或触发器用于记忆信息,只有在同步时钟的触发沿到达时,输出信号才有可能变化。
下面是时序逻辑与组合逻辑的差异:
(1)由于潜在的竞争风险和避免毛刺的考虑,通常时序信号采用同步处理,非阻塞赋值“<=”是较为常用的赋值方式。
(2)时序逻辑的电平触发条件通常只使用同步时钟触发,这是因为时序逻辑是通过时钟信号的跳变沿来控制的。
(3)reg信号会以寄存器的形式进行实现,由于需要等待同步时钟的触发,因此reg信号的变化并不是与其输入完全相关的。
六、硬件常用的缓存FIFO
FIFO:Fist in first out。先入先出的数据缓存器,没有外部读写地址线,可同时读写。
包含同步FIFO和异步FIFO。
同步FIFO只有一个时钟,也就是说写端和读端的时钟是一样的。
异步FIFO读端和写端两个时钟则是不一样的。包括同频异相,异频异相。
FIFO用途:
数据缓冲器。比如你写端burst一个数据,没有fifo缓冲的话就炸了。Fifo会把写端的突发数据缓存,读端可以慢慢的读出来。
跨时钟域。异步fifo主要使用在不同时钟域的边缘,用来同步数据到另一个时钟域。