当前位置:首页 > > ZYNQ


基本的语法略过,主要想写一些关于框架,规范,技术难点的博文,这样对于我们养成好的编码习惯是有好处的,就定这样一个flag吧.希望大家可以一起好好学习,共同进步.

接口时序设计规范

模块和模块之间的通过模块的接口实现关联, 因此规范的时序设计, 对于程序设计的过程, 以及程序的维护, 团队之间的沟通都是非常必要的。

命名规则

  • 1、 顶层文件

对象+功能+top

比如:video_oneline_top

  • 2、 逻辑控制文件

介于顶层和驱动层文件之间

对象+ctr

比如:ddr_ctr.v

  • 3、 驱动程序命名

对象+功能+dri

比如:lcd_dri.v、 uart_rxd_dri.v

  • 4、 参数文件命名

对象+para

比如:lcd_para.v

  • 5、 模块接口命名:文件名+u

比如 lcd_dir lcd_dir_u(……..)

  • 6、 模块接口命名:特征名+文件名+u

比如 mcb_read c3_mcb_read_u

  • 7、 程序注释说明

 1/*****************************************************************/  2// Company:  3// Engineer:  4// WEB:  5// BBS:  6// Create Date: 07:28:50 07/31/2019  7// Design Name: FPGA STREAM  8// Module Name: FPGA_USB  9// Project Name: FPGA STREAM 10// Target Devices: XC6SLX16-FTG256/XC6SLX25-FTG256 Mis603 11 12// Tool versions: ISE14.7 13// Description: CY7C68013A SLAVE FIFO comunication with fpga 14// Revision: V1.0 15// Additional Comments: 16//1) _i input 17//2) _o output 18//3) _n activ low 19//4) _dg debug signal 20//5) _r delay or register 21//6) _s state mechine 22/*****************************************************************/ 
  • 8、 端口注释

input Video_vs_i,//输入场同步入

  • 9、 信号命名

命名总体规则:对象+功能(+极性) +特性

  • 10、 时钟信号

对象+功能+特性

比如:phy_txclk_i、 sys_50mhz_i

  • 11、 复位信号

对象+功能+极性+特性

比如:phy_rst_n_i、 sys_rst_n_i

  • 12、 延迟信号

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

比如:fram_sync_i_r0、 fram_sync_i_r1

  • 13、 特定功能计数器

对象+cnt

比如:line_cnt、 div_cnt0、 div_cnt1

功能+cnt

比如:wr_cnt、 rd_cnt

对象+功能+cnt

比如:fifo_wr_cnt、 mcb_wr_cnt、 mem_wr_cnt

对象+对象+cnt

比如:video_line_cnt、 video_fram_cnt

  • 14、 一般计数器

cnt+序号

用于不容易混淆的计数

比如:cnt0、 cnt1、 cnt2

  • 15、 时序同步信号

对象+功能+特性

比如:line_sync_i、 fram_sysc_i

  • 16、 使能信号
    功能+en

比如:wr_en、 rd_en

对象+功能+en

比如:fifo_wr_en、 mcb_wr_en

Verilog 最最基础语法

C 语言和 Verilog 的关键词和结构对比:

C 语言和 Verilog 运算符对比:

关键字

信号部分:

input 关键词, 模块的输入信号, 比如 input Clk, Clk 是外面关键输入的时钟信号;

output 关键词, 模块的输出信号, 比如 output[3:0]Led; 这个地方正好是一组输出信号。其中[3:0]表示 0~3 共 4 路信号。

inout 模块输入输出双向信号。这种类型, 我们的例子 24LC02 中有使用。数总线的通信中, 这种信号被广泛应用;

wire 关键词, 线信号。例如:wire C1_Clk; 其中 C1_Clk 就是 wire 类型的信号;

线信号,三态类型, 我们一般常用的线信号类型有input,output,inout,wire;

reg 关键词, 寄存器。和线信号不同, 它可以在 always 中被赋值, 经常用于时序逻辑中。比如 reg[3:0]Led;表示了一组寄存器。

结构部分:

1module() 2… en 3dmodule

代表一个模块, 我们的代码写在这个两个关键字中间

always@()括号里面是敏感信号。这里的 always@(posedge Clk)敏感信号是 posedge Clk 含义是在上升沿的时候有效, 敏感信号还可以 negedge Clk 含义是下降沿的时候有效, 这种形式一般时序逻辑都会用到。还可以是这个一符号, 如果是一个则表示一直是敏感的, 一般用于组合逻辑。

assign 用来给 output,inout 以及 wire 这些类型进行连线。assign 相当于一条连线, 将表达式右边的电路直接通过 wire(线)连接到左边, 左边信号必须是 wire 型(output 和 inout 属于 wire 型) 。当右边变化了左边立马变化, 方便用来描述简单的组合逻辑。

符号部分:

这里重点讲解一下“<=” 赋值符号,非阻塞赋值 ,“=” 阻塞赋值,“{}”“<=” 赋值符号, 非阻塞赋值, 在一个 always 模块中, 所有语句一起更新。它也可以表示小于等于, 具体是什么含义编译环境根据当前编程环境判断, 如果“<=” 是用在一个 if 判断里如:if(a <= 10);当然就表示小于等于了。

“=” 阻塞赋值, 或者给信号赋值, 如果在 always 模块中, 这条语句被立刻执行。阻塞赋值和非阻塞赋值将再后面详细举例说明。

“{} ” 在 Verilog 中表示拼接符, {a,b}这个的含义是将括号内的数按位并在一起, 比如:{1001,1110}表示的是 10011110。拼接是 Verilog 相对于其他语言的一大优势, 在以后的编程中请慢慢体会。

参数部分:

1parameter 2parameter a = 180;//十进制, 默认分配长度 32bit(编译器默认) 3parameter a = 8’d180;//十进制 4parameter a = 8’haa; //十六进制 5parameter a = 8’b1010_1010; //二进制 

预处理命令

1`include file1.v 2`define X = 1; 3`deine Y; 4`ifdef Y 5Z=1; 6`else 7Z=0; 8`endif 

Verilog 中数值表示的方式

如果我们要表示一个十进制是 180 的数值, 在 Verilog 中的表示方法如下:
二进制:8’ b1010_1010; //其中“_” 是为了容易观察位数, 可有可无。
十进制:8’ d180;
16 进制:8’ hAA;

讲到这里, 具备这些基础知识, 需要通过代码来学习Veriog 语言。最后, 笔者提一点建议, 学习 Verilog 多看别人写的优秀的代码, 多看官方提供的代码和文档。其中官方提供的代码, 很多时候代表了最新的用法, 或者推荐的用法。读者学习, 首先把最最基础的掌握好, 这样, 在项目中遇到了问题, 也能快速学习, 快速解决。

对于理论知识的学习, 没必要一开始就研究得那么深刻, 只是搞理论学习, 对于学习Verilog 语言, 或者 FPGA 开发是不实际的, 要联系理论和实践结合。多仿真, 多验证, 多问题, 多学习, 多改进


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除( 邮箱:macysun@21ic.com )。
关闭