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
posted on 2016-07-21 14:35 KcMeterCEC 阅读(651) 评论(0) 编辑 收藏 举报