找回密码
 注册
关于网站域名变更的通知
查看: 421|回复: 1
打印 上一主题 下一主题

转——凔海笔记之FPGA(四):Verilog HDL语法简单述 

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-4-5 09:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
转——凔海笔记之FPGA(四):Verilog HDL语法简单述

% C  o' m/ l8 @2 x% B9 ~$ [
4 O! j1 S5 c. [$ T  w( q3 O: r    在百度百科中,是这样介绍Verilog HDL的,它是一种硬件描述语言(HDL:Hardware Description Language),以文本形式来描述数字系统硬件的结构和行为的语言,用它可以表示逻辑电路图、逻辑表达式,还可以表示数字逻辑系统所完成的逻辑功能。 Verilog HDL和VHDL是世界上最流行的两种硬件描述语言,都是在20世纪80年代中期开发出来的。记得在刚接触FPGA时,还不知道有一种语言叫做VHDL,只是傻傻的跟着特权同学去入门,还好选对了语言入对了门,感谢吴厚航老师。
) s$ r1 H' d% x8 A# w9 b3 M
       古人云:“工欲善其事,必先利其器”。对于我们来说,若要拿下FPGA,必先克下Verilog。但若苦学语法而不用,也会因利器而误事。所以,咱先知道点就好啦,说多了,也不敢,毕竟菜鸟我不会/(ㄒoㄒ)/~~ ; ^2 z4 ~9 n/ O# c
1、模块声明:module……endmodule
6 q8 A9 ~! H  {, x9 dmodule:模块。endmodule:模块结束。显然,这之间要写的是一个模块的内容,也就是Description模块功能。module后面要跟着这个模块的名称,它是模块的标签,格式是这样的:5 q. t' o% H9 w6 ]
module 模块名(口1,口2,口3,口4, ………);括号里面的内容就是输入或输出信号的端口声明。一般一个.V文件里面放一个模块。Why?
& w+ G, Q0 B& o: v7 L% \
This is coding style!!!
2、端口声明:input、output、inout。
% B" o1 K8 W" D0 Rinput :输入。output:输出。inout:输入输出。如果把模块看成一个黑匣子,那么端口声明就是与外界连接的引线。所以在写模块内容时候,先要定义输入什么,输出什么。我们所做的就是对输入信号的处理及对输出信号的表述。
1 ?# |0 K4 b: Y
3、信号类型:wire、reg。, s1 ]6 m* z& F, x" E1 S* W
wire:线。reg: register,寄存器。网上有这么一句话,“reg相当于存储单元,wire相当于物理连线”,如果理解了这句话,我想也就理解了这俩个信号类型。wire表示直通,即输入有变化,输出马上无条件地反映(如与、非门的简单连接)。reg表示一定要有触发,输出才会反映输入的状态。但我还是没理解(⊙﹏⊙)b,就先这样吧,这个需要去悟。声明一下哈,信号类型不止这俩个,其他的碰到了再说吧,(*^__^*) 嘻嘻……。
: \3 o+ W+ r! M! y! K  W8 n在书写的时候,1 L  [0 |6 c7 P) X7 y- A% I: @1 f+ s' C. a
wire  c;  //定义一个一位wire型数据
1 _0 K2 S* l9 n+ xreg  c;  //定义一个一位名为a的reg型数据
' [9 l6 a0 o( Zwire [7:0] b; //定义一个八位的wire数据
9 k6 ]% c$ f* k! T' G6 ]0 F" areg [7:0] b; //定义一个八位的reg数据" |4 B5 u  a. W9 u( X9 ^6 o) v, T) l
其中。[7:0]表示位宽,只要是整数就好,当然分号左边的数要大于右边的。
6 d+ k0 t; X" r8 [3 k
; O! e, \+ P+ `# ?
4、参数定义:parameter, v( t1 u2 ^# B* z8 h' n& Z* l
parameter:参数,百度有这样翻译:“参数,传送到功能或程序并影响其操作的值”。说实话,我对这个翻译爱得很深沉,(✿◡‿◡)。值得一提的是,parameter的作用域仅限于该文件,而与之相对的define确因编译器不同会产生不同的效果,所以,在一般情况下,用parameter吧,如果用define还是在该文件的结尾加上一个undef。
+ p2 ^+ f8 `  }* i+ K
( Z3 m. j$ Q* s" N2 |3 I% p6 T$ Q
5、常量。+ Q5 h' A8 c( J
学过C语言都知道,常量表示方法有很多种,二进制B、八进制O、十进制D、十六进制H。对于Verilog语言,同样有这几种表示方法,其书写格式可以为<位宽><进制><数字>,4’b1101即为用二进制表示位宽为4的数1101;可以为<进制><数字>这样缺省位宽,由机器系统决定,说实话,我是受不了这样的写法;也可以为<数字>这种表示方法,缺省进制默认十进制。其实无论用那种表示方法,都是为了能够很好地描述所写模块,软件都会给翻译成二进制表示,毕竟机器只有高低电平。
0 }- L; |& I+ Y9 D& d3 o3 o2 }- s9 u2 [& G& t; Q7 b' ?8 Y" r6 \
6、连续赋值:
4 \' R% }* {+ Z) l+ r' m1 Q7 c4 J$ Vassign。我认为它就是连接内部小模块之间或是模块与外界联系的线的标志。嗯,就这样
% }8 {$ `/ l# Y/ F9 h# T
( w* e' y' L- P
7、always模块:
! c- ?, C5 ^% w8 \; v- b2 Dalways@(敏感事件列表) 用于描述时序逻辑3 ^7 F% ]) @& w
敏感事件上升沿 posedge,下降沿 negedge,或电平
8 A9 r' k& T) S& h. C% @敏感事件列表中可以包含多个敏感事件,但不可以同时包括电平敏感事件和边沿敏感事件,也不可以同时包括同一个信号的上升沿和下降沿,这两个事件可以合并为一个电平敏感事件。  t3 G5 \  x& v% ]' ~
在新的verilog2001中“,”和“or”都可以用来分割敏感事件了,可以用“*”代表所有输入信号,这可以防止遗漏。
/ X( @( X* n) c1 Z0 b: N  n& R合法的写法:
4 R* s1 @& w8 R: O% H7 O2 P  t/ Ralways@ *
. L+ A3 G4 Y, Dalways@ (posedge clk1,negedge clk2)
3 |( h) n7 ~' G; valways@ (a or b)
  _# J  r0 }' r0 V5 O& G/ C: i" ]
* G9 j) r8 t, h" ?/ _  Q1 A0 x
8、begin……end" R$ H! [' M2 }1 Q* r1 U! s
这个吧,就把它当做C语言里面的{}吧
/ N' I- [& C/ D0 y8 s
: j5 Z0 @2 U1 h: u" J1 W
9、赋值符号:=和<=
+ L9 _9 O4 v9 J( s        这个被称为阻塞赋值和非阻塞赋值,这个可是很有说头的,不过,咱就先知道
7 ?2 F, O: a( r: s  Y4 ra=a+1;
$ ]( y/ p0 q  K# L5 Q& Hb=b+1;
/ N: @& Y" \, [+ vc=c+1;
; s1 B7 ?6 p% q这都是顺序执行的,和C语言一样。但; @& ~/ k$ n% e; ?4 o  t
a<=a+1;. m" v1 V7 R! }: j! H9 a7 y5 K
b<=b+1;+ L2 K3 n( V5 B
c<=c+1;: j# y; J& R/ I& j9 {' L: Y" n
是并行的,是同时工作的,很神奇呀,为啥??以后再谈~
* T" e6 _& I' C! ]9 @不过我们在always@(*)块语句内的赋值符号使用的是“=”,而always@(posedge XXX)的块语句内的赋值符号使用的是 “<=”
7 H) Y6 R% T% R. ^7 ~, x8 V6 }: j2 ?+ N
10、运算符及表达式
5 v8 k# v7 p& @6 E5 o5 e
! j/ R4 ?( Z0 S) C6 w  y0 L; ^4 x注:摘自夏宇文老师的书4 i1 C& l2 z8 l) n) g3 n# s, F  G

该用户从未签到

2#
发表于 2019-4-8 15:36 | 只看该作者
哈哈哈太生动了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-7-29 22:18 , Processed in 0.125000 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表