集成电路综合课程设计.docx
- 文档编号:28183546
- 上传时间:2023-07-09
- 格式:DOCX
- 页数:41
- 大小:213.71KB
集成电路综合课程设计.docx
《集成电路综合课程设计.docx》由会员分享,可在线阅读,更多相关《集成电路综合课程设计.docx(41页珍藏版)》请在冰豆网上搜索。
集成电路综合课程设计
课程设计
开课学期:
2013-2014学年第一学期
课程名称:
集成电路综合课程设计
学院:
专业:
班级:
学号:
姓名:
任课教师:
2013年9月11日
设计目的
利用verilogHDL设计数字电路异步FIFO,通过对verilogHDL的学习,掌握一些基本的知识,本次课程设计的安排旨在提升学生的动手能力,加强大家对专业理论知识的理解和实际运用,加强大家的自学能力,为大家做毕业设计做很好的铺垫。
设计要求
遵循RTL设计规则,利用VerilogHDL 设计数字电路异步FIFO.
异步FIFO具有读写两个时钟,读时钟100MHz,写时钟50MHz。
RTL为可综合设计,需要考虑不同时钟领域的同步设计,具有空满标志产生逻辑,并且根据空满标志进行读写数据及读写使能等逻辑控制。
根据RTL设计,编写验证环境,即testbench,在testbench中测试异步FIFO的读写功能是否正确。
异步FIFO写数据由testbench产生。
编写一定的测试向量,来测试覆盖所设计的异步FIFO各项功能及指标。
将异步FIFO RTL在DC环境中进行综合,编写约束文件,给出最终的综合结果,包括面积报告,网表及时序报告。
约束文件中,读写时钟要求见上,输入延迟为写时钟周期的一半,输出延迟为读时钟周期的1/3,其他约束要求根据RTL设计自己确定。
设计基本原理
从硬件的观点来看,就是一块数据内存。
它有两个端口,一个用来写数据,就是将数据存入FIFO;另一个用来读数据,也就是将数据从FIFO当中取出。
与FIFO操作相关的有两个指针,写指针指向要写的内存部分,读指针指向要读的内存部分。
FIFO控制器通过外部的读写信号控制这两个指针移动,并由此产生FIFO空信号或满信号。
对于异步FIFO而言,数据是由某一个时钟域的控制信号写入FIFO,而由另一个时钟域的控制信号将数据读出FIFO。
也就是说,读写指针的变化动作是由不同的时钟产生的。
因此,对FIFO空或满的判断是跨时钟域的。
如何根据异步的指针信号对FIFO的满状态或空状态进行正确的判断。
设计分析
在数字集成电路中,触发器要满足setup/hold的时间要求。
当一个信号被寄存器锁存时,如果信号和时钟之间不满足这个要求,Q端的值是不确定的,并且在未知的时刻会固定到高电平或低电平。
这个过程称为亚稳态(Metastability)。
图2所示为异步时钟和亚稳态,图中clka和clkb为异步时钟。
①对写地址/读地址采用格雷码。
由实践可知,同步多个异步输入信号出现亚稳态的概率远远大于同步一个异步信号的概率。
对多个触发器的输出所组成的写地址/读地址可以采用格雷码。
由于格雷码每次只变化一位,采用格雷码可以有效地减少亚稳态的产生。
2.2空/满标志的产生
空/满标志的产生FIFO的核心部分。
如何正确设计此部分的逻辑,直接影响到FIFO的性能。
空/满标志产生的原则是:
写满不溢出,读空不多读。
即无论在什么进修,都不应出现读写地址同时对一个存储器地址操作的情况。
在读写地址相等或相差一个或多个地址的时候,满标志应该有效,表示此时FIFO已满,外部电路应对FIFO发数据。
在满信号有效时写数据,应根据设计的要求,或保持、或抛弃重发。
同理,空标志的产生也是如此,即:
空标志<=(|写地址-读地址|<=预定值)AND(写地址超前读地址)
满标志<=(|写地址-读地址|<=预定值)AND(读地址超前写地址)
设计实现过程
五、设计实现过程
A、电路实现过程
附图1
由异步FIFO内部模块图和接口信号(附图1)可以知道,因为是两个异步的时钟,所以用锁存器来避免产生亚稳态。
为了生成空满标志,我们采用格雷码来编写。
我们可以看出FIFO中的读写指针是一个循环指针,读写指针初始化值都为0,满标志初始化为0,空标志初始化值为1.读写操作开始的时候,每做一次写操作,写指针加1,每做一次读操作,读指针也加1,。
当读指针在加1过程中与写指针相等的时候,表示缓冲区为空,应置空标志。
反之,写指针加1过程中等于读指针,缓冲区满,应置满标志。
经上面的分析,结合格雷码的特点,我们可以将满标志定义如下:
overflow=(wptr[n]^rptr[n-1])&~(wptr[n-1]^rptr[n]
我们可以将空标志定义如下:
underflow=~(wptr[n]^rptr[n-1]&(wptr[n-1]^rptr[n])
分析后根据RTL设计的规则来编写代码如下所示:
//asynfifo
`timescale1ns/1ns
modulefifo(
wdata,
full,
winc,
wclk,
wrst_n,
rdata,
rinc,
empty,
rclk,
rrst_n
);
//----------------
parameterWIDTH=8;
parameterDEPTH=2;
parametermax_count=2'b11;
//-------------------------
input[WIDTH:
0]wdata;
inputwinc;
inputwclk;
inputwrst_n;
inputrinc;
inputrclk;
inputrrst_n;
//-------------------
outputfull;
output[WIDTH:
0]rdata;
outputempty;
//---------------------------
regfull_r;
regempty_r;
reg[WIDTH:
0]rdata_r;
//-------------------
reg[DEPTH:
0]wptr;//n+1ptr
reg[DEPTH:
0]rptr;
reg[DEPTH:
0]w1_rptr;
reg[DEPTH:
0]w2_rptr;
reg[DEPTH:
0]r1_wptr;
reg[DEPTH:
0]r2_wptr;
//---------------------------------
reg[(WIDTH-1):
0]fifomem[0:
max_count];
reg[DEPTH:
0]wbin,rbin;
wire[DEPTH:
0]rgnext,rbnext,wgnext,wbnext;
reg[DEPTH:
0]rgnext_r,rbnext_r;
wire[(DEPTH-1):
0]raddr,waddr;
//reg[(DEPTH-1):
0]raddr_r;
wirefull_val,empty_val;
//---------------------/
//writein
always@(posedgewclk)
begin
if(!
winc&!
full)//writeenablenofull
fifomem[waddr]<=wdata;
end
//readout
always@(posedgerclk)
begin
if(!
rinc&!
empty)
rdata_r<=fifomem[raddr];
end
//------------------------
//asynwriteptr
always@(posedgewclkornegedgewrst_n)
begin
if(!
wrst_n)
{w2_rptr,w1_rptr}<=2'b00;
else
{w2_rptr,w1_rptr}<={w1_rptr,rptr};
end
//-----
//generatewptrandwbin
always@(posedgewclkornegedgewrst_n)
begin
if(!
wrst_n)
{wbin,wptr}<=2'b00;
else
{wbin,wptr}<={wbnext,wgnext};
end
//--
assignwaddr=wbin[(DEPTH-1):
0];
assignwbnext=!
full?
(wbin+!
winc):
wbin;
assignwgnext=(wbnext>>1)^wbnext;
assignfull_val=(wgnext=={~w2_rptr[DEPTH],w2_rptr[(DEPTH-1):
0]});
always@(posedgewclkornegedgewrst_n)
begin
if(!
wrst_n)
full_r<=1'b0;
else
full_r<=full_val;
end
//asynreadptr------------------------------------------------------------
always@(posedgerclkornegedgerrst_n)
begin
if(!
rrst_n)
{r2_wptr,r1_wptr}<=2'b00;
else
{r2_wptr,r1_wptr}<={r1_wptr,wptr};
end
///---------------------------------------------
//generaterbinandrptr
always@(posedgerclkornegedgerrst_n)
begin
if(!
rrst_n)
{rbin,rptr}<=2'b00;
else
{rbin,rptr}<={rbnext_r,rgnext_r};
end
//---------
assignraddr=rbin[(DEPTH-1):
0];
assignrbnext=!
empty?
(rbin+!
rinc):
rbin;
assignrgnext=(rbnext>>1)^rbnext;
assignempty_val=(rgnext_r==r2_wptr);
always@(posedgerclkornegedgerrst_n)
begin
if(!
rrst_n)
empty_r<=1'b0;
else
empty_r<=empty_val;
end
//-----------
assignfull=full_r;
assignempty=empty_r;
assignrdata=rdata_r;
//assignrgnext=rgnext_r;
always@(posedgerclk)
begin
rgnext_r<=rgnext;
rbnext_r<=rbnext;
//raddr_r<=raddr;
end
endmodule在quartusII中进行编译,语法正确无误后在modelsim中进行仿真查看是否有满足预设的功能和要求。
编译文件(testbench)如下所示。
`timescale1ns/1ps
moduleFIFO_vlg_tst();
//constants
//generalpurposeregisters
//regeachvec;
//testvectorinputregisters
reg[7:
0]IN;
regRD_CLOCK;
regRINC;
regRRESET_N;
regWINC;
regWRESET_N;
regWR_CLOCK;
//wires
wireEMPTY_P;
wireFULL_P;
wire[7:
0]OUT;
//assignstatements(ifany)
FIFOi1(
//portmap-connectionbetweenmasterportsandsignals/registers
.EMPTY_P(EMPTY_P),
.FULL_P(FULL_P),
.IN(IN),
.OUT(OUT),
.RD_CLOCK(RD_CLOCK),
.RINC(RINC),
.RRESET_N(RRESET_N),
.WINC(WINC),
.WRESET_N(WRESET_N),
.WR_CLOCK(WR_CLOCK)
);
initial
fork
WR_CLOCK=0;
WINC=1;
#10WRESET_N=0;
#20WRESET_N=1;
#40WINC=0;
//IN=8'd10;
join
initial
fork
RD_CLOCK=0;
RINC=1;
#10RRESET_N=0;
#200RRESET_N=1;
#400RINC=0;
join
always
begin
#10WR_CLOCK=~WR_CLOCK;
end
always
begin
#100RD_CLOCK=~RD_CLOCK;
end
endmodule
B、综合过程
将RTL文件拷如liux系统中进行综合,生成门级网表,并根据要求来编写约束文件,使文件最优化。
完成后的约束文件如下:
#fifoconstrains
#data2013.5.18
#authoujohnny
#
#
###########designentry###########
read_verilog../rtl/fifo.v
check_design
current_design
set_max_area1000
#set_min_area0.0
###########setupoperatingconditions,wireload,clocks,reset#####
##create_clock-period10-waveform{05}[get_portsCLOCK]
create_clock-period20[get_portswclk]
create_clock-period10[get_portsrclk]
set_dont_touch_network[get_clockswclk]
set_dont_touch_network[get_clocksrclk]
##set_dont_touch_network[listCLOCKRESET_N]
set_operating_conditions-maxWCIND-minWCCOM
set_wire_load_model-name"10x10"
set_wire_load_modeenclosed
set_clock_latency4.0[get_clockswclk]
set_clock_latency2.0[get_clocksrclk]
set_clock_uncertainty-setup4.0-hold0.50[get_clockswclk]
set_clock_uncertainty-setup2.0-hold0.25[get_clocksrclk]
######usefulcommands#######################
##
##report_port-verbose##
##report_clock###
##reset_design##
##list_libs#####
##remove_design-all
##remove_design-design
##list_files##listsallfilesinDCmemory
##list_designs
##list_license
###########inputdrives######################
set_driving_cell-lib_cellAN2[get_portswdata]
##set_drive0[listRESET_N]
############outputload#############
set_load5[all_outputs]
##########setinput&setoutputdelay##########
set_input_delay-max10-clockwclk[get_portswdata]
set_input_delay-max5-clockrclk[get_portsrdata]
set_output_delay-max3.3-clockrclk[get_portsrdata]
##set_input_delay5-clockCLOCK[all_inputs]
##############Advancedconstrints#################
##group_path
##set_false_path
##set_multicycle
##############compileandwritethedatabase########
compile
write-hierarchy-formatverilog-output../rtl/list.v
########createreports################
##write-hierarchy-formatverilog-output../rtl/fifo_timing.v
write_sdc../rtl/fifo_timing.sdc
report_timing
report_area
report_area>./fifo_test.area_rpt
report_timing>fifo_test.timing.rpt
report_constraint-all_violators>fifo_test.constraint_rpt
##gui_start
#######report
#report_timing
结果
系统功能仿真波形:
时序仿真波形:
总结及感想
虽然该设计用了差不多两个星期的时间,虽然效率不高,但也对学到了不少东西。
对同步异步信号有了较深的理解,以及怎样通过看RTL和描述语言作对比,找出问题的所在,此方法对于小的设计及有帮助。
同时也让我积累了一些经验,比如在设计之前还查找相关的资料,了解该方面设计目前的大体情况。
整理好设计方案、思想等。
这样能在很大程度上提高设计效率。
附件:
门级网表:
modulefifo(wdata,full,winc,wclk,wrst_n,rdata,rinc,empty,rclk,
rrst_n);
input[8:
0]wdata;
output[8:
0]rdata;
inputwinc,wclk,wrst_n,rinc,rclk,rrst_n;
outputfull,empty;
wireN5,N6,\fifomem[0][7],\fifomem[0][6],\fifomem[0][5],
\fifomem[0][4],\fifomem[0][3],\fifomem[0][2],\fifomem[0][1],
\fifomem[0][0],\fifomem[1][7],\fifomem[1][6],\fifomem[1][5],
\fifomem[1][4],\fifomem[1][3],\fifomem[1][2],\fifomem[1][1],
\fifomem[1][0],\fifomem[2][7],\fifomem[2][6],\fifomem[2][5],
\fifomem[2][4],\fifomem[2][3],\fifomem[2][2],\fifomem[2][1],
\fifomem[2][0],\fifomem[3][7],\fifomem[3][6],\fifomem[3][5],
\fifomem[3][4],\fifomem[3][3],\fifomem[3][2],\fifomem[3][1],
\fifomem[3][0],N14,N15,N16,N17,N18,N19,N20,N21,\w2_rptr[2],
full_val,\rbin[2],empty_val,n10,n20,n23,n26,n29,n31,n32,
n33,n34,n35,n36,n37,n38,n39,n40,n41,n42,n43,n44,n45,n46,
n47,n48,n49,n50,n51,n52,n53,n54,n55,n56,n57,n58,n59,n60,
n61,n62,n63,n64,n65,n66,n67,n68,n69,n70,n71,n72,n73,n74,
n75,n76,n77,n78,n79,n80,n81,n82,n83,n84,n85,n86,n87,n88,
n89,n96,n97,n98,n99,n100,n101,n102,n103,n104,n105,n106,
n107,n108,n109,n110,n111,n112,n113,n114,n115,n116,n117,
n118,n119,n120,n121,n122,n123,n124,n125,n126,n127,
\dp_cluster_0/N34,N32,\dp_cluster_1/N36,N31,n128,n129,n130,
n131,n132,n133,n134,n135,n136,n137,n138,n139,n140,n141,
n142,n143,n144,n145,n146,n147,n148,n149,n150,n151,n152,
n153,n154,n155,n156,n157,n158,n159,n160,n161,n162,n163,
n164,n165,n166,n167,n168,n169,n170,n171,n172,n17
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 集成电路 综合 课程设计