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更高档杂乱一些的时钟办理单元。