没有合适的资源?快使用搜索试试~ 我知道了~
Verilog关键字整理 erilog中的变量有线网类型和寄存器类型。线网型变量综合成wire,而寄存器可能综合成WIRE,锁存器和触发器,还有可能被优化掉。 二:verilog语句结构到门级的映射 1、连续性赋值:assign 连续性赋值语句逻辑结构上就是将等式右边的驱动左边的结点。因此连续性赋值的目标结点总是综合成由组合逻辑驱动的结点。Assign语句中的延时综合时都将忽视。 2、过程性赋值: 过程性赋值只出现在always语句中。 阻塞赋值和非阻塞赋值就该赋值本身是没有区别的,只是对后面的语句有不同的影响。 建议设计组合逻辑电路时用阻塞赋值,设计时序电路时用非阻塞赋值。 过程性赋值的赋值对象有可能综合成wire, latch,和flip-flop,取决于具体状况。如,时钟控制下的非阻塞赋值综合成flip-flop。
资源推荐
资源详情
资源评论
1.verilog 特点:
区分大小写,所有关键字都要求小写
不是强类型语言,不同类型数据之间可以赋值和运算
// 是单行注释 可以跨行注释
描述风格有系统级描述、行为级描述、 RTL级描述、门级描述,其中 RTL 级和门级别与具体
电路结构有关, 行为级描述要遵守可综合原则, 门级描述使用门级模型或者用户自定义模型
UDP来代替具体基本元件,在 IDE 中针对不同 FPGA器件已经有对应的基本元件原语
2.verilog 语法要点:
module endmodule 之间由两部分构成:接口描述和逻辑功能描述
IO 端口种类: input output inout
相同位宽的输入输出信号可以一起声明, input[3:0] a,b; 不同位宽的必须分开写
内部信号为 reg 类型,内部信号信号的状态: 0 1 x z , 3'bx1=3'bxx1 x/z 会往左扩展
3'b1=3'b001 数字不往左扩展
逻辑功能描述中常用 assign 描述组合逻辑电路, always 既可以描述组合逻辑电路又可以描
述时序逻辑电路,还可以用元件调用方法描述逻辑功能
always 之间、 assign 之间、实例引用之间以及它们之间都是并行执行, always 内部是顺序
执行
常量格式: <+/->< 二进制位宽 ><'>< 进制 ><该进制的数值 >:
默认进制为 10 进制
默认位宽为 32 位
位宽是从二进制宽度角度而言的
由位宽决定从低位截取二进制数 2'hFF=2'b11 ,通常由被赋值的 reg 变量位宽决定
parameter 常用于定义延迟和变量位宽,可用常量或常量表达式定义
变量种类: wire reg memory
IO 信号默认为 wire 类型,除非指定为 reg 类型
wire 可以用作任何输入输出端口
wire 包括 input output inout
wire 不带寄存功能
assign 赋值语句中,被赋值的信号都是 wire 类型
assign 之所以称为连续赋值,是因为不断检测表达式的变化
reg 类型可以被赋值后再使用,而不是向 wire 一样只能输出,类似 VHDL中的 buffer 端口
reg 类型变量初始值为 x (VHDL 中初始值为本类型最小值,通常是 0)
always 模块里被赋值的信号都必须定义为 reg 类型,因为 always 可以反复执行,而 reg 表
示信号的寄存,可以保留上次执行的值
reg 类型变量与 integer 变量不同,即使赋负值,实质上也是按二进制无符号数存储的,
integer 是有符号数
verilog 中所有内部信号都是静态变量,因为它们的值都在 reg 中存储起来了
memory型只有一维数组,由 reg 型变量组成
memory初始化只能按地址赋值,不能一次性赋值
1*256 的 memory写法: reg mema[255:0] mema[3]=0;
不同位宽的变量之间赋值,处理之前都以被赋值的变量位宽为准扩展或截取
A[a:b] 无论 a b 谁大, a 总是实际电路的信号高位, b 总是实际电路的信号低位
算术运算中如果有 X值则结果为 X
for 循环中的变量另外定义成 integer ,因为它不是实际信号,有正负; reg 则以无符号数
存在
== 和!= 只比较 0、1,遇到 z 或 x 时结果都为 x (x 在 if 中算做假条件 ) ,结果可能是 1、0、
x
===和!== 比较更加苛刻,包括 x 和 z 的精确比较,结果可能是 0、1
&&的结果只有 1'b1 或 1'b0 两种, A&A 的结果位宽则是与 A相同的
{1,0} 为 64'h100000000, 所以拼接运算中各信号一定要指定位宽
移位运算左移将保留 4'b1000<<1 等于 5'b10000 ,右移则舍弃 4'b0011 等于 4'b0001
数字电路里位运算应用普遍,包括按位逻辑运算、移位运算、拼接运算、缩减运算
非阻塞式赋值 <=与阻塞式赋值 =
阻塞:在同一个 always 过程中,后面的赋值语句要等待前一个赋值语句执行完,后面的语
句被该赋值语句阻塞
非阻塞:在同一个 always 过程中,非阻塞赋值语句是同时进行的,排在后面的语句不会被
该赋值语句阻塞
<=:
块结束后才能完成赋值
块内所有 <=语句在 always 块结束时刻同时赋值
<=右边各变量的值是上一次时钟边沿时,这些变量当时的值
用于描述可综合的时序电路
=:
=语句结束之后过程 always 才可能结束
在 always 过程中, begin end 块内按先后顺序立即赋值,在 fork join 内同时赋值 ( 可能造
成冲突 )
与 assign 连用描述组合电路
begin end 中阻塞的含义: begin ...@(A ) B=C...; end 如果 A 事件不发生则永远不能执行
下去,被阻塞了
由于时钟的延时 ( 往往在 ps 级) ,多个 always(posedge) 之间究竟谁先执行是个未知数
使用原则:同一个 always 过程块内建立时序电路用 <=
纯组合逻辑电路用 =,生成的电路结构最简单,执行速度最快
同一个 always 块内不要混用 <=和=
不要在多个 always 块内对同一个变量赋值 ( 多源驱动 )
if else 的三种形式,第三种形式适合描述优先编码器
if 条件中 0/x/z 当成假, 1 当成真,非 0 的数值也当成真
case 语句的三种: case( 四种状态的比较 ) casez( 忽略 z) casex( 忽略 x 和 z,只看哪些位
的信号有用 )
case 语句中所有表达式值的位宽必须相等, default 中不能将 n'bx 用'bx 代替
避免生成锁存器的方法: 电平触发时 if 后加 else case 中加 default ?
使用 casex 会将不必要的状态视为无关项,使得综合出来的电路最简单
两种特殊的括号: begin 顺序语句 ... end fork 并行语句 ... join, 其差别在于块内语句
的起止时间、执行顺序、相对延时
块被命名后,其内部变量可以被调用,因为变量都是静态的 ( 调用信号:对应电路中的一个
信号线被引到另一处 )
initial 块只无条件执行一次 always 块在满足条件时不断执行
initial 常用来写测试文件, always 块常用来写电路描述
always 既可以描述组合逻辑电路又可以描述时序逻辑电路
always 如果后面有敏感信号列表则不能用 wait 语句
always 既可以描述电平触发又可以描述边沿触发, wait 只能描述电平触发
assign 常用于描述组合逻辑电路
测试文件中一般都是先 initial 后 always
生成语句: 生成快的本质是使用循环内的一条语句代替多条重复的 verilog 语句,简化了用
户的编程
genvar 用于声明生成变量,生成变量只能用在生成快之间
仿真时,仿真器会将生成块中的代码展平,在确立后的方针代码中,生成变量是不存在的
最好是先想象出来循环生成语句被展平后的电路样子,再写相关的描述语句
task 和 function 的区别:
task 可以定义自己的仿真时间单位, function 与主模块共用同一个仿真时间单位
函数不能启动任务,任务能够启动函数
函数至少要有一个输入变量,任务没有输入变量
函数返回一个值,任务不返回值
一个模块的设计包括 3 个部分: 电路模块的设计 测试模块的设计 设计文档的编写
设计者通过布局布线工具生成具有布线延迟的电路,再进行后仿真,得到时序分析报告
从时序分析报告中可以知道电路的实际延迟 t ,同步电路内每个时钟周期要大于 t, 从而可确
定该运算逻辑的最高频率
综合器之所以能够实现加法器、乘法器是因为库中已经存在可配置的参数化器件模型
FPGA内总线宽度容易自定义,以便实现高速数据流,三态数据总线相当于数据流的控制阀
门
数字系统内数据流的控制: 开关 ( 或三态数据总线 ) 、数据暂存部件 ( 寄存器 ) 、 同步状态机
控制 ( 整个系统在一个时钟域内 )
流水线操作 pipe line :
K级流水线就是从组合逻辑的输入到输出恰好有 K个寄存器组, 上一级的输出是下一级的输
入
流水线操作获得第一个结果的时间要比不用流水线操作的时间长, 但以后结果获得时间都只
需要一个时钟周期,提高了数据吞吐量
流水线操作的保证: Tclk>K*( 组合逻辑延迟 +触发器的建立保持时间 / 触发时间 ), 即时间片段
要长于最大路径延迟
体现了面积换速度的思想,在综合时考虑的是以面积小为主还是以速度为主
本质上是一种同步逻辑
同步时序逻辑和异步时序逻辑:
同 步 时 序 逻 辑 指 所 有 寄 存 器 组 由 唯 一 时 钟 触 发 always@(posedge clk) 或
always@(negedage clk)
异步时序逻辑指触发条件不唯一,任意一个条件都会引起触发 always@(posedge clk or
posedage reset)
目前的综合器是以同步时序逻辑综合的,因为同步时序逻辑较异步时序逻辑可靠
严格的同步要求时钟信号传递速度远远大于各部分的延迟, 实际中 clk 要单独用线, 而不要
经过反相器等部件
always @(posedge.. ) begin ...<=... end 表示同步时序逻辑 ( 同时刻赋值 )
不同速率数据接口的处理方法 ( 异步数据的处理方法 ) :帧同步 FIFO 双端口 RAM
同步状态机:
包括 moore 和 mealy 型两种,及其反馈模型 ( 是一种反馈控制系统,当前状态就是其内部状
态变量 )
状态机的开发步骤:
根据实际问题列出输入输出变量和状态数
画出状态图并化简
写出状态转移真值表得到逻辑表达式
用 D触发器或 JK 触发器构建电路 ( 目前用 D触发器多 )
verilog 描述时只需要得到简化的状态图就可以描述
状态编码方式: 独热码 格雷码
状态机主体程序有单 always 描述方式和多 always 描述方式
采用 case/casez/casex 建立模型最好,因为 x 是无关态,生成的电路最简单
default: state='bx 与实际情况更一致,效果等同于 default: state<=idle
只有同步状态机才能被目前的综合
for 语句会将所有变量的情况展开,占用巨量逻辑资源,替代办法是用计数器和 case 语句
说明所有情况
有优先级的 if else 结构会消耗更多资源,建议用无优先级的 case 替代
模块的复用往往比代码上修改节省的资源多
PLL 的分频、倍频、移相操作会增加设计精度
同步时序电路的延时: #x 通常用于仿真测试,实际硬件延时是:长延迟用计数器,小延迟
用 D触发器,此方法用来取代延迟链
同步电路中,稳定的数据采用必须满足采样寄存器的建立和保持时间
reg 类型在 always 中不一定综合成时序电路,也可能是组合逻辑电路
乒乓操作与作用 异步时钟域同步问题
延迟包括门延迟和线延迟
组合逻辑产生的时钟仅能应用在时钟频率较低、精度要求不高的情况下
增减敏感信号得到的结果一样
补充部分:
verilog HDL 起初是作为写 testbench 而产生的
verilog 有 1995 进入 IEEE 标准,为 IEEE-1364, 于 2001 年进行了扩展, 为 IEEE 1364-2001 ;
verilog AMS 可用于模拟电路和数字电路的综合,目前正在不断发展和完善中;
verilog 的标识符区分大小写,关键字使用小写;
用 来进行单行注释,用 来进行跨行注释;
标识符由字母、数字、下划线构成,并以字母开头;
关键字又叫保留字,只有小写的关键字才是保留字;
信号的状态有 4 种: 0 1 x z
x 和 z 在描述电路时不区分大小写,在仿真时大小写有不同意义;
常量表达式中:
x z 不区分大小写;
进制符号 h o d b 与 H O D B 不区分大小写;
十六进制中 a~f 不区分大小写;
下划线 _用于提高可读性;
?在数中可以代替 z;
x 和 z 的左端补位;
字符和字符串都以 ASICII 码形式存在,也可以当成电路内的信号;
字符串必须包含在同一行,不能分成多行书写;
如果表达式或者赋值语句中将字符串当成操作数,则字符串中的每个字符都被看成 8 位的
ASCII 值序列;
可综合的信号类型: wire reg memory 它们用来描述数字电路
不可综合的数据类型: integer real 它们只用仿真,位于 testbench 中
wire 是连线的抽象模型,不能保存数据,其值由驱动元的值决定;
wire 不能用在 always 或 initial 块中;
wire 的默认值为高阻 z;
wire 的使用情形: 1. 作为模块的输出端口 2. 用连续赋值语句 assign 赋值;
reg 是 1 位寄存器(触发器)的抽象模型,可以保存数据;
reg 必须用在 always 或 initial 块中;
reg 的默认值为 x;
reg 的使用情形: 1. 阻塞赋值 <= 2. 非阻塞赋值 =
memory只能是一维的;
memory只能对每个单元分别初始化,方法: 1. 一个一个赋值 2. 通过系统任务 $readmem赋
值
reg[3:0] fc ;// 一个 4 位寄存器 reg fc[3:0] //4 个一位寄存器
parameter 的作用:仿真开始以前对其进行赋值,整个仿真过程中保持其值不变;
关系运算符将以逻辑 1 或逻辑 0 返回比较的结果;
== != 的返回值有 0 1 x 三种情况, === !== 的返回值只有 0 1 两种情况;
verilog 由于是描述电路的,用于位的操作较多,有 : 位逻辑操作,移位操作,并置操作,
归约操作;
位逻辑运算的结果中,位数与原操作数一样多;
归约符是在原操作数的所有位上进行操作,并产生 1 位结果;
并置运算可以发生在 bit 与 bit 之间 bit 与矢量之间 矢量与矢量之间
剩余27页未读,继续阅读
资源评论
一天一块砖
- 粉丝: 1
- 资源: 2
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- (源码)基于LLVM框架的代码生成与优化系统.zip
- (源码)基于Arduino的花盆自动化系统.zip
- (源码)基于ZigBee和STM32的智能家居环境监测监控系统.zip
- (源码)基于TensorFlow的多GPU CIFAR10并行训练系统.zip
- (源码)基于C++和Qt框架的游戏工作室服务器管理系统.zip
- (源码)基于Spring Boot的赛事管理系统.zip
- (源码)基于C#和ASP.NET Core的智能家居管理系统.zip
- (源码)基于rosserial的STM32嵌入式ROS通信系统库(Yoneken版改进版).zip
- 9.4 使用生成的识别器模型faceModel.xml预测新图像,并输出匹配结果标签和置信度
- (源码)基于Spring Boot和Shiro的电商管理系统.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功