SOC设计实验报告.docx
《SOC设计实验报告.docx》由会员分享,可在线阅读,更多相关《SOC设计实验报告.docx(70页珍藏版)》请在冰豆网上搜索。
SOC设计实验报告
西北工业大学
《SOC设计实践》实验报告
学院:
软件与微电子学院
学 号:
姓 名:
专业:
时间:
实验地点:
实验一、编写一个自动售货机VerilogHDL模型
一、题目描述
编写一个自动售货机VerilogHDL模型,
(1)售货机出售15分的饮料。
(2)投币器只接受5分和1角硬币。
(3)必须提供适当数目的零钱,投币器不找钱。
二、实验内容
1)定义状态,并画出状态转换图,解释设计思路;
答:
我在设计本题所要求的售货机时使用了4个状态,分别为start(00),st1(01),st2(10),st3(11)其中在第三个状态是输出out为1,其他的三个状态输出为0。
状态转换图如下所示:
其中状态机在跳到st3时,由st3直接跳的start状态这使得out只在投币后的一个时钟周期处于高电平而不会长期处于高电平的状态,这与现实的只输出一瓶饮料的结果不相符。
2)使用Verilog语言完成设计;
解:
自动售货机的verilog代码如下所示:
moduleAUTOSEL(five,ten,clk,rst,out);
inputten,five;
inputclk;
inputrst;
outputout;
wireout;
reg[1:
0]state;
parameterst0=2'b00,
st1=2'b01,
st2=2'b10,
st3=2'b11;
always@(posedgeclkornegedgerst)
begin
if(rst==0)
begin
state<=st0;
end
else
begin
case(state)
st0:
begin
if(five==1)
begin
state<=st1;
end
else
begin
if(ten==1)
begin
state<=st2;
end
else
begin
state<=st0;
end
end
end
st1:
begin
if(five==1)
begin
state<=st2;
end
else
begin
if(ten==1)
begin
state<=st3;
end
else
begin
state<=st1;
end
end
end
st2:
begin
if(five==1)
begin
state<=st3;
end
else
begin
if(ten==1)
begin
state<=st3;
end
else
begin
state<=st2;
end
end
end
st3:
begin
state<=st0;
end
default:
begin
state<=st0;
end
endcase
end
end
assignout=(state==st3)?
1:
0;
endmodule
3)编写testbench,并使用SynopsysVCS进行仿真;
答:
testbench测试代码如下:
moduletestbench;
regclk,rst_n;
regfive_cents,ten_cents;
wiresoda_out;
always#1clk=~clk;
initial
begin
clk=0;
five_cents=0;
ten_cents=0;
rst_n=1;
#10rst_n=0;
#10rst_n=1;
//1三个五分的
#10five_cents=1;
#2five_cents=0;
#10five_cents=1;
#2five_cents=0;
#10five_cents=1;
#2five_cents=0;
//2一个五分,一个十分
#20five_cents=1;
#2five_cents=0;
#10ten_cents=1;
#2ten_cents=0;
//3两个十分
#20ten_cents=1;
#2ten_cents=0;
#10ten_cents=1;
#2ten_cents=0;
//4一个十分,一个五分
#20ten_cents=1;
#2ten_cents=0;
#10five_cents=1;
#2five_cents=0;
//5两个五分,一个十分
#20five_cents=1;
#2five_cents=0;
#10five_cents=1;
#2five_cents=0;
#10ten_cents=1;
#2ten_cents=0;
#10
$stop;
end
AUTOSELAUTOSEL(five_cents,ten_cents,clk,rst_n,soda_out);
Endmodule
测试波形图如下所示:
Autosel-vcs仿真波形
最下边一行代表的是投5分,倒数第二行代表的是复位信号,第三行是时钟信号,第二行是投10分,由图可知,在投3个5分,1个5分、1个10分,两个10分,1个10分、1个5分,2个5分、1个10分都可使输出信号为1,满足题意要求。
4)使用SynopsysDC进行综合。
答:
autosel.con约束文件如下:
##################Constrain######################
#reset_design
create_clock-period490.2[get_portsclk]
#创建频率为2.04MHz的时钟信号
set_clock_latency-source-max10[get_clocksclk]
set_clock_latency-max10[get_clocksclk]
set_clock_uncertainty-setup20[get_clocksclk]
set_clock_transition10[get_clocksclk]
set_input_delay-max60-clockclk[get_portsten]
set_input_delay-max60-clockclk[get_portsfive]
set_driving_cell-lib_cellbufbd7[all_inputs]
set_output_delay-max80-clockclk[get_portsout]
set_load[load_ofcb13fs120_tsmc_max/bufbd7/I][get_portsout]
set_max_area10000
DC综合脚本文件dc.tcl如下:
############runscript####################
printvartarget_library
printvarlink_library
check_library
check_tlu_plus_files
read_verilog./rtl/autosel.v
#读文件
Link
#连接到目标库
check_design
#检测设计是否由问题
source./scripts/autosel.con
#加上约束文件
check_timing
#检测时序
compile_ultra-scan-retime
#对文件进行编译
redirect-tee-filerc.rpt{report_constraint-all}
redirect-tee-filert.rpt{report_timing}
redirect-tee-filera.rpt{report_area}
#产生各种约束的报告
write-fddc-hier-outautosel.ddc
#生成最后的.ddc文件
产生的rc.rpt文件:
Information:
Updatingdesigninformation...(UID-85)
****************************************
Report:
constraint
-all_violators
Design:
AUTOSEL
Version:
G-2012.06-SP4
Date:
TueMay2020:
15:
052014
****************************************
Thisdesignhasnoviolatedconstraints.
1
产生的rt.rpt文件:
****************************************
Report:
timing
-pathfull
-delaymax
-max_paths1
Design:
AUTOSEL
Version:
G-2012.06-SP4
Date:
TueMay2020:
15:
052014
****************************************
*Some/alldelayinformationisback-annotated.
OperatingConditions:
cb13fs120_tsmc_maxLibrary:
cb13fs120_tsmc_max
WireLoadModelMode:
Inactive.
Startpoint:
state_reg[0]
(risingedge-triggeredflip-flopclockedbyclk)
Endpoint:
out(outputportclockedbyclk)
PathGroup:
clk
PathType:
max
PointIncrPath
-----------------------------------------------------------
clockclk(riseedge)0.000.00
clocknetworkdelay(ideal)20.0020.00
state_reg[0]/CP(sdcrb1)0.0020.00r
state_reg[0]/Q(sdcrb1)1.2321.23r
U15/Z(an02d1)0.14*21.37r
out(out)0.00*21.37r
dataarrivaltime21.37
clockclk(riseedge)490.20490.20
clocknetworkdelay(ideal)20.00510.20
clockuncertainty-20.00490.20
outputexternaldelay-80.00410.20
datarequiredtime410.20
-----------------------------------------------------------
datarequiredtime410.20
dataarrivaltime-21.37
-----------------------------------------------------------
slack(MET)388.83
左侧一列是每一项计划所用的时间,右侧一列是到目前所用的总时间,而且我们可以看出来实际的到达时间远远小于要求的时间,因此时序方面是满足设计要求的。
1
产生的ra.rpt文件:
****************************************
Report:
area
Design:
AUTOSEL
Version:
G-2012.06-SP4
Date:
TueMay2020:
15:
052014
****************************************
Library(s)Used:
cb13fs120_tsmc_max(File:
/cad/share/ref/libs/mw_lib/sc/LM/sc_max.db)
Numberofports:
5
Numberofnets:
15
Numberofcells:
8
Numberofcombinationalcells:
6
Numberofsequentialcells:
2
Numberofmacros:
0
Numberofbuf/inv:
0
Numberofreferences:
6
Combinationalarea:
10.000000
Buf/Invarea:
0.000000
Noncombinationalarea:
15.750000
NetInterconnectarea:
undefined(Wireloadhaszeronetarea)
Totalcellarea:
25.750000
Totalarea:
undefined
1
组合逻辑电路所用的面积为10um2,非组合逻辑所用面积为15.75um,因此总的面积为25.75um2。
最终的综合电路图:
Autoseldc综合电路
三、实验报告要求
1)设计思路,状态定义,转台转换图。
2)使用VerilogHDL完成设计。
3)编写testbench。
4)VCS完成仿真,对仿真结果进行分析。
5)编写SynopsysDC综合脚本文件dc.tcl以及约束文件autosel.con。
6)使用SynopsysDC进行综合,给出综合后的报告,包括rc.rpt,rt.rpt,ra.rpt,并做必要说明。
7)综合后的电路图。
四、分析与讨论
在做本次试验时,由于刚开始使用的投币信号的脉冲较宽,使得输出信号在时输出信号有效的最后一个信号为高时,状态发生了连续的跳转,最后的输出信号也发生了迅速的变化,考虑时序之后,使用单周期脉冲的输入信号使得输出信号在下一个周期有效,而在过一个周期由于此时输入信号无效,使得状态不再改变而使得输出信号也只有在一个周期内为高电平,从而满足了要求。
此外,在刚开始设计时由于对状态机的编写规范不清楚,使用了ten和five作为always语句的触发条件,虽然可以仿真出波形,但是由于不符合dc综合的规范,使得在dc时出现了“将CLK信号作为输入信号”的错误,状态机的下周期逻辑只能使用clk作为触发条件。
五、教师评语
签名:
日期:
成绩
实验二、设计PCM30基群帧同步电路
一、题目描述
设计PCM30基群帧同步电路,该PCM30机群系统结构如下:
输入输出信号说明:
DATA:
输入串行码流,速率为2.04Mb/S;
CLK:
输入时钟,频率为2.04MHz;
/FLOSS:
输出失步信号,低电平有效。
电路功能说明:
1.输入码流DATA,速率为2.04Mb/S;每帧256bit,其中前8bit为帧同步码;偶数帧的帧同步码为10011011,奇数帧的帧同步码为110XXXXX(X为任意值)。
2.系统初始状态为失步态,失步信号FLOSS输出低电平,电路在输入码流里逐比特搜寻同步码,当搜寻到第一个偶帧同步码后,电路转为逐帧搜寻,当连续三帧均正确地搜寻到同步码后,系统状态转为同步态,失步信号输出高电平;否则电路重新进入逐比特搜寻状态。
3.系统处于同步态后,当连续四帧检出的同步码均错误,则系统转为失步态,失电路时序说明:
1)输入信号DATA与CLK的时序关系
2)同步过程时序与DATA的帧结构
二、实验内容
1)定义状态,并画出状态转换图,解释设计思路
答:
为了实现pcm30的功能,我的分析思路如下:
首先,还没有进入帧同步状态时,是位寻址状态依次为bit0,bit1,bit2,bit3,bit4,bit5,bit6,bit7;
当满足了一次偶校验之后,要进行空248位的处理,这个状态可以用bitblank来表示;
再次进行一次奇校验用oddcheck0,oddcheck1,oddcheck2三个状态来处理;
奇校验完成进入oddblank来表示空缺253位;
在此进行一次偶校验用evencheck0,evencheck1,evencheck2,evencheck3,evencheck4,evencheck5,evencheck6,evencheck7来表示,通过后使floss=1;
如果通过了偶校验则进入evenblank状态来使pcm30空缺248位,此时进入帧校验的奇校验;
帧校验的奇校验使用三个状态来完成,分别为:
oddhold0,oddhold1,oddhold2来校验奇帧的1、2、3位;
奇校验可能产生不同的结果,例如在0,1,2位产生不符合和符合一共4种情况,这样一来就不能只空固定的位数了,因为假如在0位就不符合的话,在0位就跳出了,这样需要跳过255位,与之类似,1位不符合要跳254位,而3为符合于不符合都是要跳过253位的,因此应该跳的位数随着不同的情况来变化,需要有跳255,254,253位状态oddblank0,oddblank1和oddblank2的分别对应于三个奇校验的状态oddhold0,oddhold1,oddhold2;
oddblank0,oddblank1和oddblank2结束后的状态应该跳到偶校验的状态中,使用8个状态来完成,分别为:
evenhold0,evenhold1,evenhold2,evenhold3,evenhold4,evenhold5,evenhold6,evenhold7;
前7个状态不满足或者第8个状态结束分别跳转到evenblank0,evenblank1,evenblank2,evenblank3,evenblank4,evenblank5,evenblank6,evenblank7,结束后跳转到oddhold处。
状态跳转图如下所示:
2)使用Verilog语言完成设计;
答:
pcm30实验代码如下:
modulepcm30(clk,rst,data,FLOSSN);
inputclk,data,rst;
outputFLOSSN;
wirenet_data,net_clk,net_FLOSSN,net_rst;
pc3d01clk_iopad(.PAD(clk),.CIN(net_clk));
pc3d01data_iopad(.PAD(data),.CIN(net_data));
pc3d01rst_iopad(.PAD(rst),.CIN(net_rst));
pc3o05FLOSSN_iopad(.I(net_FLOSSN),.PAD(FLOSSN));
pcmI_pcm(.clk(net_clk),.rst(net_rst),.data(net_data),.floss1(net_FLOSSN));
endmodule
modulepcm(clk,rst,data,floss1);
inputclk,rst,data;
outputfloss1;
wirefloss1;
regfloss;
reg[7:
0]state;
reg[7:
0]btblkct;
reg[7:
0]oddblkct;
reg[7:
0]oddblkct0;
reg[7:
0]oddblkct1;
reg[7:
0]oddblkct2;
reg[7:
0]evenblkct;
reg[7:
0]evenblkct0;
reg[7:
0]evenblkct1;
reg[7:
0]evenblkct2;
reg[7:
0]evenblkct3;
reg[7:
0]evenblkct4;
reg[7:
0]evenblkct5;
reg[7:
0]evenblkct6;
reg[7:
0]evenblkct7;
reg[1:
0]flsct;
parameterbit0=8'b00000000,//0
bit1=8'b00000001,//1
bit2=8'b00000010,//2
bit3=8'b00000011,//3
bit4=8'b00000100,//4
bit5=8'b00000101,//5
bit6=8'b00000110,//6
bit7=8'b00000111,//7
bitblank=8'b00001000,//8
oddcheck0=8'b00001001,//9
oddcheck1=8'b00001010,//10
oddcheck2=8'b00001011,//11
oddblank=8'b00001100,//12
evencheck0=8'b00010000,//16
evencheck1=8'b00010001,//17
evencheck2=8'b00010010,//18
evencheck3=8'b00010011,//19
evencheck4=8'b00010100,//20
evencheck5=8'b00010101,//21
evencheck6=8'b00010110,//22
evencheck7=8'b00010111,//23
evenblank=8'b00011000,//24
oddhold0=8'b00100000,//32
oddhold1=8'b00100001,//33
oddhold2=8'b00100010,//34
oddblank0=8'b00100011,//35
oddblank1=8'b00100100,//36
oddblank2=8'b00100101,//37
evenhold0=8'b00101000,//40
evenhold1=8'b00101001,
evenhold2=8'b00101010,
evenhold3=8'b00101011,
evenhold4=8'b00101100,
evenhold5=8'b00101101,
evenhold6=8'b00101110,
evenhold7=8'b00101111,
evenblank0=8'b00110000,
evenblank1=8'b00110001,
evenblank2=8'b00110010,
evenblank3