Verilog学习笔记1

#Verilog学习笔记
1.什么是Verilog?
verilog是一种硬件描述语言,我们在写verilog 代码时,首先要有所要写的module在硬件上如何实现的概念,而不是去想编译器如何解释这个module。比如在决定是否使用 reg 定义时,要问问自己物理上是不是真正存在这个 register, 如果是,它的clock 是什么? D 端是什么?Q 端是什么?有没有清零和置位?同步还是异步?再比如上面讨论的三态输出问题,首先想到的应该是在 register 的输出后面加一个三态门,而不是如何才能让编译器知道要“赋值”给一个信号为三态。同样,Verilog 中没有“编译”的概念,而只有综合的概念,我们只有综合工具,而没有所谓的编译器。
2.quartus lite版本只支持Arria、Cyclone以及MAX系列,并不支持Stratix系列。
3.从模块内部看,只有端口类型为output时,端口声明才能为reg数据类型。详情见《Verilog HDL数字设计与综合》例4.4,4.6。
4.ANSI C风格的端口声明:在列举端口列表时直接进行端口声明。
例: module fulladd4(output reg [3:0] sum,output reg c_out, input [3:0] a,b,input c_in);

<模块内容>

endmodule
5.verilog之可综合与不可综合?
答:可综合的意思是说所编写的代码可以对应成具体的电路,不可综合就是所写代码没有对应的电路结构,例如行为级语法就是一种不可综合的代码,通常用于写仿真测试文件。

建立可综合模型时,需注意以下几点:
不使用initial

不使用**#10**之类的延时语句

不使用循环次数不确定的循环语句,如forever,while等

不使用用户自定义原语(UDP元件)

尽量使用同步方式设计电路

用always块来描述组合逻辑时,应列出所有输入信号作为敏感信号列表,即always@(*)

所有的内部寄存器都应该能够被复位,在使用FPGA实现设计时,尽量使用器件的全局复位端作为系统的总复位

对时序逻辑描述和建模,尽量使用非阻塞赋值的方式,对组合逻辑描述和建模,虽然阻塞和非阻塞赋值的方式都可以,但在同一过程快中最好不要同时使用阻塞赋值和非阻塞赋值。我个人比较推荐用阻塞赋值的方式描述组合逻辑

不能在多个always块中对同一个变量进行赋值。对同一个对象不能既使用非阻塞赋值,又使用阻塞赋值

如果不打算让变量生成锁存器,那么必须在使用if语句或case语句时补全所有条件

6.不可综合语句:

initial 初始化语句,只能在testbench中使用,不可综合

event event在同步testbench时更有用,不能综合

real 不支持real数据类型的综合

time 不支持time数据类型的综合

assign 和 deassign 不支持对reg数据类型赋值的综合,但支持wire 类型赋值的综合

以#开头的延时语句不能被综合

7.数码管16位编码
Verilog学习笔记1_第1张图片

8.数据流建模与行为及建模
在数字电路中,信号经过组合逻辑时会类似于数据流动,即信号从输入流向输出,并不会在其中存储。当输入发生变化时,总会在一定时间以后体现在输出端。
  同样,我们可以模拟数字电路的这一特性,对其进行建模,这种建模方式通常被称为数据流建模。数据流描述中最基本的语句是assign连续赋值语句。而行为方式的建模是指采用对信号行为级的描述(不是结构级的描述)的方法来建模。在表示方面,类似数据流的建模方式,但一般是把用initial 块语句或always 块语句描述的归为行为建模方式。因此,通常我们用的建模方式是行为级建模。
  程序中最常用的也是always模块。initial模块一般是在testbench里用到的,仿真用的。

9.D锁存器与D触发器
D锁存器是电平触发,D触发器是边沿触发,下图左边是D锁存器,右边是D触发器
Verilog学习笔记1_第2张图片

你可能感兴趣的:(Verilog学习笔记,FPGA学习笔记)