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. java 手写并发框架(一)异步查询转同步的 7 种实现方式

    序言 本节将学习一下如何实现异步查询转同步的方式,共计介绍了 7 种常见的实现方式. 思维导图如下: 异步转同步 业务需求 有些接口查询反馈结果是异步返回的,无法立刻获取查询结果. 比如业务开发中我们 ...

  2. k8s-dashboard、helm

    目录 dashboard 安装dashboard 1. 创建SA 2. 集群角色绑定 3. 创建secret 4. 查看token helm 安装helm 1. 下载tar包 2. 解压 3. 配置环 ...

  3. Java定时器(Timer)

    1.介绍 Timer和TimerTask是用于在后台线程中调度任务的java util类.简单地说,TimerTask是要执行的任务,Timer是调度器. 2.调度一次性任务 2.1 指定延迟后执行 ...

  4. 2021 虎符杯hate num 注入题

    前言 今天遇到个有意思的SQL盲注,花了不少功夫,也学到了新姿势,遂记录下来以备后续碰到相同场景使用. 题目 这是2021 虎符杯的一道web题,有一个目标站点且附带了源码. 源码内容包括: 主要逻辑 ...

  5. 【Azure 应用服务】用App Service部署运行 Vue.js 编写的项目,应该怎么部署运行呢?

    问题描述 用App Service部署运行 Vue.js 编写的项目,应该怎么部署运行呢? 问题解答 VUE通常是运行在客户端侧的JS框架. App Service 在这种场景中是以静态文件的形式提供 ...

  6. 【Azure Redis 缓存】Azure Cache for Redis 专用终结点, 虚拟网络, 公网访问链路

    问题描述 为优化Redis访问链路,对下面三种方案进行对比: 1.Redis添加到虚拟网络 2.Redis添加专用终结点 3.Redis默认公共链路 问题分析 第三种:Redis默认公共链路,顾名思义 ...

  7. 【Azure 环境】Azure应用程序网关设置set_Cookie=key=value; SameSite=Strict; HTTPOnly,AzureAD登录使用cookie时使用不了的案例记录

    问题描述 Azure应用程序网关设置 set_Cookie=key=value; SameSite=Strict; HTTPOnly,AzureAD 登录使用cookie时使用不了. 分析过程 重写网 ...

  8. 面试官上来就让手撕HashMap的7种遍历方式,当场愣住,最后只写出了3种

    写在开头 今天有个小伙伴私信诉苦,说面试官上来就让他手撕HashMap的7种遍历方式,最终只写出3种常用的,怀疑面试官是在故意***难.这个问题大家怎么看? 反正我个人感觉这肯定不是***难,&quo ...

  9. Java 数组 数据类型默认值

    1 public static void main(String[] args) 2 { 3 int[] arry = new int[4]; //int 默认值0 //浮点型 0.0 4 for(i ...

  10. SourceTree 合并DEV分支到master

    SourceTree 合并DEV分支到master 1 切换到master分支 2 右键dev分支,选择 合并dev至当前分支 3 提交代码