没有合适的资源?快使用搜索试试~ 我知道了~
verilog初学资料,包括各种基本可综合语法,一些简单的代码,带你一步一步熟悉verilog 语言,为以后打下基础。
资源推荐
资源详情
资源评论
先记下来:
、不使用初始化语句;
、不使用延时语句;
、不使用循环次数不确定的语句,如:, 等;
、尽量采用同步方式设计电路;
、尽量采用行为语句完成设计;
、 过程块描述组合逻辑,应在敏感信号表中列出所有的输入信号;
、所有的内部寄存器都应该可以被复位;
、用户自定义原件( 元件)是不能被综合的。
一:基本
中的变量有线网类型和寄存器类型。线网型变量综合成 ,而寄存器可能综合成 ,锁存器和触发器,
还有可能被优化掉。
二: 语句结构到门级的映射
、连续性赋值:
连续性赋值语句逻辑结构上就是将等式右边的驱动左边的结点。因此连续性赋值的目标结点总是综合成由组合逻辑驱
动的结点。 语句中的延时综合时都将忽视。
、过程性赋值:
过程性赋值只出现在 语句中。
阻塞赋值和非阻塞赋值就该赋值本身是没有区别的,只是对后面的语句有不同的影响。
建议设计组合逻辑电路时用阻塞赋值,设计时序电路时用非阻塞赋值。
过程性赋值的赋值对象有可能综合成 !"# 和 $%&$%,取决于具体状况。如,时钟控制下的非阻塞赋值综合
成 $%&$%。
过程性赋值语句中的任何延时在综合时都将忽略。
建议同一个变量单一地使用阻塞或者非阻塞赋值。
、逻辑操作符:
逻辑操作符对应于硬件中已有的逻辑门,一些操作符不能被综合:'''、(''。
、算术操作符:
中将 视为无符号数,而 " 视为有符号数。因此,进行有符号操作时使用 " 使用无符号操作
时使用 。
、进位:
通常会将进行运算操作的结果比原操作数扩展一位,用来存放进位或者借位。如:
!)*+,! -.
!)*+,!/.
!/'0-.
/ 的最高位用来存放进位。
、关系运算符:
关系运算符:1 2 1' 2'
和算术操作符一样,可以进行有符号和无符号运算,取决于数据类型是 ," 还是 "。
、相等运算符:'',!'
注意:'''和!''是不可综合的。
可以进行有符号或无符号操作,取决于数据类型
、移位运算符:
左移,右移,右边操作数可以是常数或者是变量,二者综合出来的结果不同。
3、部分选择:
部分选择索引必须是常量。
+、-4 选择:
-4 选择中的索引可以用变量,这样将综合成多路(复用)器。
、敏感表: 过程中,所有被读取的数据,即等号右边的变量都要应放在敏感表中,不然,综合时不能正确
1
地映射到所用的门。
、5:
如果变量没有在 5 语句的每个分支中进行赋值,将会产生 "#。如果 5 语句中产生了 "#,则 5 的条件中最好不
要用到算术操作。/ 语句类似。/ 的条款可以是变量。
如果一个变量在同一个 5 条件分支中先赎值然后读取,则不会产生 "#。如果先读取,后赎值,则会产生 "#。
、循环:
只有 &% 语句是可以综合的。
、设计时序电路时,建议变量在 语句中赋值,而在该 语句外使用,使综合时能准确地匹配。建议
不要使用局部变量。
、不能在多个 块中对同一个变量赎值
、函数
函数代表一个组合逻辑,所有内部定义的变量都是临时的,这些变量综合后为 。
、任务:
任务可能是组合逻辑或者时序逻辑,取决于何种情况下调用任务。
、6:
6 会综合成一个三态门,必须在条件语句中赋值
3、参数化设计:
优点:参数可重载,不需要多次定义模块
四:模块优化
、资源共享:
当进程涉及到共用 7 时,要考虑资源分配问题。可以共享的操作符主要有:关系操作符、加减乘除操作符。通常
乘和加不共用 7,乘除通常在其内部共用。
、共用表达式:
如:/'0-.
8!8!'90:0-;.
两者虽然有共用的A+B,但是有些综合工具不能识别.可以将第二句改为:'90/;这样只需两个加法器.
、转移代码:
如循环语句中没有发生变化的语句移出循环.
、避免 "#:
两种方法:、在每一个 5 分支中对变量赋值。、在每一个 5 语句中都对变量赋初值。
:模块:
综合生成的存储器如 <= 或 = 不是一种好方法,只是成堆的寄存器,很费资源。最好用库自带的存储器模块。
五、验证:
1、敏感表:
在 语句中,如果敏感表不含时钟,最好将所有的被读取的信号都放在敏感表中。
2、异步复位:
建议不要在异步时对变量读取,即异步复位时,对信号赋以常数值。
verilog
的流行 有两方面的原因.
-! 与 VHDL
相比的优点
/ 典型的 模块
! 语法要点
;! 的流行 有两方面的原因*
它是 #># 的模拟器 &?7 的基础 #># 的广泛流行使得 在 3+ 年代深入人心.
它在硅谷获得广泛使用.
-;! 与 @7 相比的优点二者的关系仿佛 / 与 5<4A 具体而言*
2
! 的代码效率更高*
8比较明显的对比*
@7 在描述一个实体时采用 ""B#"#"C 模式
在描述一个实体时只需用一个DE>CB>CE>CD语句块F
此外 的高效性还在很多地方体现出来.
! 支持二进制的加减运算*
@7 在进行二进制的加减运算时使用 #GHHH函数或者进行其他的定义 总之必须通知编译器. 直接用形
如D#'0ID的表示二进制的加减运算.
综合时可控制性好*
@7 对信号不加区分地定义为DD
而 区分为 " 类型的和 类型的.
但是也有人支持 @7 认为 和 @7 的关系仿佛 / 和 /00F/;典型的 模块
讨论以下典型电路的 描述*
H与非门.
H加法器.!!BB即全加器
H! 触发器.
H计数器.!BBHH分频的 #C"
H!"#.
H时序机.
H=.!!!BB用 % 的
H模块引用.
H预编译.
H与非门的 描述如下*
BB 使用和 / 语言相同的注释方法
E>C!>+: J;.BB 一 个 模 块 总 是 以 E>C 开 始 以 >E>C! ! ! 结 束 >+ 是 模 块
名 J 是模块的 个输入输出信号
%C"! .8!BB告诉编译器 对此模块而言是输入 并且数据类型是DI"D
C"%C"!J.8!BB告诉编译器 J 对此模块而言是输出 数据类型也是DI"D
>8!:J ;.!BB我理解 > 是运算符 我们不必深究 中的正式术语是什
么了吧,总之这种形式表示 J'K:!LL!;.你一定已经想到类似的运算符还有D"D D>D DD DD DMD了
吧.除了D"D 括号里的信号数可以任意 例如 8:J ;表示 J'!NN!!NN! 并且延时是 个单位时间,OM 表示延时
M 个单位时间.
>E>C
H加法器的 描述如下*
E>C!>+>: - / P /<;!.
%C"!)*+,! -.8!BB表示 - 是输入信号 并且是 位矢量 上界是 下界是 +
%C"!/.
C"%C"!)*+,!P.
C"%C"!/<.
!Q/< PR'0-0/.BB一对DQD和DRD表示链接 即将 /< 和 P 合并成 位矢量
>E>C
H带异步清零端的 触发器的 描述如下*
E>C!>#"I!:> #% #> S S;.
%C"!> #% #>.
C"%C"!S S.
3
!S S.888!BB关键字DD表示 S 和 S 是D"D类型的信号. 中有两种类型的信号*D"D类型
和DD类型F你可以简单地把 " 类型的信号想象为某个 触发器的输出 而 类型的的信号是组合逻辑的
输出F二者的最大区别在于*你可以对 " 类型的信号进行定时赋值:用 " 语句在特定时刻的赋值 详见下面
语句; 而对于 类型的信号则不可F
!"!:#>''+;!BB表示每当 #>'+ 时 将要对 触发器清零 DD和D"D嵌套,D"D和DTD是
的 两 个 关 键 字 表 示 一 旦 有 某 事 发 生 ; 则 执 行 下 面 的 语 句 块 DD 有 点 象 / 语 言 中 的 D!FFF
"FFFD,D"D和DTD的区别*请参考本模块F" 表示本语句块的进程停止 直到D#>'+D的条件出现才继续;我理
解在 中 每个最外层语句块都是一个HHH的进程.DTD:请看下个 语句;也表示本语句块的进程停止 直到
后面定义D%>!#%D:即出现 #% 的上升沿;的事件出现才继续.也许 " 和T可以合二为一吧 但至少到目前
中 " 表示D条件D T表示D事件D.具体运用中 " 总是用于类似D":MMM';D之类的场合 T总是用于类
似DT:MMM;D或DT:%>B>!MMM;D之类的场合整句话的意思是D每当 #> 等于 + 时 则作以下事情D
I8888!BBIFFF> 结构的用法类似于 %# 语言
888888!S'+.
88888888!S'.
8888888!"!:#>'';.
>
!T!:%>!#%;BBDT:%>!#%;D中有两个关键字*DT!:M;D表示D每当事件 M 发
生D D%>!MD表示DM 的上升沿 D>!MD表示DM 的下降沿D,整句话的意思是D每当 #% 的上升沿 则作以下事
情D
8888888!!:#>;8!BB如果 #>':意味着清零端无效;
8888888!I
8888888888888888!S'>.
8888888888888888!S'KS.BBDKD表示反相
8888888!>
>E>C
H计数器的 描述如下*
E>C!#C": " #% C";!.BB此计数器 在 #% 的上升沿将输入赋给输出 在 #% 的上升沿使输出加一
%C"!)*+,!.
%C"!" #%.
C"%C"!)*+,!C".
!)*+,!C".
!T!:%>!";
8C"!'!.
!T:%>!#%;
8C"!'!C"0.8!BB 容许一个信号同时出现在等号两端 只要它是 类型的
>E>C
H"# 的描述如下*
!T:#U!!>;
888!!:#U;!S!'!>.
H时序机的 描述如下*
!T:%>!/7V;8!BB 是下一个状态 W 是当前状态 是输入 I 是输出
W'.
!T:W!!"#;!I!BB当 W 变化或输入 变化时 要相应变化
!'!W.!BB"
4
!'!+.
I!'!+.
FFFFFF
#:W;
8!S*I
88!S!#".
88!:;'>.
88!:;'>.
88!!'>.
88!!'!.!BB"!
88!>
8!S*I
88!I!'!.
88!FFFFFF
88!>
8!>C"*I
88!!'!+.
88!I!'!+.
88!FFFFFF
>
>
&&&""&&&
"!*
8!4!!!#C"E!M% "!" !C>!I!SC!"!W.
"!*
8!!"!""!E# !!!SC!"!!"!""!S
8!"!"" !!SC!"!+.
H!= 的 描述如下*
E>C!E:> >C" C" > ;.BB这是一个双口 = 分别有*输入端*输入地址 .输入数据 >.上升沿有
效的写信号 .B输出端*输出地址 C".输出数据 >C".高电平有效的读信号 >.
8!C"!)*+,!>.
8!%C"!)*+,! C".
8!%C"!> .
8!C"%C"!)*+,!>C".
8!!)*+,!EE!)+*,.88!BB请注意这是存储阵列的描述方法 描述了一个共有
个字的存储阵列 每个字是 位
8!!>C"!'!>!X!EE)C",!*!YIJ.!BBDD关键字表示并行赋值语句的
开始DXD运算符的作用和在 / 语言中一样DYIJD是一个常量 表示一个字节的高阻态 其中 表示长度是 I" DYD是固定
分割符 DID表示后面的数据是以比特形式给出的 DJD表示高阻.举例*Y 表示长 I" 的数D++D。类似的还可举出
YI+ Y 等等
8!!T:%>!;
EE),!'!>.
>E>C
H模块引用
假设在前面:可以是别的模块;定义了 E>C!E:> >C" C" > ; 则引用此
模块时只需写
E!EE:>GGE% GGE% >C"GGE% C"GGE% >GGE% GGE%;
.
5
剩余39页未读,继续阅读
资源评论
wcxasd
- 粉丝: 0
- 资源: 10
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功