verilog设计知识集合

一、基本知识

verilog HDL,verilog硬件描述语言,可从上层到下层一直设计,使用一些列分层的模块来表示极其复杂的数字系统的语言。利用EDA工具将模块转化为网表,再使用FPGA或者ASIC实现具体的电路结构。

另外一门比较出名的是硬件描述语言是VHDL,偏重标准化考虑。

两门语言的描述能力略有差别,verilog的系统抽象能力的较弱,门级和开关电路级的描述能力比VHDL强。

主流设计方法是RTL设计,从RTL描述生成网表;行为级综合工具允许直接对电路的算法和行为描述。

二、设计流程和通用设计方法论

1、完整工程通用设计方法

(1)设计规范

对整个项目的设计情况和要求具体描述:

1️⃣展示芯片与系统关系的外部框图:系统描述

2️⃣展示每一部分功能的内部框图:功能描述

3️⃣IO引脚的描述:引脚描述

4️⃣定时估计:时序描述

5️⃣器件门数估计:面积估计

6️⃣封装形式:封装估计

7️⃣功耗形式:功耗估计

8️⃣价格目标:价格估计

还有测试程序,这个是在设计中不断添加的。

(2)设计规范评估

用于设计规范的可用性的评估,决定是否可行。

(3)选择器件和工具

选择芯片和对应的EDA工具,如Xilinx的芯片和vivado、Altera(inter)的芯片和quartus或者其他的系列。

(4)设计

采用从上到下的方法,按照器件的结构来工作,使用合适的设计方法,解决设计中的问题。

(5)检验

对设计的源码进行仿真,完成RTL级仿真结果和门级仿真结果的一致。这简称前仿真。在布局布线前还需要时序分析和后仿真。

(6)最终的评估

形式上确认无误

(7)系统集成和测试

芯片投产后进行连续的器件和系统的可靠性测试。

2、verilog HDL设计方法

(1)Bottom-Up

先出系统框图,然后划分模块,再进行设计,然后将设计综合成系统。

优点实现各个子模块的时间较短。

缺点是对整个系统的功能把握不足,整个系统实现时间较长,对设计人员相互协作的能力要求较高,结构设计错误容易造成较大损失。

(2)Top-Down

对整个系统进行方案设计和高层次的功能划分,使用低层次实现高层次的功能,一个设计分为树形结构。可以购买末端的设计。

优点:设计开始时就完成了系统分析,主要仿真和调试过程在高层次完成,可以尽早完成结构设计上的错误。方便了从系统级划分和管理整个项目。

缺点:得到的最小单元不标准,制作成本可能比较高。

(3)综合使用

1️⃣设计开始时,对系统的行为进行仿真,仿真成功后转化为RTL级描述

2️⃣RTL级描述,RTL级行为级描述硬件有关。

3️⃣逻辑综合,将RTL级描述转化为网表。

三、verilog语法的基本概念

1、模块(module)

verilog的模块可以对应不同级别的抽象:

1️⃣系统级2️⃣算法级3️⃣RTL级4️⃣门级5️⃣开关级

其中123是行为级,前端需要掌握4,后端还需要掌握5,在学习中了解每个模块的层次是重要的。

2、功能

(1)顺序执行(begin-end)或者并行执行(fork-join)

(2)延时表达式(#)或者事件表达式

(3)通过命名事件触发其他事件

(4)条件语句(if,case)等循环程序结构

(5)提供可带参数且非零延续的时间的任务task结构

(6)提供可以自定义新的操作符的函数function结构

(7)用于建立表达式的运算符(算数、逻辑、位运算符)

(8)结构化语言也是用于门级和开关级

3、模块的调用

通过模块名可以调用其他模块,注意端口的一致性。

4、模块测试

模块测试的语法较可综合的语法会宽泛,允许使用各种测试系统函数(stop,display)。测试的方法就是测试信号对呗测试模块的调用。

四、模块的结构

1、模块的结构

verilog程序包括四个部分:

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

 module name(io1,io2,io3);

input io1;

output io2,io3;

endmodule

2、数据类型及常量和变量

reg、wire、integer、parameter

reg:寄存器型,always内部赋值专用

wire:连线变量,assign内部赋值专用变量

integer:整型,用于语法描述所需的整数,

parameter:参数,用于模块内部的常量。

具体实例:

1️⃣整型

1'b1,2'o1,3'd1.4'h1,

'b1,'h2,'d3,

1,2,3,

x,z,

2️⃣字符串

"abcd","abc\n","ab\\",

"ad%%"

3️⃣变量

wire,tri

reg,integer

memory (reg的数组)

wire a;

reg [7:0] b;

reg [7:0] b [255:0];

五、verilog HDL运算符

基本原则:

wire和reg是无符号数,

整型和实数型有符号数,

操作数存在x,结果即为x,

//算数操作
a=4’b1100; /*a=12*/ b=4’b0011; /*b=3*/ c=4’b1011; /*b=11*/
$display(a*b); //结果4 (10 0100,按操作数最长位数截短)
$display(a/b); //4
$display(a+b); //15
$display(a+c); //7 (1_0111截短到4位)
$display(a-b); //9
$display((a+1’b1)%b); //1
$display(-10%3); //-1
$display(11%-3); //2
//位操作
a=4’b1100; b=4’b0011; c=4’b0101; d = 4’b1xx0; e = 4’b0;
$displayb(~a); //结果0011
$displayb(a&c); //0100
$displayb(a|b); //1111
$displayb(b^c); //0110
$displayb(a~^c); //0110
$displayb(d&e); //0000
//逻辑操作
a=2; b=0; c=4’hx;
$display(a&&b); //结果0
$display(a||b); //1
$display(!a); //0
$display(a||c); //1
$display(a&&c); //x
$display(!c); //x
$display(b&&c); //0
//比较操作
a=2; b=5; c=2; d=4’hx; e= -2;
$display(a<b); // 1
$display(a>b); // 0
$display(a>=c); // 1
$display(d<=a); // x
$display(4'b0 <= 4'hx); // x

$display(-2<b); // 0
$display(-2<5); // 1
$display(2-5); // -3
$display(a-b); // 13
$display(e); // 14


这里注意display显示符号位和不显示符号位的要求:全reg型变量显示符号位,全常量不显示符号位。混合未知。(在编译器中会出现乱码)

//移位操作
a=4’b1010;
$displayb(a<<1); //结果4’b0100
$displayb(a>>2); // 4'b0010
$displayb(4'bx<<2); // 4'bxx00
$displayb(4'b1101<<2); // 4'b0100
//连接操作
a=1’b1; b=2’b00; c=6’b101001;
$displayb({a, b}); //结果3’b100
$displayb({c[5:3], a}); // 4’b1011
$displayb({4{a}}); // 4’b1111
//缩位操作
a=4’b1111; b=4’b0101;
c = 4’b0x1z;
$displayb(&a); //结果1
$displayb(|b); // 1
$displayb(^b); // 0

$displayb(&c); //结果0
$displayb(|c); // 1
$displayb(^c); // x

 
//判断操作
result = (op==ADD)? a+b : a-b;

止于运算优先级,多错几次就知道了。基本按照C语言走的。

六、verilog语句

1、块语句

顺序快(begin-end)和并行块(fork-join),两者的区别在于执行方法。顺序块逐条执行,并行块整体执行。一般使用begin-end比较符合C的设计习惯。主要差别在于延时的判断。

2、赋值语句

=阻塞赋值,等式右边先计算,再一起赋值给左式。

<=非阻塞赋值,等式右边计算后赋值给左式,然后计算下一条。

起始时间和结束时间:

对于并行块,最长的就是结束时间。对于顺序块,结束时间是所有延时相加。

3、条件语句

if-else语句和case语句,和C语言大致相似。case的形式有所区别:

case ( rega )
16’d0: result=7’b0111111;
16’d1: result=7’b1011111;
16’d2: result=7’b1101111;
16’d3: result=7’b1110111;
16’d4: result=7’b1111011;
16’d5: result=7’b1111101;
16’d6: result=7’b1111110;
default: result=7’bx;
endcase

casez不考虑z,casex不考虑x和z,可以灵活使用。

4、循环语句

forever、repeat、while、for

这四个循环语句都不可以直接综合,不能独立放在程序中。

forever  begin end

repeat (numb)begin end

while (条件)begin end

for(初始化,跳出条件,执行语句)begin end

5、结构说明语句

initial always task function

initial:只是执行一次的语句

always:总是执行

task:带参数的复用模块

function:带参数的关键字声明。函数不能启动任务。

task通过参数传递结果,function通过返回值传递结果。简单理解,task是可快速调用的代码,function是自定义的关键字。

6、系统函数

• $display和$write 标准输出任务
• $monitor 仿真监控任务
• $finish和$stop 仿真结束任务
• $time和$realtime等 时间函数
• $fopen…$readmemh等 文件、存储器处理
• $random 随机数函数

7、系统预编译

• `define 宏定义
• `include 文件包含
• `ifdef…`else…`endif 条件编译
• `timescale 时间定标
• `uselib 工作库定义

verilog设计知识集合的更多相关文章

  1. Verilog设计Valid-Ready握手协议

    转自http://ninghechuan.com 我不生产知识,我只是知识的搬运工. Handshake Protocol握手协议!为了保证数据传输过程中准确无误,我们需要加上握手信号来控制信号的传输 ...

  2. Verilog设计技巧实例及实现

    Verilog设计技巧实例及实现 1 引言 最近在刷HDLBits的过程中学习了一些Verilog的设计技巧,在这里予以整理.部分操作可能降低代码的可读性和Debug的难度,请大家根据实际情况进行使用 ...

  3. 最实用的APP界面设计知识,有温度的APP设计(转)

    在逛简书的时候,无意之间看到了这样的一篇非常有意思的app设计博文.顾25学堂的摘录了其中的一些关于移动端APP界面设计的精华.分享给25学堂的app设计师们. 当然,下面的这些app设计知识点是来自 ...

  4. 硬件描述语言Verilog设计经验总结

    一.硬件描述语言Verilog 粗略地看Verilog与C语言有许多相似之处.分号用于结束每个语句,注释符也是相同的(/* ... */和// 都是熟悉的),运算符"=="也用来测 ...

  5. 全数字锁相环(DPLL)的原理简介以及verilog设计代码

    随着数字电路技术的发展,数字锁相环在调制解调.频率合成.FM 立体声解码.彩色副载波同步.图象处理等各个方面得到了广泛的应用.数字锁相环不仅吸收了数字电路可靠性高.体积小.价格低等优点,还解决了模拟锁 ...

  6. 基于basys2驱动LCDQC12864B的verilog设计图片显示

    话不多说先上图 前言 在做这个实验的时候在网上找了许多资料,都是关于使用单片机驱动LCD显示,确实用单片机驱动是要简单不少,记得在FPGA学习交流群里问问题的时候,被前辈指教,说给我最好的指教便是别在 ...

  7. 基于basys2用verilog设计多功能数字钟(重写)

    话不多说先上图         前言 自从学习FPGA以来,唯一做过的完整系统就是基于basys2得多功能数字表.记得当时做的时候也没少头疼,最后用时间磨出来了一个不是很完整的小系统,当时还是产生了满 ...

  8. 【CPU微架构设计】利用Verilog设计基于饱和计数器和BTB的分支预测器

    在基于流水线(pipeline)的微处理器中,分支预测单元(Branch Predictor Unit)是一个重要的功能部件,它负责收集和分析分支/跳转指令的执行结果,当处理后续分支/跳转指令时,BP ...

  9. Verilog设计分频器(面试必看)

    分频器是指使输出信号频率为输入信号频率整数分之一的电子电路.在许多电子设备中如电子钟.频率合成器等,需要各种不同频率的信号协同工作,常用的方法是以稳定度高的晶体振荡器为主振源,通过变换得到所需要的各种 ...

  10. Verilog设计中的锁存器

    问题: 什么是锁存器? 什么时候出现锁存器? 锁存器对电路有什么影响? 如何在FPGA设计中避免锁存器? 在FPGA设计中应该避免锁存器.实际上,锁存器与D触发器实现的逻辑功能基本相同,都有暂存数据的 ...

随机推荐

  1. .NET周刊【2月第2期 2024-02-11】

    国内文章 C#/.NET该如何自学入门? https://www.cnblogs.com/Can-daydayup/p/18006914 随着DotNetGuide技术社区交流群的扩大,很多新成员希望 ...

  2. OpenWrt 21.02.2 记录: PPPoE, Wireguard

    OpenWrt 21.02 OpenWrt 21.02.2 是 OpenWrt 当前最新的稳定版, 内核 5.4.179, 这个内核已经内置了 Wireguard 模块 root@OpenWrt:~# ...

  3. Optional 详解

    1 前言 Optional 是 Java 8 的新特性,专治空指针异常(NullPointerException, 简称 NPE)问题,它是一个容器类,里面只存储一个元素(这点不同于 Conllect ...

  4. java打印杨辉三角

    package com.dylan.practice.interview; /** * 打印杨辉三角 * * 原理 * 1.每个数等于它上方两数之和 * 2.第n行的数字有n个 * * @author ...

  5. Vue3学习(十八) - TreeSelect 树选择

    写在前面 本以为可以在家学习一天,结果家里来了客人拜年,就没学习上,有点小遗憾吧. 昨天完成从分类管理的前后端代码复制出文档管理的前后端代码,遗留问题是只能选择一级父分类.值得说的是,昨晚的遗留的问题 ...

  6. 小程序中用css修改svg的颜色

    记一下(#^.^#) <div class="svg"> <img src="./firefox-logo.svg" class=" ...

  7. channel管道

    channel 如果说goroutine是并发体的话,那么channels则是他们之间的通信机制.一个channel是一个通信机制,它可以让一个goroutine通过它给另一个goroutine发生值 ...

  8. 手写web框架

    重新认识HTTP http请求报文包含三个部分(请求行 + 请求头 + 请求体) 请求行 请求行包含三个内容: method + request-URI + http-version -- 例如 GE ...

  9. 【Azure Notification Hub】创建Notification Hub失败,提示 unrecognized arguments: --sku Free

    问题描述 用Azure CLI命令创建 Notification Hub,报错不识别的参数 --Free SKU 问题解答 经测试发现,在创建Notification Hub前,需要创建 Notifi ...

  10. STL-list模拟实现

    #pragma once #include"16my_Itetator.h" //测试用 #include<iostream> //测试用 using std::cou ...