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

Verliog语法基础

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
本帖最后由 AustCor1 于 2022-4-26 09:44 编辑 2 P* w) H0 n' o; S+ ?

) c3 E* h; d5 R4 u6 n: f
基本的语法略过,主要想写一些关于框架,规范,技术难点的博文,这样对于我们养成好的编码习惯是有好处的,就定这样一个flag吧.希望大家可以一起好好学习,共同进步.  h3 w: O- K! N5 f
0 b# [3 `$ k& y$ A: [
接口时序设计规范
) G7 ^2 W2 i7 b( o( ?    模块和模块之间的通过模块的接口实现关联, 因此规范的时序设计, 对于程序设计的过程, 以及程序的维护, 团队之间的沟通都是非常必要的。

3 E/ g2 T7 `; v& X
命名规则
. n. o; M( R9 _0 N6 U. R& K7 n
1、 顶层文件
" p% y9 c& M  Q! u" I% p/ p1 f& F对象+功能+top
$ Q/ G' r" b3 m" V% m比如:video_oneline_top
; D. a& n. p# `' R; f4 d! O9 U( l# O

; }: d/ C  J# g: P
2、 逻辑控制文件
$ E) e" @% q( @5 h! w: B9 r介于顶层和驱动层文件之间' W  ?. B# F! _+ o9 T
对象+ctr. V5 a6 O4 v8 a% Y
比如:ddr_ctr.v

8 P5 k8 u9 n: ~8 m- j8 X$ b

+ i" V: J0 L, E6 n9 H- y$ w! f2 g3、 驱动程序命名
) y7 t: B' T, }: ]- v$ a& b对象+功能+dri$ C3 ]; A4 p9 R( m0 {3 ~
比如:lcd_dri.v、 uart_rxd_dri.v
4 L3 z9 N9 z- s2 H  b2 L8 r
4、 参数文件命名
3 b, F7 Z% k. N4 z0 O对象+para
; `5 h: E4 n+ P& c3 }" d: n比如:lcd_para.v
2 v! N2 Z8 Y0 r( x( \; S  \# B. U
5、 模块接口命名:文件名+u
+ X" j  j% m7 T; l比如 lcd_dir lcd_dir_u(........)

) R5 }! G/ I1 Y; f8 s: m6、 模块接口命名:特征名+文件名+u, p. ]: O5 O( m$ I( L' s
比如 mcb_read c3_mcb_read_u

& [' P% a' V3 b+ j) A, r- P7、 程序注释说明
7 Y$ x" Z0 S- i9 v1 C/ \7 `$ ~! y
  • /*****************************************************************/
  • // Company:
  • // Engineer:
  • // WEB:
  • // BBS:
  • // Create Date: 07:28:50 07/31/2019
  • // Design Name: FPGA STREAM
  • // Module Name: FPGA_USB
  • // Project Name: FPGA STREAM
  • // Target Devices: XC6SLX16-FTG256/XC6SLX25-FTG256 Mis603
  • // Tool versions: ISE14.7
  • // Description: CY7C68013A SLAVE FIFO comunication with fpga
  • // Revision: V1.0
  • // Additional Comments:
  • //1) _i input
  • //2) _o output
  • //3) _n activ low
  • //4) _dg debug signal
  • //5) _r delay or register
  • //6) _s state mechine
  • /*****************************************************************/
    " P0 h- p2 H4 H6 H. f4 A* k' V

8 X8 Q% O3 T9 f, l: W
8、 端口注释
5 P+ c6 x' b( n& c* Kinput Video_vs_i,//输入场同步入

  m6 v% V. J& Y2 Z9 `; O9、 信号命名
% e7 @7 c% x: v- {命名总体规则:对象+功能(+极性) +特性
( B1 @: u7 f" A& n7 V8 V4 {$ J& F
10、 时钟信号1 \$ `" o- t) f) v4 V: y
对象+功能+特性. E6 D6 K: s& O3 F7 ]
比如:phy_txclk_i、 sys_50mhz_i
" I" ]3 t* w- j+ Q7 B9 i
11、 复位信号: @+ ?: A1 Z! z1 f, _, B5 |
对象+功能+极性+特性1 f: K! U) j" \0 T8 J! [" U1 [6 _5 l+ Y
比如:phy_rst_n_i、 sys_rst_n_i
8 Y4 _/ |0 W: j# h& b6 w( S
12、 延迟信号& A2 G) t. m9 C& A. o- E
对象+功能+特性 1+特征 2
$ e8 E: b3 v$ @7 {; ^4 Y比如:fram_sync_i_r0、 fram_sync_i_r1

/ U1 U" j6 m1 B' V13、 特定功能计数器( z  g* }0 O+ j$ D/ {8 @( ~
对象+cnt
' X" g1 Z/ A; @$ n0 [" n. B& S" G比如:line_cnt、 div_cnt0、 div_cnt1; w( @) i2 f; N
功能+cnt2 ~& E5 x# Z+ z  k) D
比如:wr_cnt、 rd_cnt
: D% j3 P5 y. `" P对象+功能+cnt8 Y( G7 A, n9 b! ]
比如:fifo_wr_cnt、 mcb_wr_cnt、 mem_wr_cnt
( S3 U$ Y8 H1 n+ p& J对象+对象+cnt
. h' F1 w# K  f: f9 J比如:video_line_cnt、 video_fram_cnt
9 r* I$ y/ k  p! b3 s, @& I3 V
14、 一般计数器/ U% w: g. c  r
cnt+序号
# H2 J9 A6 u1 q  \用于不容易混淆的计数
: R% o) q/ Z' V5 _比如:cnt0、 cnt1、 cnt2
# q" x& K$ i9 ]. o# C7 |0 `+ w
15、 时序同步信号6 k  N. R' I- `  ~( s* e
对象+功能+特性
% x. J2 p% x) ]9 g比如:line_sync_i、 fram_sysc_i
9 h1 R6 T& a- L
16、 使能信号
* G% ?0 k  i* u5 m; Q" a功能+en+ U7 G) H2 j4 k- g
比如:wr_en、 rd_en
3 r: i! g) I6 V: p对象+功能+en; P1 i! k! Z! |6 v
比如:fifo_wr_en、 mcb_wr_en
5 _) A: y1 s2 U1 U' Q8 x9 E
" ]; y  ?. d  C3 U( z
Verilog 最最基础语法
; \5 r7 d4 z1 k) Y
C 语言和 Verilog 的关键词和结构对比:
/ m" n+ B7 i7 @' Z
. W. \# _8 `* o  b4 a
C 语言和 Verilog 运算符对比:

! z7 q4 g% H2 ~& T; K关键字
信号部分:8 o" J1 S, \% z- W
input 关键词, 模块的输入信号, 比如 input Clk, Clk 是外面关键输入的时钟信号;
  }' p' t8 \5 C8 v  k  |9 M: }4 n
output 关键词, 模块的输出信号, 比如 output[3:0]Led; 这个地方正好是一组输出信号。其中[3:0]表示 0~3 共 4 路信号。

6 j& o# W3 U  a7 H8 q; qinout 模块输入输出双向信号。这种类型, 我们的例子 24LC02 中有使用。数总线的通信中, 这种信号被广泛应用;

5 c) o$ R" x% e5 y! e& x' `2 ~wire 关键词, 线信号。例如:wire C1_Clk; 其中 C1_Clk 就是 wire 类型的信号;

0 h7 h& T+ ^5 I, ?$ k9 E线信号,三态类型, 我们一般常用的线信号类型有input,output,inout,wire;

. y# {3 B+ R8 @- N$ N  ]reg 关键词, 寄存器。和线信号不同, 它可以在 always 中被赋值, 经常用于时序逻辑中。比如 reg[3:0]Led;表示了一组寄存器。2 \7 {9 W8 o& ]+ {$ E0 ]7 G

, @) p' T/ ?0 D9 @; h# C
结构部分:
, \5 {/ j4 A# ]( n& V7 _( i
  • module()
  • … en
  • dmodule; q8 _" l4 B! X1 D  l' s

5 K& e" c" R" D
代表一个模块, 我们的代码写在这个两个关键字中间
7 @* _' A5 R/ e' ~, {8 ]
    always@()括号里面是敏感信号。这里的 always@(posedge Clk)敏感信号是 posedge Clk 含义是在上升沿的时候有效, 敏感信号还可以 negedge Clk 含义是下降沿的时候有效, 这种形式一般时序逻辑都会用到。还可以是*这个一符号, 如果是一个*则表示一直是敏感的, 一般用于组合逻辑。
7 G6 y1 y5 m2 t% ]2 {8 o# K) z    assign 用来给 output,inout 以及 wire 这些类型进行连线。assign 相当于一条连线, 将表达式右边的电路直接通过 wire(线)连接到左边, 左边信号必须是 wire 型(output 和 inout 属于 wire 型) 。当右边变化了左边立马变化, 方便用来描述简单的组合逻辑。
' O% h7 r/ S" E. A. N( N! C3 [( X( I

9 A: C9 z+ \/ d8 \( E
符号部分:9 ~% \% z  S5 K1 `4 U- z
    这里重点讲解一下“<=” 赋值符号,非阻塞赋值 ,“=” 阻塞赋值,“{}”
2 J! u$ `. t. N7 a1 Y“<=” 赋值符号, 非阻塞赋值, 在一个 always 模块中, 所有语句一起更新。它也可以表示小于等于, 具体是什么含义编译环境根据当前编程环境判断, 如果“<=” 是用在一个 if 判断里如:if(a <= 10);当然就表示小于等于了。
& x6 i" t! O. U* f$ s) G
    “=” 阻塞赋值, 或者给信号赋值, 如果在 always 模块中, 这条语句被立刻执行。阻塞赋值和非阻塞赋值将再后面详细举例说明。+ W3 i9 ]; w" O
( g" \% `6 }5 T; \" j, t6 \* x. S
    “{} ” 在 Verilog 中表示拼接符, {a,b}这个的含义是将括号内的数按位并在一起, 比如:{1001,1110}表示的是 10011110。拼接是 Verilog 相对于其他语言的一大优势, 在以后的编程中请慢慢体会。 & ]  E( L0 ^. h# |2 I
# U, i) j4 Q# i( A
参数部分:
- x- M+ I0 x4 y6 w8 J5 ?2 Kparameter

) ^. T9 U% P/ A/ l$ T$ `
  • parameter a = 180;//十进制, 默认分配长度 32bit(编译器默认)
  • parameter a = 8’d180;//十进制
  • parameter a = 8’haa; //十六进制
  • parameter a = 8’b1010_1010; //二进制
    ; ^& G0 g% `: i1 r3 o+ [

9 ~. _- R$ e% s& }
8 j; J+ ]8 E5 [6 j9 i
预处理命令; S" ~) I+ i& d! r
9 h+ z1 ]+ |- T" E1 w
  • `include file1.v
  • `define X = 1;
  • `deine Y;
  • `ifdef Y
  • Z=1;
  • `else
  • Z=0;
  • `endif
    1 R2 J" x; i: {
: I  C6 ^  ^3 f8 S; v
5 U+ [3 S, l8 I" _$ e
Verilog 中数值表示的方式
( o+ a; U( E; {
    如果我们要表示一个十进制是 180 的数值, 在 Verilog 中的表示方法如下:8 |5 {8 Y! q: L. }. a
二进制:8’ b1010_1010; //其中“_” 是为了容易观察位数, 可有可无。
+ I9 ]9 k* ~7 [, o十进制:8’ d180;
' ^6 n) F1 b) ]& I  w1 _16 进制:8’ hAA;. u% b4 r1 h  T
, N& B0 b+ }9 n' @; Y2 ^
    讲到这里, 具备这些基础知识, 需要通过代码来学习Veriog 语言。最后, 笔者提一点建议, 学习 Verilog 多看别人写的优秀的代码, 多看官方提供的代码和文档。其中官方提供的代码, 很多时候代表了最新的用法, 或者推荐的用法。读者学习, 首先把最最基础的掌握好, 这样, 在项目中遇到了问题, 也能快速学习, 快速解决。
    对于理论知识的学习, 没必要一开始就研究得那么深刻, 只是搞理论学习, 对于学习Verilog 语言, 或者 FPGA 开发是不实际的, 要联系理论和实践结合。多仿真, 多验证, 多问题, 多学习, 多改进.

2 `$ {) F9 E5 q; X) q$ _

该用户从未签到

2#
发表于 2022-4-26 13:12 | 只看该作者
我也在学习这个,有没有好的学习路径。
& f4 j4 I3 }- E$ v& y
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-7-27 11:07 , Processed in 0.140625 second(s), 26 queries , Gzip On.

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

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

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