FPGA学习笔记-Verilog语法-夏宇闻

FPGA-00-语法

《Verilog数字系统设计教程》-夏宇闻-第一部分

第一章 基础知识

硬件描述语言HDL:以文本形式描述数字系统硬件的结构和行为。-->利用EDA工具进行仿真验证-->利用自动综合工具将具体物理电路的模块组合转换到门级电路网表-->利用ASIC或FPGA自动布局布线工具把网表转换为具体电路布线结构


第二章 基本概念

Verilog(1)让模块最终能生成电路的结构(2)测试逻辑功能


第三章 模块的结构、数据类型、变量和基本运算符号

1.模块的结构

包括端口定义、I/O说明、内部信号声明、功能定义

(1)端口定义、I/O说明可以写在一起

(2)功能定义的三种方法:

①持续赋值语句:assign,多用于描述组合逻辑

②过程块:always,用于描述组合逻辑+时序逻辑

③实例引用

  •  只有这三种,且是并行的!

2.数据类型、常量

(1)常量

包括数字型(4'b0001)和参数型(parameter)

  • 参数型一般用于定于延迟时间和变量宽度

(2)变量

包括wire型、reg型和memory型

wire型:不能存储,需要assign驱动

reg型:always块里被赋值的信号必须定义成reg型

memory型:扩展reg型地址范围,例reg[n-1,0] mem[m-1,0]表示m个n位寄存器

3.运算符

(1)算术运算符:+ - x / %

(2)赋值:= <=

(3)关系:< > <= >=,等式== !=(不比较z和x) === !==(比较z和x)

(4)逻辑:&& || !

(5)条件:?:

(6)位:~ & | ^ ^~

(7)移位:<< >>

  • 位数变化!左移位数增加(补0);右移位数不变(吞数)

(8)位拼接:{}

(9)缩减:& | ~(单目)


第四章 赋值语句、块语句

1.赋值语句

阻塞与非阻塞的用法:

always块中,描述组合逻辑-->阻塞赋值=,只与电平变化有关

                    描述时序逻辑-->非阻塞赋值<=,往往与触发沿有关

  • 同一个always里不要既用=又用<=

2.块语句

(1)顺序块:begin-end

(2)并行块:fork-join,描述测试信号常用、

  • 理论上并行,实际上受限且不固定
  • disable用来禁用块,类似c中break退出循环

第五章 条件语句、循环语句、生成语句

1.条件语句if-else

条件语句必须在过程块里,例如always的begin-end里

2.case语句

case全比较,casez不比较z,casex不比较x和z

记得写endcase,记得加default

  • 如果条件写的不全,一旦没有条件符合,无法赋值,会生成锁存器。

3.循环语句

(1)forever语句:连续执行,用于initial块中生成波形

(2)repeat(常量表达式))语句:执行n次

(3)while(表达式)语句:判断真,可以和>>一起计算1的个数

(4)for(表达式1;表达式2;表达式3)语句

4.生成语句

generate-endgenerate


第六章 结构语句、系统任务、函数语句

1.结构说明语句

(1)initial语句:只执行一次,

用法:①生成激励波形作为测试仿真信号    ②设置信号记录

(2)always语句:重复但是否执行看触发条件

用法:①产生时钟,作为激励信号测试

always    #half_period    areg=~areg;

②时间控制

边沿触发:描述时序行为,如状态机

电平触发:描述组合逻辑

always @(posedge clock or posedge reset) //边沿触发

begin end

always @(a or b or c) //电平触发

begin end

always @(*) //全部输入变量

begin end

always

   wait(enable) begin end

2.任务task和函数function

待补充


第七章 系统函数和任务、编译预处理语句

1.常用系统函数和任务

(1)输出

  • $display("%b+%b=%d",a,b,c)

%h十六进制,%d十进制,%o八进制,%b二进制,%s字符串,%t时间

  • $write("%b+%b=%d\n",a,b,c),同行显示,不会自动换行,要加\n
  • $strobe("%b+%b=%d",a,b,c),在同时刻赋值语句执行后执行,能确保赋值完毕

(2)监控输出

  • $monitor("%b+%b=%d",a,b,c),用于检测变量,变量发生变化就会执行输出一次,一般在initial块中,不间断进行监视

(3)时间

  • $time返回64位当前仿真时刻,以仿真时间尺度为基准,是时间尺度的倍数且取整
  • $realtime保留实数,不取整
  • $timeformat(units_number, precision_number, suffix_string, minimum_field_wdith);

units_number 表示打印的时间值的单位:0 表示秒,-3 表示毫秒,-6 表示微秒,-9 表示纳秒, -12 表示皮秒, -15 表示飞秒;中间值也可以使用:例如-10表示以100ps为单位。其默认值为`timescalse所设置的仿真时间单位。

precision_number 是在打印时间值时,小数点后保留的位数。其默认值为0。

suffix_string 是在时间值后面打印的一个后缀字符串。其默认值为空字符串。

MinFieldWidth 是时间值字符串与后缀字符串合起来的这部分字符串的最小长度,若这部分字符串不足这个长度,则在这部分字符串之前补空格。其默认值为20。

(4)暂停与结束

  • $stop暂停仿真
  • $finish结束仿真

(5)从文件读取数据到存储器

  • $readmemb("<数据文件名>",<存储器名>) 读二进制文件函数
  • $readmemh("<数据文件名>",<存储器名>) 读十六进制文件函数

(6)产生随机数

  • $random%100产生范围(-99~99),{$random}%100产生范围(0~99) ,{$random}%2产生01比特

2.编译预处理

(1)宏定义

  • `define 标识符 字符串

(2)文件包含

  • `include "文件名.v"

(3)时间尺度

  • `timescale 时间单位/时间精度

(4)条件编译

你可能感兴趣的:(fpga开发,学习)