数字系统设计的过程:
算法——行为级描述——RTL级描述——门级网表——物理版图
题目:Verilog语言的层次高低对应(D)
A.系统级,行为级,功能级,寄存器传输级,门级
B.系统级,行为级,寄存器传输级,功能级,门级
C.系统级,功能级,寄存器传输级,行为级,门级
D.系统级,功能级,行为级,寄存器传输级,门级
二者区别的详细讲解
LUT为查找表,顾名思义,其根本的作用也是查找(好比我们在字典中查找我们想要的字)。本质:给定一个输入的值,返回给一个对应的输出值。
查找表包括一维(1D LUT)、二维查找表等。
FPGA查找表的本质就是一个RAM,每一个LUT可看作一个有4位地址线的16*1RAM。一般情况下我们采用LUT4或者LUT6,因为如果查找表的输入位数过大的话,需要进行级联操作,会造成更大的数据传输延迟;
在FPGA中,可使用LUT来实现组合逻辑电路的功能,形成门电路。LUT里存储的数据是真值表,根据逻辑计算后的结果,即可在LUT中查找对应内容。
module test(
input a,
input b,
output out1,
output out2
);
assign out1 = a & b;
assign out2 = a | b;
endmodule
可看出我们采用LUT实现了门电路,LUT内就是逻辑门电路的真值表。
根据LUT是ROM且内部存储数据是真值表的本质,对于LUT1,我们即可通过输入变量00,输出LUT1中地址为00存储单元中的数值0……
LUT前生今世
FPGA中LUT详解
我们用`include来进行文件的包含,和C语言类似,该文件中定义一些公共的宏参数。一个include只能对一个头文件进行包含。
`ifdef 宏名(标识符)
程序段1
`else
程序段2
`endif
在FPGA图像处理中,VGA驱动设计处会用到这种条件编译的方式,用来选择不同VGA分辨率中对应的显示前沿、行有效等宏参数,如下是定义的800*600分辨率的VGA时序参数。我们通过包含头文件(建议包含头文件和该文件在同一文件夹下)以及用`define的方式来选择对应的分辨率即可。
`define VGA_800_600……表示这800*600分辨率的一部分代码被编译。
详解
关于D触发器:
D触发器通常在时钟上升沿时,此时会捕获D端输入的值,然后保持该值不变,直到下一个上升沿到来时,重新捕获D端的输入值。因此它具有存储记忆功能。
注意:D触发器的正常工作必须要满足其保持和建立时间要求。如果数据稳定的时候不满足要求,也是不能正常存储的。
//一位 异步D触发器
module test(clk,rst,d,q);
input clk;
input rst;
input d;
output reg q;
always@(posedge clk or negedge rst)
if(!rst)
q <= 0;
else
q <= d;
endmodule
module test(clk,rst,d,q);
input clk;
input rst;
input [7:0]d;
output reg [7:0]q;
always@(posedge clk )
if(!rst)
q <= 0;
else
q <= d;
endmodule
RTL图:
module test(clk,rst,clr,q,d);
input clk ;
input rst ;
input clr;
input d ;
output reg q ;
always @ (posedge clk or posedge clr )
if(clr)
q <= 0;
else if(rst)
q <= 1;
else
q <= d;
endmodule
这里相当于有了优先级,清零信号clr优先于复位rst信号。
优先的理解:当clr清零的时候,不管rst信号为高电平还是低电平都不会影响q为0的结果。
1、动态时序分析:是通常我们所说的仿真,该仿真可以验证功能和时序。方法:首先确定测试向量,输入硬件模型,进行仿真。
优点:比较精确,同静态时序相比,它适用于更多的设计类型 。
缺点:若遇到门级等,分析速度慢;其次它需要使用输入矢量,这使得它在分析的过程中有可能会遗漏一些关键路径,难以保证足够的覆盖率;随着规模增大,所需要的向量数量以指数增长。
2、静态时序分析:只能分析时序,不能功能验证。
优点:不需要输入测试向量,比动态时序分析快得多,提高仿真时间。采用穷尽分析的方法,可验证每一条路径(100%覆盖),分析路径上的传播延时,比如组合逻辑延时、走线延时等,检查信号建立时间和保持时间是否满足时序要求。通过对最大路径延时和最小路径延时的分析,找出违背时序约束的错误。运行速度很快、占用内存较少。可利用时序分析结果进行时序优化。
缺点:静态时序分析只能对同步电路分析,不能对异步电路时序分析。在深亚微米的工艺条件下,静态时序分析不能完整的把所有影响延时的因素给包含进去。
module test(sel,b,c);
input sel ;
input b ;
output c ;
assign c= sel ?(~b):(b);
endmodule
1、锁存器Latch :锁存器是电平触发方式,属于异步电路设计。————用于组合逻辑
缺点:不利于时序分析;对毛刺敏感;FPGA是没有锁存器单元的,它由查找表和触发器组成,因此会造成更多的资源浪费。
产生锁存器的几个情况:
1,case——缺少default的时候产生锁存器
2,if-------else if ——缺少else的时候产生锁存器
3,always@(敏感信号表)——赋值表达式右边参与赋值的信号没有在敏感列表出现会出现透明锁存器
2、寄存器Register:寄存器是时钟边沿触发方式,属于同步电路设计。
寄存器更利于时序分析,还能防止亚稳态等现象出现,FPGA里有寄存器单元,因此使用可节约芯片资源。
关于分频设计及仿真的参考
verilog代码:
module test(clk,rst_n,out);
input clk ;
input rst_n ;
output reg out;
always @ (posedge clk or negedge rst_n)
if(!rst_n)
out <= 0;
else
out <= ~out;
endmodule
`timescale 1ns/1ns
`define clock_period 20
module test_tb;
reg clk;
reg rst_n;
wire out;
test u1(
.clk(clk),
.rst_n(rst_n),
.out(out)
);
//产生时钟复位激励
initial clk = 1;
always #(`clock_period/2) clk =~clk;
initial begin
rst_n = 0;
#5;
rst_n = 1;
#100;
$stop;
end
endmodule
需要关注两个点:同步高置数和异步高复位。
因此这里有置位和复位两个信号——set和rst
verilog代码如下:
module test(clk,rst,set,q);
input clk ;
input rst ;
input set ;
output reg q ;
always @ (posedge clk or posedge rst )
if(rst)
q <= 0;
else if(set)
q <= 1;
else
q <= ~q;
endmodule
module test(clk,rst_n,load,data,cout);
input clk ;
input rst_n ;
input load ;
input [2:0] data ;
output reg [2:0] cout ;
always @ (posedge clk )
if(!rst_n)
cout <= 3'd0;
else if(load)
cout <= data;
else if(cout == 3'd6)
cout <= 3'd0;
else
cout <= cout + 3'd1;
endmodule
如果想要设计一个可预置初值的15进制循环计数器,修改位宽以及计数最大值即可。
参考
高阻态是指电路的一种输出状态,和高低电平一样,但是它既不是高电平也不是低电平,如果高阻态再输入下一级电路的话,对下级电路无任何影响,可以理解为断路,不被任何东西所驱动,也不驱动任何东西。
重定时(Retiming)是一种时序优化技术,用在不影响电路输入/输出行为的情况下跨组合逻辑寄存器从而提高设计性能。
例如:当组合逻辑过大的时候,我们可采用流水线的方式用面积换取速度——插入寄存器