FPGA规范及该注意的地方

0.模块级的注释

每个模块开始要注明文件名、功能描述、引用模块、设计者、设计时间及版权信息等。
/* ========================
Filename ﹕
Author ﹕
Description ﹕
Called by ﹕Top module
Revision History ﹕
Revision 1.0
Email ﹕
Company ﹕ Robsense Technology .Inc
Copyright(c) 2015, xxxxx Technology Inc, All right reserved
========================= */

1.宏(Macros)

1、可以把所有的`define放在一个文件中,在编译原代码时首先把这个文件读入

2、如果希望宏的作用域仅在一个模块中有效,就用parameter,==可以用来传递参数==.

3、作用域仅在一个模块中有效,localparam,==不可用来传递参数==。

4、parameter在本module内有效的定义,可用于参数传递;

从上层传值进下一层常数时,需要在上层用#定义传的值

在下层需要定义对应的参数名字parameter parameter_name;
module_name
#(
.parameter_name(para_value),
.parameter_name(para_value)
)
inst_name
(
port map
);

2.FSM

1、verilog描述状态机时必须由parameter分配,而VHDL状态机状态可以在综合时分配产生。

2、组合逻辑和时序逻辑分开用不同的进程

3、状态机主要分为==Mealy==机和==Moore==机,Mealy机的状态和输入有关,而Moore机的状态转换和输入无关。

3.输入不确定的组合逻辑电路

在设计组合逻辑时,需要将不确定的输入转化成确定的输入,然后再完成组合逻辑。
module x2one(in, out);
input in;
output out;
assign out = (in == 1)? 1:0;
endmodule

4.Verilog 中文件输出\输出函数的使用方法

1、系统函数$fopen用于打开一个文件,并返回一个整数的文件指针

2、系统函数$fdisplay就可以用这个文件指针在文件中实现写入信息。

3、写完后用$fclose函数关闭文件

==以下语句将”a”和”b”分别显示在”@%h\n%h”中的两个%h,并写入指针所指的文件W_file.txt==
integer W_file; //定义文件指针
W_file = $fopen("W_file.txt");
$fdisplay(W_file, "@%h\n%h",a,b);
$fclose(W_file);

4、读文件操作通过readmemh和readmemb函数来完成,分别对应的数据文件为十六进制和二进制
reg[15:0]c[0:15];
$readmemh("R_file.txt", c);

5.Verilog 中预处理

verilog预处理与C很类似,预处理符号`开头。

==注:在引用已定义的宏名时,必须在宏名前加`.==
`include file.v  //包含文件file.v

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

`ifdef X

  z = 1;

`else

  z = 0;

`endif

6. tri和wire的用法区别

连线与三态线(tri)网语法和语义一致。

tri是用来强调三态门的使用,三态门值 0 1 X Z。

三态线可以用于描述多个驱动源驱动同一根线的线网类型;并且没有其他特殊的意义。

7. pullup和 pulldown的用法

如果两个INOUT都处于高阻态,那么接收到的信号到底是什么状态呢?这实际上等效为两个INPUT端口连接,也就等效为INPUT端口悬空。

这应该是取决于外围的驱动,添加的上拉或者下拉电阻,一般而言,FPGA添加的是上拉电阻,也就意味着此时chipscope采集的数据是高电平.

FPGA管脚内部可以配置弱上拉或下拉电阻来实现Z状态下的控制。

在verilog代码中直接可以定义信号线的==上拉==或者==下拉==模式

或者在约束文件中也可以也可以通过约束文件中配置信号线的上拉或者下拉模式

具体用法:
pullup p1 ( );

8. 下面代码中的wire和assign用法有什么区别
paramenter addr =4'h0;
input [13:0] aaa;
wire ccc=aaa[13:10]==addr;
------------------------------------------
assign bbb=(aaa==16'd0);

从用法来说是一样的,assign是一种线的赋值语句,普通的io口也可以直接赋值,其实io口在电路上就是一种wire。

reg 与 寄存器实际上应该反过来讲:

- 如果要综合寄存器,需要同时满足俩个条件:

定义为reg,

在always @posedge(negedge) block中赋值

- 如果要综合组合逻辑,可以(任意):

定义为wire, 用assign赋值

定义为reg, 只在always @(a b c d) block中赋值

在verilog语言中的reg类型只是语法意义上。reg类型的变量不能通过assign赋值,而wire类型的变量不能在always block中赋值。

9. verilog中generater语句的使用,以及genvar用法

在Verilog-2001里,新增加的generate语句拓展了这种用法(其思想来源于VHDL
语言)。除了允许复制产生primitive和module的多个实例化,同时也可以复制产生多个net、reg、parameter、assign、always、initial、task、function。
generate语句有generate-for、genreate-if和generate-case三种语句
generate-for语句必须用genvar关键字定义for的索引变量。

module gray2bin2 (bin, gray);
prameter SIZE = 8;
ouput [SIZE-1:0] bin;
input [SIZE-1:0] gray;
reg [SIZE-1:0] bin;
genvar i;
generate
for(i=0; i < SIZE; i=i+1)
begin: bit
assign bin[i] = ^gray[SIZE-1:i]
end
endgenerate
endmodule

9. verilog中 {}和{{}}的区别。

{}表示拼接,{第一位,第二位,…}

{{}}表示复制,{4{a}}等同于{a,a,a,a}

10. IBUFDS、IBUFGDS和OBUFDS差分信号缓冲

IBUFDS、IBUFGDS和OBUFDS都是差分信号缓冲器,用于不同电平接口之间的缓冲和转换。

IBUFDS是差分输入的时候用;

OBUFDS是差分输出的时候用;

IBUFGDS则是时钟信号专用的输入缓冲器。

具体见笔记中《==FPGA差分信号缓冲的转换(IBUFDS、IBUFGDS和OBUFDS)==》

11. 时钟配置中MMCM 与PLL的不同点

MMCM 混合时钟管理单元也是由pll构成,只是增加了一些额外性能, 比如给定输入时钟中的频率约束输出时钟频率相位的关系,生成不同的时钟,其实内部也是pll去经过VCO环路锁定输出的。可以理解为MMCM比PLL更高级复杂一些的时钟管理单元。

文章转载自: http://blog.csdn.net/github_33678609/article/details/53790258