Zynq基础——verilog简易规则

命名规则
verilog 中文件及内容模块的命名方式也是依据面向对象的思想命名。

类型 命名方式 实例
顶层文件 对象+功能+top video_oneline_top
逻辑控制文件 对象+ctr ddr_ctr.v
驱动程序 对象+功能+dri

lcd_dri.v

uart_rxd_dri.v

参数文件 对象+para

lcd_para.v

模块接口

文件名+u

特征名+文件名+u

lcd_dir

lcd_dir_u(......)

mcb_read

c3_mcb_read_u

 

端口注释

对象+通道+方向

input video_vs_i

时钟信号

对象+功能+特征

phy_txclk_i

sys_50mhz_i

复位信号

对象+功能+极性+特性

phy_rst_n_i

sys_rst_n_i

延迟信号

对象+功能+特性1+特性2

fram_sync_i_r0

特性功能计数

对象(+功能)(+对象)+cnt

line_cnt

rd_cnt

mem_wr_cnt

video_line_cnt

一般计数器

cnt+序号

cnt0

时许同步信号

对象+功能+特性

line_sync_i

使能信号

(对象)+功能+en

wr_en

fifo_wr_en

关键字
input
设置一个输入信号,如同单片机设置引脚为输入状态一样,只能读,不能写。

output
设置一个输出信号。

inout
设置双向信号,即可写也可读。

wire
线信号,用于连接单元。

reg
寄存器,以位为基本单位存储,可以设置多位。

例如:

reg [1:0] state;//state存储两位

结构
代码块
begin

...

end

与C的大括号用法一样

模块
module [模块名称](输入输出参数)

........

endmodule

模块内部写代码

敏感信号
always@(...)

begin

end

当括号内的信号满足触发时,才执行语句块的内容。

比如:always@(posedge clk)代表clk信号为上升沿时,则执行语句块内容。

分配
assign用于wire类连线,将表达式右边的电路连接到左边,左边随右边变化。

比如:

wire a,b,y;

assign y = a & b;

判断
if(...)

begin

...

end

if(....)

begin

...

end

else if(...)

begin

end

case(...)

....

endcase

符号
verilog大部分符号与C是一样的用法,下面仅说明不同部分。

非阻塞赋值

A <= 1'b1;

非阻塞赋值是同时的,而阻塞赋值时有先后顺序的。

比如:

A <= 1'b1;

B <= 1'b1;

代表同时给A和B赋值

A = 1'b1;

B <= 1'b1;

代表先给A赋值再给B赋值

冒号
用于数组、条件运算、case结构中。

例如:

reg[3:0]led;

代表名为led的reg类型数组,有4个元素。

拼接符
{a,b}代表将括号内的a和b按位并在一起。

例如:{1001,1110}拼接结果为10011110

参数
常量
parameter a = 0;

定义一个名为a的常数,数值为0,占用长度为32位。

对于不同位数使用如下格式:

[wide]'[d/h/b][val];

例如:

parameter a = 8'd180;//8位十进制数,值为180

parameter a = 8'haa;//8位十六进制数,值为aa

parameter a = 8'b1010_1010;//8位二进制数,值为10101010,其中"_",仅仅为了便于观察,可有可无。

预处理
verilog预处理与C很类似,预处理符号使用"`"开头.

注意:

在引用已定义的宏名时,必须在宏名前加上"`"。

例如:

`include file.v  //包含文件file.v

`define  X 1    //定义宏x 值为1

`ifdef X

  z = 1;

`else

  z = 0;

`endif

文章来源:KcMeterCEC