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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
转——凔海笔记之FPGA(四):Verilog HDL语法简单述
2 Q& o3 V4 v- p6 x
- P0 w6 j8 U: X1 j
    在百度百科中,是这样介绍Verilog HDL的,它是一种硬件描述语言(HDL:Hardware Description Language),以文本形式来描述数字系统硬件的结构和行为的语言,用它可以表示逻辑电路图、逻辑表达式,还可以表示数字逻辑系统所完成的逻辑功能。 Verilog HDL和VHDL是世界上最流行的两种硬件描述语言,都是在20世纪80年代中期开发出来的。记得在刚接触FPGA时,还不知道有一种语言叫做VHDL,只是傻傻的跟着特权同学去入门,还好选对了语言入对了门,感谢吴厚航老师。% a; [/ j6 f, j9 a5 a
       古人云:“工欲善其事,必先利其器”。对于我们来说,若要拿下FPGA,必先克下Verilog。但若苦学语法而不用,也会因利器而误事。所以,咱先知道点就好啦,说多了,也不敢,毕竟菜鸟我不会/(ㄒoㄒ)/~~ $ r2 b' n$ x( _
1、模块声明:module……endmodule8 {, _3 e8 ~& E) B* ^% x: W) s* A
module:模块。endmodule:模块结束。显然,这之间要写的是一个模块的内容,也就是Description模块功能。module后面要跟着这个模块的名称,它是模块的标签,格式是这样的:
$ J: L: C4 y0 v8 F: Omodule 模块名(口1,口2,口3,口4, ………);括号里面的内容就是输入或输出信号的端口声明。一般一个.V文件里面放一个模块。Why?
/ u+ ^! |% }/ |# j3 \: A  X
This is coding style!!!
2、端口声明:input、output、inout。
) U( H1 f" B/ K5 p& f! Kinput :输入。output:输出。inout:输入输出。如果把模块看成一个黑匣子,那么端口声明就是与外界连接的引线。所以在写模块内容时候,先要定义输入什么,输出什么。我们所做的就是对输入信号的处理及对输出信号的表述。
1 y. L, m, G* o1 N2 Q
3、信号类型:wire、reg。. b1 d' V7 q( I/ V
wire:线。reg: register,寄存器。网上有这么一句话,“reg相当于存储单元,wire相当于物理连线”,如果理解了这句话,我想也就理解了这俩个信号类型。wire表示直通,即输入有变化,输出马上无条件地反映(如与、非门的简单连接)。reg表示一定要有触发,输出才会反映输入的状态。但我还是没理解(⊙﹏⊙)b,就先这样吧,这个需要去悟。声明一下哈,信号类型不止这俩个,其他的碰到了再说吧,(*^__^*) 嘻嘻……。
: b5 d' V2 G& v在书写的时候,. ?) Q/ g& D* Q/ Z
wire  c;  //定义一个一位wire型数据
9 G* ~" O5 I8 d! yreg  c;  //定义一个一位名为a的reg型数据4 x% d2 O7 i$ P. }% Q  R* x
wire [7:0] b; //定义一个八位的wire数据* w' e3 i- n% t$ j
reg [7:0] b; //定义一个八位的reg数据
1 j) g6 o) n& `4 Y8 A( H其中。[7:0]表示位宽,只要是整数就好,当然分号左边的数要大于右边的。
' L* @0 v9 }6 y5 h/ _
* c) \! P3 Q$ L% }: P7 l9 |: [/ u
4、参数定义:parameter
& u3 Y5 K7 y4 B6 Vparameter:参数,百度有这样翻译:“参数,传送到功能或程序并影响其操作的值”。说实话,我对这个翻译爱得很深沉,(✿◡‿◡)。值得一提的是,parameter的作用域仅限于该文件,而与之相对的define确因编译器不同会产生不同的效果,所以,在一般情况下,用parameter吧,如果用define还是在该文件的结尾加上一个undef。
3 q6 m$ g( I9 d. ?& e
1 h  a. p: q, z8 y" }  d
5、常量。
) G& y5 ?6 O8 T学过C语言都知道,常量表示方法有很多种,二进制B、八进制O、十进制D、十六进制H。对于Verilog语言,同样有这几种表示方法,其书写格式可以为<位宽><进制><数字>,4’b1101即为用二进制表示位宽为4的数1101;可以为<进制><数字>这样缺省位宽,由机器系统决定,说实话,我是受不了这样的写法;也可以为<数字>这种表示方法,缺省进制默认十进制。其实无论用那种表示方法,都是为了能够很好地描述所写模块,软件都会给翻译成二进制表示,毕竟机器只有高低电平。
7 ~% H6 C) }" [# V" l! K- \3 {$ l* J; A, W- _$ C& L
6、连续赋值:
( @) ]( J( ~8 X5 U" Q7 s6 G. C: }assign。我认为它就是连接内部小模块之间或是模块与外界联系的线的标志。嗯,就这样; ]7 F' S. l& K2 e, Q  N
; t2 j0 y2 Y9 V0 I, U4 q8 [2 C& c
7、always模块:' ^6 n/ w6 H8 g; L. j! \! U8 k: Q
always@(敏感事件列表) 用于描述时序逻辑. ?0 d7 u6 T9 q4 H6 @6 d
敏感事件上升沿 posedge,下降沿 negedge,或电平
- L4 i8 A% r- q1 T7 ?3 j( I敏感事件列表中可以包含多个敏感事件,但不可以同时包括电平敏感事件和边沿敏感事件,也不可以同时包括同一个信号的上升沿和下降沿,这两个事件可以合并为一个电平敏感事件。
7 G& v  V! k% D' h/ F3 ^" g0 U在新的verilog2001中“,”和“or”都可以用来分割敏感事件了,可以用“*”代表所有输入信号,这可以防止遗漏。
2 ^, J* u$ Z& \( y& G8 W- e合法的写法:2 e  c( C* m2 `! b7 W
always@ *" ?  J( A! z: t
always@ (posedge clk1,negedge clk2)2 ~* p, U6 h1 x9 d; {0 X! g) q9 Z
always@ (a or b), h5 r0 m7 g  H2 I

. C; r9 |1 `# }5 j* ^
8、begin……end
. C5 S3 w* `$ m8 `% H这个吧,就把它当做C语言里面的{}吧# m. k5 r5 {% K# e& T

- q: U: s8 U. a% G) k- f  q. d9、赋值符号:=和<=
% k3 J& J1 _" K( {        这个被称为阻塞赋值和非阻塞赋值,这个可是很有说头的,不过,咱就先知道
2 y* Y6 l: X! a/ \1 Qa=a+1;
( ^* i( {& t3 F% B5 z* Y. y% rb=b+1;
5 \1 l( T5 ?5 W5 U2 k& pc=c+1;
$ ^+ F! |4 w9 u; b, T! ~. H这都是顺序执行的,和C语言一样。但* v5 ^. O) y! P
a<=a+1;
3 g* m3 B1 J/ G9 [6 f6 wb<=b+1;
& c$ B4 q* X5 Ec<=c+1;
, r  A( g4 E+ O* v1 b是并行的,是同时工作的,很神奇呀,为啥??以后再谈~
* M, K' @+ I) B9 n0 q不过我们在always@(*)块语句内的赋值符号使用的是“=”,而always@(posedge XXX)的块语句内的赋值符号使用的是 “<=”& }! U; E0 h) f* X  ^
% ^+ o+ h* p/ z4 R
10、运算符及表达式
# M/ I3 L# g- A) Q 4 Q0 l' ~! O% s% G* z' A$ z) \
注:摘自夏宇文老师的书
% ?; K$ m2 \' f1 h) m

该用户从未签到

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

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-10-8 20:45 , Processed in 0.125000 second(s), 23 queries , Gzip On.

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

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

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