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

Verliog语法基础

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
本帖最后由 AustCor1 于 2022-4-26 09:44 编辑
! M+ m5 }6 e9 P, T5 {$ I* m
2 w- O% d! V) |/ c- |
基本的语法略过,主要想写一些关于框架,规范,技术难点的博文,这样对于我们养成好的编码习惯是有好处的,就定这样一个flag吧.希望大家可以一起好好学习,共同进步.
0 f' i$ o1 Y# p# E

' g9 }& }- V4 H& P  F- @0 ^
接口时序设计规范0 w8 s9 O- U" }, K* c% I" |
    模块和模块之间的通过模块的接口实现关联, 因此规范的时序设计, 对于程序设计的过程, 以及程序的维护, 团队之间的沟通都是非常必要的。

, k) P/ k3 u/ e' ~
命名规则
# _/ d: Q& ^/ |% L
1、 顶层文件
6 d- K! b! o0 V  u( ^对象+功能+top
" }) X! t- b! x$ W! K& d比如:video_oneline_top
' H# W' J, M( F# K

5 o; v6 w) M6 H+ T5 H: U
2、 逻辑控制文件. u; a. a5 G6 a; n
介于顶层和驱动层文件之间% W+ V- ]' x8 w) B3 A. k
对象+ctr: I' l3 o* g4 L! T7 e+ O
比如:ddr_ctr.v

# m% Y8 b: s7 W" h
3 e* F' p$ P# I  u) P: \
3、 驱动程序命名
8 G5 N/ O4 E1 t* O/ @4 J" o对象+功能+dri
/ Q& W* X0 z' k% H( @0 a/ K/ ?比如:lcd_dri.v、 uart_rxd_dri.v

: ?: x- |9 K; s( r2 f4、 参数文件命名6 x1 B" ]; V$ i2 s
对象+para' \2 q3 Z( I" s8 l& [
比如:lcd_para.v

5 O6 R2 R! q/ N" S% _7 {! d5、 模块接口命名:文件名+u( ?( d! |. `7 l6 H& o! G
比如 lcd_dir lcd_dir_u(........)

+ N) k/ Q, B. {0 Y6 ]% _4 X6、 模块接口命名:特征名+文件名+u) V# ]- N2 l1 m5 b5 d8 H
比如 mcb_read c3_mcb_read_u

" M9 R* N( H6 E2 s& I7、 程序注释说明
  k" u; D* G5 f8 I
  • /*****************************************************************/
  • // 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
  • /*****************************************************************/
    - U. q; n0 N3 y/ `+ f$ a+ `- Y

$ J9 o$ w9 }" x. o* H
8、 端口注释' @  a6 V( ~+ A6 E
input Video_vs_i,//输入场同步入
& @; i/ R$ O/ B5 V6 Q, ^* g' P
9、 信号命名4 u. @- D/ h6 Q# y: W9 ^& q
命名总体规则:对象+功能(+极性) +特性

$ ^2 c$ |7 n! j/ B3 \8 N10、 时钟信号
# M. P. [6 p8 [/ g8 O3 K* d对象+功能+特性  U+ X1 N+ ?+ p+ x7 B3 C7 l
比如:phy_txclk_i、 sys_50mhz_i

1 {' ^3 r, q2 ?+ W11、 复位信号
3 X2 k9 x, s" O1 W( c7 g对象+功能+极性+特性, ~- A, |: a. c
比如:phy_rst_n_i、 sys_rst_n_i
  X2 I9 k" L8 _4 o  D  P
12、 延迟信号" `2 z. J9 A4 t5 M9 h, r
对象+功能+特性 1+特征 21 X7 m3 F5 d+ v9 v" r. v
比如:fram_sync_i_r0、 fram_sync_i_r1
1 T2 I6 o4 ]1 t+ ~; B
13、 特定功能计数器
+ V2 B7 m* ]5 P, Q# K* C9 J% ]
对象+cnt
' s6 L2 H$ J5 ?/ w比如:line_cnt、 div_cnt0、 div_cnt1
/ A: B+ m+ \1 d( e, m功能+cnt
1 |$ y9 Q; k8 K, R) L. K. p4 ?比如:wr_cnt、 rd_cnt
# J2 L& E1 {7 a) X对象+功能+cnt* Z% p; q% h: S8 d; A) o8 s* V
比如:fifo_wr_cnt、 mcb_wr_cnt、 mem_wr_cnt
- I; w& _1 k/ P6 x* R& t& U对象+对象+cnt) i* r& [$ `  O+ h
比如:video_line_cnt、 video_fram_cnt
/ H5 @4 }9 x! p7 }) o3 M& V% Q2 N+ F/ \
14、 一般计数器
! u, a5 \7 w/ a; o! P# j4 f' J6 ucnt+序号4 q0 ^! n1 p# H" f
用于不容易混淆的计数' C& H5 d4 ~, L" G5 _3 x0 A: S. ^
比如:cnt0、 cnt1、 cnt2

4 x: I5 z1 n4 ?5 z15、 时序同步信号( J. ~7 L" |" v& J
对象+功能+特性) W- }  v# g& a, T, G+ _4 Q8 F5 h
比如:line_sync_i、 fram_sysc_i
# j9 U; H0 B+ g9 h
16、 使能信号& D% Q/ p/ g4 g: `: f5 t# ]
功能+en1 r5 l. {  z7 W: V+ y7 A3 J5 G
比如:wr_en、 rd_en
! L$ E5 Q9 C% }& D对象+功能+en3 Q0 C! j2 B2 l
比如:fifo_wr_en、 mcb_wr_en
) s, P: V: }$ ~: k
& a0 k3 Z; I9 j. i/ k! _1 \
Verilog 最最基础语法4 o# n: d: G* k
C 语言和 Verilog 的关键词和结构对比:
, c6 j2 C' s% M0 r5 G9 p
4 e* F+ W' a, E* F
C 语言和 Verilog 运算符对比:

; n+ W  f0 k1 E- |关键字
信号部分:8 l, X' w4 s1 I! D  c1 A' t% q
input 关键词, 模块的输入信号, 比如 input Clk, Clk 是外面关键输入的时钟信号;
; d# s' A; f; H5 l: n
output 关键词, 模块的输出信号, 比如 output[3:0]Led; 这个地方正好是一组输出信号。其中[3:0]表示 0~3 共 4 路信号。
( J8 e, m' H) l
inout 模块输入输出双向信号。这种类型, 我们的例子 24LC02 中有使用。数总线的通信中, 这种信号被广泛应用;
. l1 z1 g3 R/ o, T' d8 X+ T6 s
wire 关键词, 线信号。例如:wire C1_Clk; 其中 C1_Clk 就是 wire 类型的信号;
2 d% ?/ S  H4 I* Z7 A3 W
线信号,三态类型, 我们一般常用的线信号类型有input,output,inout,wire;
" y1 v( x6 @* ?1 }. m
reg 关键词, 寄存器。和线信号不同, 它可以在 always 中被赋值, 经常用于时序逻辑中。比如 reg[3:0]Led;表示了一组寄存器。( F1 Z" w+ ^" r6 }+ ^& \; o7 Q

% S$ U/ j. X* C# z% T5 D
结构部分:

' Y+ }% Y2 T% W. f2 D) N" m
  • module()
  • … en
  • dmodule
    ( E- H, l. B0 A
) d& N9 v7 j7 W/ c0 C
代表一个模块, 我们的代码写在这个两个关键字中间. `4 X' ]( N2 |  m  o: a
    always@()括号里面是敏感信号。这里的 always@(posedge Clk)敏感信号是 posedge Clk 含义是在上升沿的时候有效, 敏感信号还可以 negedge Clk 含义是下降沿的时候有效, 这种形式一般时序逻辑都会用到。还可以是*这个一符号, 如果是一个*则表示一直是敏感的, 一般用于组合逻辑。/ v0 }9 \; x. S3 G
    assign 用来给 output,inout 以及 wire 这些类型进行连线。assign 相当于一条连线, 将表达式右边的电路直接通过 wire(线)连接到左边, 左边信号必须是 wire 型(output 和 inout 属于 wire 型) 。当右边变化了左边立马变化, 方便用来描述简单的组合逻辑。
2 d  q# r; P, L& ~

& S1 [4 S4 t5 q: d; M
符号部分:. D8 t" X: X; U0 U# q4 @; P
    这里重点讲解一下“<=” 赋值符号,非阻塞赋值 ,“=” 阻塞赋值,“{}”
. k7 j4 b( u1 n9 B“<=” 赋值符号, 非阻塞赋值, 在一个 always 模块中, 所有语句一起更新。它也可以表示小于等于, 具体是什么含义编译环境根据当前编程环境判断, 如果“<=” 是用在一个 if 判断里如:if(a <= 10);当然就表示小于等于了。

3 \4 ?' ]# a5 E  z& t
    “=” 阻塞赋值, 或者给信号赋值, 如果在 always 模块中, 这条语句被立刻执行。阻塞赋值和非阻塞赋值将再后面详细举例说明。) P" ?3 A/ E( ]7 a) y$ q+ _: ~
3 ]5 S0 r( u0 o, L) `
    “{} ” 在 Verilog 中表示拼接符, {a,b}这个的含义是将括号内的数按位并在一起, 比如:{1001,1110}表示的是 10011110。拼接是 Verilog 相对于其他语言的一大优势, 在以后的编程中请慢慢体会。 2 ]* N* }/ G2 @. g% p. V$ H) N0 w

- u' A4 B! F, L$ T+ j( }  T; D
参数部分:
) f' h. Z2 j: _* ]9 S1 M( j6 xparameter
2 i/ @7 P% l; a( g2 u3 E1 f# E3 C$ ~3 [- ~
  • parameter a = 180;//十进制, 默认分配长度 32bit(编译器默认)
  • parameter a = 8’d180;//十进制
  • parameter a = 8’haa; //十六进制
  • parameter a = 8’b1010_1010; //二进制9 f6 w4 \2 r$ N) I$ _

. j; s& ^. J$ O+ d9 h% l$ o8 i+ Q  {0 j1 u/ a9 d! T
预处理命令0 v, f$ B( X8 f1 F
# A& _/ K: X4 I( f
  • `include file1.v
  • `define X = 1;
  • `deine Y;
  • `ifdef Y
  • Z=1;
  • `else
  • Z=0;
  • `endif
    " k( d& H) _2 k* V, ]
1 D" N+ w' X# m& \3 R8 }. l/ ], U

# {0 p, v5 A6 Q1 t2 i
Verilog 中数值表示的方式
" s1 M) B6 C, Y3 U- Z1 f: w# p
    如果我们要表示一个十进制是 180 的数值, 在 Verilog 中的表示方法如下:
- J! F' R% G- n. I4 D, w( ~二进制:8’ b1010_1010; //其中“_” 是为了容易观察位数, 可有可无。
7 N7 p  l1 k# }6 N, A- ^9 r十进制:8’ d180;! \$ ]& o/ m9 |4 ]! i4 \& X
16 进制:8’ hAA;2 ~$ K* |( V' u9 l% K
+ B  E. ^- Y2 \, c8 |1 }( G6 h
    讲到这里, 具备这些基础知识, 需要通过代码来学习Veriog 语言。最后, 笔者提一点建议, 学习 Verilog 多看别人写的优秀的代码, 多看官方提供的代码和文档。其中官方提供的代码, 很多时候代表了最新的用法, 或者推荐的用法。读者学习, 首先把最最基础的掌握好, 这样, 在项目中遇到了问题, 也能快速学习, 快速解决。
    对于理论知识的学习, 没必要一开始就研究得那么深刻, 只是搞理论学习, 对于学习Verilog 语言, 或者 FPGA 开发是不实际的, 要联系理论和实践结合。多仿真, 多验证, 多问题, 多学习, 多改进.
+ }) d6 F) s1 [5 D2 n

该用户从未签到

2#
发表于 2022-4-26 13:12 | 只看该作者
我也在学习这个,有没有好的学习路径。0 w& ?& `7 v% ]% w' D; {0 ?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-11-5 15:24 , Processed in 0.156250 second(s), 26 queries , Gzip On.

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

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

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