Verilog(未完待续)

Verilog教程

这个教程写的很好,可以多看看。本篇还没整理完。

一、Verilog简介

什么是FPGA?一种可通过编程来修改其逻辑功能的数字集成电路(芯片)

**与单片机的区别?对单片机编程并不改变其地电路的内部结构,只是根据要求实现的功能来编写运行的程序(指令)。**举例:单片机就两个uart,但是我想用4个uart,单片机就没办法了。

什么是HDL?(hardware description language)硬件描述语言,用于描述数字电路结构和功能的语言。

Verilog和C的区别?Verilog硬件描述语言,在编译下载到FPGA之后,会生成电路,所以Verilog是并行运行的。C语言软件编程语言,编译下载到单片机之后,是存储器中的一组指令。而单片机处理软件指令需要取指、译码、执行,这个过程是串行执行的。


二、Verilog基础语法

2.1基础知识

2.1.1逻辑值

0:低电平,GND。

1:高电平,VCC。

X:未知,高或低。

Z:高阻态,外部没有激励信号,是一个悬空状态。

2.1.2数字进制格式

二进制(b)、八进制(o)、十进制(d)、十六进制(h)

2.1.3标识符

用于定义模块名、端口名、信号名。

字母、数字、$符号、_下划线。第一个字符必须是字母或者下划线。

严格区分大小写。

不建议大小写混合使用。

普通内部信号建议全部小写。

2.2数据类型

2.2.1寄存器类型reg

数据存储单元,默认初始值是不定值x。未写位宽的时候默认32位。

reg类型数据只能在always和initial中赋值。

如果该过程语句描述的是时序逻辑,即always语句带有时钟信号,则该寄存器变量对应为触发器。

如果该过程语句描述的是组合逻辑,即always语句不带有时钟信号,则该寄存器变量对应为硬件连线。

2.2.2线网类型wire、tri

线网类型便是结构实体之间的物理连线。不能存储值,它的值由驱动的元件所决定。

驱动线网类型变量的元件有门、连续赋值语句、assign等。

如果没有驱动元件连接到线网类型的变量上,则该变量就是高阻态。

2.2.3参数类型parameter

常量,类似#define。可以一次定义多个参数,参数与参数之间需要用逗号隔开。每个参数定义的右边必须是一个常数表达式。

1.参数的传递

模块定义的时候传入参数,模块实例化的时候传入参数。

2.时序仿真中的延时

cpp 复制代码
//延时2.5个时间单位后执行sys_clk_i信号的翻转
always #2.5 sys_clk_i = ~sys_clk_i;

2.3运算符

算数运算符:+、-、*、/、%

关系运算符:>、<、<=、>=、==、!=

逻辑运算符:!、&&、||

条件操作符:?:

位运算符:~、&、|、^

移位运算符:<<、>>;注意:左移位宽要增加、右移位宽不变。

拼接运算符:{}。{a,b[3:0]}

2.3.1优先级

2.4编译指令

1.`define, `undef

2.`include

3.`timescale

用于定义时延、仿真的单位和精度

cpp 复制代码
`timescale      time_unit / time_precision
  • time_unit 表示时间单位,time_precision 表示时间精度,
  • 单位 s(秒),ms(毫秒),us(微妙),ns(纳秒),ps(皮秒)和 fs(飞秒)。
  • 时间单位≥时间精度
  • 编译过程中,`timescale会影响后面的模块中的时延值。直到遇到另一个`timescale或者`resetall。
  • 没有默认的`timescale,没有指定的情况下,会继承前面编译模块的`timescale参数,可能导致设计出错。
  • 一个设计多个模块都有`timescale时,时延单位不受影响,但是时延精度会换算成最小时延精度
  • 如果有并行子模块,子模块间的 `timescale 并不会相互影响。
  • 时间精度设置是会影响仿真时间的。时间精度越小,仿真时占用内存越多,实际使用的仿真时间就越长。所以如果没有必要,应尽量将时间精度设置的大一些。
  • 如果延时时间的最小位数小于时间精度,将会四舍五入。例如时间单位为10ns,精度为1ns,#1.04表示延时1.04个时间单位=1.04x10ns=10.4ns,但精度无法表示0.1ns,#1.04≈10ns

4.`default_nettype

5.`resetall

6.`celldefine, `endcelldefine

7.`unconnected_drive, `nounconnected_drive


三、程序框架

3.1Verilog注释

//、/**/、

3.2Verilog关键字

3.3Verilog程序框架

模块的结构

一个模块由两部分组成:一部分描述接口,一部分描述逻辑功能。

端口定义、IO说明、内部信号声明、功能定义。

模块的调用


四、高级知识点

4.1结构语句

1. initial

只执行一次。

常用于测试文件的编写,用来产生仿真测试信号(激励信号),或者用于对存储器变量赋初值。

2. always

一直不断地重复活动。

但是只有和一定的时间控制结合在一起才有作用。

always时间控制可以是沿触发或者电平触发。敏感列表。

沿触发:

多个信号中间要用or连接。(posedge,negedge)

电平触发:(*)

4.2赋值语句

1.阻塞赋值(与C语言一样)

b = a;

描述组合逻辑时,用阻塞赋值。

2.非阻塞赋值(并行同时赋值)

b <= a;

只能用于对寄存器类型的变量进行赋值,只能用于initial和always中。

描述时序逻辑时,用非阻塞赋值。

注意:在同一个always块中不要既用非阻塞赋值又要阻塞赋值,不允许在多个always块中对同一个变量进行赋值。

组合逻辑

任意时刻输出仅仅取决于该时刻的输入,与电路原来的状态无关。

时序逻辑

任意时刻的输出不仅取决于当时的输入信号,而且还取决于电路原来的状态。或者说还与之前的输入有关,因此时序逻辑必须具备记忆功能。

4.3条件语句

条件语句必须在过程块(initial、always)中使用。

if-else

0,x,z按假处理。

if和else后面可以用begin end包含多个语句。

case

位宽必须相等。

casez,不用考虑表达式中的高阻值。

casex,不用考虑高阻值z和不定值x。

4.4函数

4.5任务

  • 任务的输入输出可以没有或者多个,且端口声明可以为 inout 型
  • 不能出现initial和always过程块。但可以包含其他时序控制,如延时语句。
  • 任务可以调用函数和任务。
  • 任务可以作为一条单独的语句出现语句块中。

4.5.1 任务声明

任务在模块中任意位置定义,并在模块内任意位置引用,作用范围也局限于此模块。

模块内子程序出现下面任意一个条件时,则必须使用任务而不能使用函数

  • 1)子程序中包含时序控制逻辑,例如延迟,事件控制等
  • 2)没有输入变量
  • 3)没有输出或输出端的数量大于 1

对 output 信号赋值时也不要用关键字 assign。为避免时序错乱,建议 output 信号采用阻塞赋值。

cpp 复制代码
task       task_id ;
    port_declaration ;
    procedural_statement ;
endtask
cpp 复制代码
task xor_oper_iner(
    input [N-1:0]   numa,
    input [N-1:0]   numb,
    output [N-1:0]  numco  ) ; 
    #3  numco       = numa ^ numb ;
endtask

4.5.2 任务调用

cpp 复制代码
task_id(input1, input2, ...,outpu1, output2, ...);

输入端连接的模块内信号可以是 wire 型,也可以是 reg 型。输出端连接的模块内信号要求一定是 reg 型

4.6状态机

4.6.1状态机概念FSM

在有限个状态之间按一定规律转换的时序电路

4.6.2状态机模型

状态寄存器由一组触发器组成,用来记忆状态机当前所处的状态,状态的改变只发生在时钟的跳变沿。

4.6.3状态机设计

状态空间定义

状态跳转(时序逻辑)

下个状态判断(组合逻辑)

各个状态下的动作

相关推荐
drinow1 天前
【纸飞机串口调试工具】预设曲线名称
arm开发·驱动开发·单片机·mcu·dsp开发·fpga·iot
stm 学习ing3 天前
FPGA 第十讲 避免latch的产生
c语言·开发语言·单片机·嵌入式硬件·fpga开发·fpga
北城笑笑4 天前
FPGA 14 ,硬件开发板分类详解,FPGA开发板与普通开发板烧录的区别
fpga开发·fpga
FPGA狂飙8 天前
FPGA 常用 I/O 电平标准有哪些?
信号处理·verilog·fpga·vivado·xilinx
wow-iot8 天前
Quartus+Nios II for eclipse问题合集
fpga·quartus·nios ii
stm 学习ing9 天前
FPGA 第8讲 简单组合逻辑--半加器
c语言·开发语言·stm32·算法·fpga开发·fpga
apple_ttt10 天前
SystemVerilog学习——构造函数new
fpga开发·fpga·systemverilog·uvm
stm 学习ing11 天前
FPGA 第7讲 简单组合逻辑译码器
stm32·嵌入式硬件·学习·fpga开发·c#·学习方法·fpga
apple_ttt12 天前
SystemVerilog学习——虚拟接口(Virtual Interface)
fpga开发·fpga·systemverilog·uvm
inputA16 天前
【SoC设计指南 基于Arm Cortex-M】学习笔记1——AMBA
笔记·stm32·单片机·嵌入式硬件·fpga