FPGA学习中的小知识2
2010-10-23 21:35
232 查看
11、综合工具不支持的Verilog结构
initial语句
循环结构:repeat、forever、while、非结构化的for语句
数据类型:event、real、time
UDP(用户定义基本单元)
for……join块
wait语句
过程持续赋值:assign、deassign、force、release
操作符:===、!==
12、编写时序元件的Verilog代码时应该注意:避免不必要的latch(锁存器);触发器的初始赋值(reset/set)不应在initial描述块内定义,而应该在其功能描述中
加以定义;组合电路避免出现反馈回路。
13、要避免在综合的过程中产生不必要的latch,在组合逻辑描述中必须保证:
(1)所有的if……else及其嵌套结构、case、casex、casez结构是满的。
(2)变量、信号的赋值在每一个分支中都应有明确的指定。
(3)if……else及其嵌套结构本身是满的。
(4)case、casex、casez必须包含default分支。
14、一个模块的基本语法:
module module_name(port1,port2,……);
//Declaration
input,output,inout,
reg,wire,parameter,
function,mask,……
//Statement
Initial statement
Always statement
Module instantiation
Gate instantiation
Continuous assignment
endmodule
15、设计模块时可尽量考虑使用参数化,提高设计的重用。
16、调用模块时,采用的端口映射有
(1)位置对应
(2)端口对应(名字关联)
如,调用全加器模块module full_adder(a,b,ci,s,co);
full_adder full1(.a(本模块要传递的a),.b(本模块要传递的b),.ci(本模块要传递的ci),.s(本模块要传递的s),.co(本模块要传递的co))
(3)允许出现不连接的端口
尽量在端口映射时使用名字关联
17、只有寄存器类型的信号才可以在always和initial语句中进行赋值。
18、always语句从0时刻开始执行。
19、全加器的三种描述方式:
(1)结构化描述方式:
module full_adder(a,b,ci,s,co);
input a,b,ci;
output s,co;
wire s1,t1,t2,t3;
xor x1(s1,a,b);
xor x2(s,s1,ci);
and a1(t3,a,b);
and a1(t2,b,ci);
and a1(t1,a,ci);
or o1(co,t1,t2,t3);
endmodule
(2)数据流描述方式:
module full_adder(a,b,ci,s,co);
input a,b,ci;
output s,co;
wire s1,t1,t2,t3;
assign #2 s1=a^b;
assign #2 s=s1^ci;
assign #2 t3=a&b;
assign #2 t2=a&ci;
assign #2 t1=b&ci;
assign #2 co=t1|t2|t3;
endmodule
(3)行为描述方式:
[1]module full_adder(a,b,ci,s,co);
input a,b,ci;
output s,co;
reg s,co;
reg t1,t2,t3;
always @(a or b or ci)
begin
s=(a^b)^ci;
t1=a&b;
t1=a&ci;
t1=b&ci;
co=(t1|t2)|t3;
end
endmodule
[2]module full_adder(a,b,ci,s,co);
input a,b,ci;
output s,co;
reg s,co;
reg t1,t2,t3;
always @(a or b or ci)
begin
{co,s}=a+b+ci;
end
endmodule
20、一般的,对顶层设计,采用结构描述方式,对底层模块,可采用数据流、行为级或两者的结合。
两位的全加器:
module adder2(at,bt,cit,st,cot);
parameter SIZE=2;
input[SIZE:1] at;
input[SIZE:1] bt;
input cit;
output[SIZE:1] st;
output cot;
wire temp;
full_adder full1
(
.a(at[1]),
.b(bt[1]),
.ci(cit),
.s(st[1]),
.co(temp)
);
full_adder full2
(
.a(at[2]),
.b(bt[2]),
.ci(temp),
.s(st[2]),
.co(cot)
);
endmodule
initial语句
循环结构:repeat、forever、while、非结构化的for语句
数据类型:event、real、time
UDP(用户定义基本单元)
for……join块
wait语句
过程持续赋值:assign、deassign、force、release
操作符:===、!==
12、编写时序元件的Verilog代码时应该注意:避免不必要的latch(锁存器);触发器的初始赋值(reset/set)不应在initial描述块内定义,而应该在其功能描述中
加以定义;组合电路避免出现反馈回路。
13、要避免在综合的过程中产生不必要的latch,在组合逻辑描述中必须保证:
(1)所有的if……else及其嵌套结构、case、casex、casez结构是满的。
(2)变量、信号的赋值在每一个分支中都应有明确的指定。
(3)if……else及其嵌套结构本身是满的。
(4)case、casex、casez必须包含default分支。
14、一个模块的基本语法:
module module_name(port1,port2,……);
//Declaration
input,output,inout,
reg,wire,parameter,
function,mask,……
//Statement
Initial statement
Always statement
Module instantiation
Gate instantiation
Continuous assignment
endmodule
15、设计模块时可尽量考虑使用参数化,提高设计的重用。
16、调用模块时,采用的端口映射有
(1)位置对应
(2)端口对应(名字关联)
如,调用全加器模块module full_adder(a,b,ci,s,co);
full_adder full1(.a(本模块要传递的a),.b(本模块要传递的b),.ci(本模块要传递的ci),.s(本模块要传递的s),.co(本模块要传递的co))
(3)允许出现不连接的端口
尽量在端口映射时使用名字关联
17、只有寄存器类型的信号才可以在always和initial语句中进行赋值。
18、always语句从0时刻开始执行。
19、全加器的三种描述方式:
(1)结构化描述方式:
module full_adder(a,b,ci,s,co);
input a,b,ci;
output s,co;
wire s1,t1,t2,t3;
xor x1(s1,a,b);
xor x2(s,s1,ci);
and a1(t3,a,b);
and a1(t2,b,ci);
and a1(t1,a,ci);
or o1(co,t1,t2,t3);
endmodule
(2)数据流描述方式:
module full_adder(a,b,ci,s,co);
input a,b,ci;
output s,co;
wire s1,t1,t2,t3;
assign #2 s1=a^b;
assign #2 s=s1^ci;
assign #2 t3=a&b;
assign #2 t2=a&ci;
assign #2 t1=b&ci;
assign #2 co=t1|t2|t3;
endmodule
(3)行为描述方式:
[1]module full_adder(a,b,ci,s,co);
input a,b,ci;
output s,co;
reg s,co;
reg t1,t2,t3;
always @(a or b or ci)
begin
s=(a^b)^ci;
t1=a&b;
t1=a&ci;
t1=b&ci;
co=(t1|t2)|t3;
end
endmodule
[2]module full_adder(a,b,ci,s,co);
input a,b,ci;
output s,co;
reg s,co;
reg t1,t2,t3;
always @(a or b or ci)
begin
{co,s}=a+b+ci;
end
endmodule
20、一般的,对顶层设计,采用结构描述方式,对底层模块,可采用数据流、行为级或两者的结合。
两位的全加器:
module adder2(at,bt,cit,st,cot);
parameter SIZE=2;
input[SIZE:1] at;
input[SIZE:1] bt;
input cit;
output[SIZE:1] st;
output cot;
wire temp;
full_adder full1
(
.a(at[1]),
.b(bt[1]),
.ci(cit),
.s(st[1]),
.co(temp)
);
full_adder full2
(
.a(at[2]),
.b(bt[2]),
.ci(temp),
.s(st[2]),
.co(cot)
);
endmodule
相关文章推荐
- 深度学习FPGA实现基础知识0(FPGA击败GPU和GPP,成为深度学习的未来?)
- 如何学习FPGA?FPGA学习必备的基础知识
- 深度学习FPGA实现基础知识4(Mariana——腾讯深度学习平台的进展与应用)
- 深度学习FPGA实现基础知识7(深度学习Matlab工具箱代码详解)
- 深度学习FPGA实现基础知识11(向专家致敬--吴恩达)
- FPGA学习中的小知识3
- 深度学习FPGA实现基础知识13(向专家致敬--深度学习-LeCun、Bengio和Hinton的联合综述)
- 深度学习FPGA实现基础知识15(Matlab图像处理“卷积”运算)
- 深度学习FPGA实现基础知识6(Deep Learning(深度学习)学习资料大全及CSDN大牛博客推荐)
- 深度学习FPGA实现基础知识9(Deep Learning(深度学习)Matlab工具箱下载、安装、测试)
- 深度学习FPGA实现基础知识18(Matconvnet学习笔记)
- 深度学习FPGA实现基础知识1(网友关于FPGA机器学习想法)
- 深度学习FPGA实现基础知识16(图像处理中任意核卷积(matlab中conv2函数)的快速实现)
- 深度学习FPGA实现基础知识19(通过文件读写方式实现Matlab和Modelsim的联合仿真)
- 深度学习FPGA实现基础知识6(Deep Learning(深度学习)学习资料大全及CSDN大牛博客推荐)
- 深度学习FPGA实现基础知识10(Deep Learning(深度学习)卷积神经网络(Convolutional Neural Network,CNN))
- 深度学习FPGA实现基础知识14(如何理解“卷积”运算)
- 深度学习FPGA实现基础知识10(Deep Learning(深度学习)卷积神经网络(Convolutional Neural Network,CNN))
- 2.深度学习FPGA实现基础知识17(图像处理卷积运算 矩阵卷积)
- FPGA学习中的小知识4