EDA电子技术实训报告.docx
《EDA电子技术实训报告.docx》由会员分享,可在线阅读,更多相关《EDA电子技术实训报告.docx(28页珍藏版)》请在冰点文库上搜索。
EDA电子技术实训报告
一、课程设计的内容
1、学习EDA仿真技术,并使用Multisim仿真软件完成指定训练内容。
2、学习SOPC技术,并在FPGA上完成相关内容,掌握和理解SOPC的真正内涵。
3、通过学习了解Synopsys软件,掌握IC设计基础。
二、课程设计的要求与数据
1、严格按照分组情况进行实训;
2、完成指定的设计任务;
3、相关设计数据要填入指定表格;
4、课程设计的报告严格按照学校指定格式执行;
5、实训期间不得迟到早退,否则将严肃处理。
三、课程设计应完成的工作
1、学习Multisim仿真软件,并完成以下设计任务:
Lab1-9。
2、学习SOPC技术,并完成以下设计任务:
Task1-5。
3、学习IC设计技术基础,并完成以下设计任务:
SynopsysIC设计基础,主要学习linux基本操作,IC设计基本流程,概念,完成DesignCompiler综合工具实验。
四、应收集的资料及主要参考文献
1、谢云等,现代电子技术实践课程指导,机械工业出版社,北京,2006
2、张志刚,FPGA与SOPC设计教程—DE2实践,西安电子科技大学出版社,西安,2007
3、江国强,SOPC技术与应用,机械工业出版社,北京,2006
Multisim实验
实验一:
单机放大电路
一、实验目的
1、熟悉Multisim9软件的使用方法。
2、掌握放大器静态工作点的仿真方法及其对放大器性能的影响。
3、学习放大器静态工作点、电压放大倍数、输入电阻、输出电阻的仿真方法,了解共射极电路特性。
二、虚礼实验仪器及器材
双踪示波器信号发生器交流毫伏表数字万用表
三、实验原理图
四、实验内容
1、静态数据仿真:
仿真数据(对地数据)单位:
V
计算数据单位:
V
基极
集电极
发射极
Vbe
Vce
Rp
2.83387V
6.12673V
2.20436V
3.0045V
3.63606V
10KΩ
2、动态仿真一:
示波器显示输入输出波形:
输出波形与输入波形反相。
3、动态仿真二:
删除R6后示波器波形:
记录数据如下表:
仿真数据(注意填写单位)
V0有效值
Vi有效值
V0有效值
Av
-14.099mV
1.609V
114.928
加上5.1k欧和330欧的电阻记录数据如下表:
仿真数据(注意填写单位)
计算
RL
Vi
V0
Av
5.1KΩ
-14.128mv
272.531mv
19.290
330Ω
-14.103mv
34.365mv
2.437
其他不变,增大和减小滑动变阻器的值,观察V0的变化,并记录波形:
Vb
Vc
Ve
画出波形
Rp增大
减小
增大
减小
Vo幅度变小
Rp减小
增大
减小
增大
Vo幅度变大
四、动态仿真三:
1、测量输入电阻Ri
在输入端串联一个5.1k的电阻,如图所示,并且连接一个万用表,如图连接。
启动仿真,记录数据,并填表:
仿真数据(注意填写单位)
计算
信号发生器有效电压值
万用表的有效数据
Ri
10mv
6.84mv
11KΩ
2、测量输出电阻R0
仿真数据
计算
VL
V0
R0
102.572mV
199.583mV
4.461KΩ
五、思考题
1、画出如下电路:
2、如何把元件水平翻转和垂直翻转呢?
如图所示
答:
Q3变Q4按CTRL+R,Q3变Q5可按ALT+Y。
3、如何更改元件的数值呢?
答:
双击要修改的元件,在VALUE目录下的RESISTANCE栏修改元件数值。
4、如果去掉实验中的R7既是100欧电阻,输出波形有何变化?
5、元件库中有些元件后带有VIRTUAL,它表示什么意思?
答:
说明这些是虚拟元件,只有虚拟软件才能更改参数。
实验二射极跟随器
一、实验目的
1、熟悉Multisim9软件的使用方法。
2、掌握放大器静态工作点的仿真方法及其对放大器性能的影响。
3、学习放大器静态工作点、电压放大倍数、输入电阻、输出电阻的仿真方法,了解共射极电路特性。
4、学习Multisim9参数扫描方法
5、学会开关元件的使用
二、虚礼实验仪器及器材
双踪示波器信号发生器交流毫伏表数字万用表
三、实验原理图
四、实验内容(数据记录)
R1=150KΩ
Vb
Vc
Ve
Ie=Ve/Re
8.15063V
12V
7.48494V
4.1583mV
测量电压放大倍数
Vi(单位)
V0(单位)
AV=V0/VI
2.121V
2.095V
0.988
测量输入电阻
Vs(图中1端电压)
Vi(图中6端电压)
Ri=Vi*Rs/(Vs-Vi)
2.121V
1.974V
19.137kΩ
V0
vl
R0=(V0-VL)*RL/VL
2.108V
2.095V
910.118Ω
测量输出电阻
五、思考题
1、分析设计跟随器的性能和特点
答:
输入电阻大、输出电阻小、电压放大倍数接近1。
2、创建如图所示的整流电路,并进行仿真,观察输入和输出波形。
3、仿真计数器和数码管显示电路
4、运用MultiSIM的交互式仿真手段,模拟实际按键操作
二、实验环境
MultiSIMv9.0、Windows2000professional、PC机
三、原理图
四、实验内容
1、上电时的电容充电特性瞬态分析图形:
2、运行仿真,切换J2状态,观察数码管显示为0。
3、设计迟滞比较器电路,加正弦信号源(设置有效值为1.76V,电压偏移为2.5V,频率60Hz)到迟滞比较器输入端,运行仿真,用虚拟示波器观察迟滞比较器的输入输出特性。
VI:
2.489VVO:
1.2V
4、切换J1,数码管示数保持不变。
5、移去电容C2示波器显示结果(红色为输入电压,蓝色为输出电压):
6、J3每闭合一次,数码管的示数+1
7、接上电容C2示波器显示结果:
数码管示数没有变化。
(1)接通±12V电源,调节电位器,使输出波形从无到有,从正弦波失真到不失真。
描绘出输出端的波形,记下临界起振、正弦波输出及失真情况下的Rw值,分析负反馈强、弱对起振条件及输出波形的影响。
起震RW:
2.8KΩ
正弦波输出RW:
2.9KΩ
图中可以看出顶部开始失真,失真情况下的Rw值:
3.7KΩ。
(2)输出最大不失真情况下,用交流毫伏表测量输出电压,反馈电压,分析研究震荡的条件。
反馈电压:
5.107V
输出电压:
7.663V
(3)断开二极管D1、D2,重复以上实验,并比较分析有何不同。
正弦波、最大不失真RW:
2.8KΩ起震临界点RW:
2.7KΩ
失真RW:
2.9KΩ输出电压:
8.008V
反馈电压:
5.347V
2、方波发生器:
(1)描绘出示波器中方波和三角波
(2)改变Rw的位置,测出波形的输出频率范围
3.2894KHz——3.4128KHz
(3)如果把D1改为单向稳压管,输出波形的变化,并分析1N5758稳压管的作用
双向稳压管的作用是双向店亭钳位,使震荡输出的双向脉冲基本对称。
SOPC实验
实验二驱动1602液晶显示
任务要求:
1、弄清楚液晶1602驱动的原理,理解并写在实训报告中
2、在DE2板上的液晶上显示你的名字和学校的名字。
建议步骤:
1、建立所需其他辅助模块,包括分频等;
2、建立LCD控制模块(用纯硬件实现,也可以先实现NIOSII,再用C实现);
驱动显示原理:
用LCD显示一个字符时,因为一个字符由6X8或者8X8点阵组成,既要找到和显示屏幕上某几个位置对应的显示RAM区的八个字节,还要使每个字节的不同位为“1”,其他的为“0”,为“1”的点亮,为“0”的不亮,这样一来就组成了某个字符。
但是由于内带字符发生的控制器来说,可以让控制器工作在文本方式上,根据在LCD上开始显示的行列号及每行的列数找出显示RAM对应的地址,设立光标。
1602液晶模块内部的字符发生储存器已经存储了160个不同的点阵字符图形,这些字符有:
阿拉伯数字、英文字母的大小写等等,比如大写字母“A”的代码是01000001B(41H),显示模块把地址41H中的点阵字符图形显示出来就可以了。
CGROM和CGRAM中字符代码和字符图形的对应关系如下图:
程序代码如下:
modulelcd1602(clk,rst,lcd_e,lcd_rw,lcd_rs,data,lcd_on,lcd_blon);
inputclk,rst;
outputlcd_e,lcd_rw,lcd_rs,lcd_blon,lcd_on;
output[7:
0]data;
reglcd_rw,lcd_rs;
reg[7:
0]data;
reg[9:
0]state;
reg[5:
0]address;
reg[22:
0]cnt;
regclk500hz;
parameterIDLE=10'b0000000000;
parameterCLEAR=10'b0000000001;//清屏
parameterRETURNCURSOR=10'b0000000010;//归home位
parameterSETMODE=10'b0000000111;//输入方式设置,读写数据后ram地址增/减1;画面动/不动
parameterSWITCHMODE=10'b0000001111;
//显示状态设置,显示开/关;光标开/关;闪烁开/关
parameterSHIFT=10'b0000011100;//光标画面滚动画面/光标平移一位;左/右平移一位
parameterSETFUNCTION=10'b0000111100;//工作方式设置1:
8/1:
4位数据接口;两行/一行显示;5x10/5x7点阵
parameterSETCGRAM=10'b0001000000;//设置CGRAM
parameterSETDDRAM1=10'b0010000001;//设置DDRAM
parameterSETDDRAM2=10'b0010000010;//设置DDRAM
parameterREADFLAG=10'b0100000000;//读状态
parameterWRITERAM1=10'b1000000001;//写RAM
parameterWRITERAM2=10'b1000000010;//写RAM
parameterREADRAM=10'b1100000000;//读RAM
assignlcd_on=1'b1;
assignlcd_blon=1'b1;
always@(posedgeclk)//由50MHZ时钟分频得到4HZ时钟
beginif(cnt==19'h7a120)//19'h7a120=19'd500000
begincnt<=0;clk500hz<=~clk500hz;//500000*20ns=1000000us取反即为2ms=1/500s
end
elsecnt<=cnt+1;
end
assignlcd_e=clk500hz;
function[7:
0]ddram;//
input[5:
0]n;
begin
case(n)
//下面修改成你所需内容
6'b000_000:
ddram=8'b0101_0011;//S
6'b000_001:
ddram=8'b0101_0101;//U
6'b000_010:
ddram=8'b0010_0000;//
6'b000_011:
ddram=8'b0010_0000;//
6'b000_100:
ddram=8'b0100_1010;//J
6'b000_101:
ddram=8'b0100_1001;//I
6'b000_110:
ddram=8'b0100_0001;//A
6'b000_111:
ddram=8'b0100_1110;//N
6'b001_000:
ddram=8'b0100_0111;//G
6'b001_001:
ddram=8'b0100_0100;//D
6'b001_010:
ddram=8'b0101_0101;//U
6'b001_011:
ddram=8'b0101_0100;//T
endcase
endendfunction
always@(posedgeclk500hzornegedgerst)
if(!
rst)
begin
state<=IDLE;
address<=6'b000000;
data<=8'b00000000;
lcd_rs<=0;
lcd_rw<=0;
end
elsebegin
case(state)
IDLE:
beginstate<=CLEAR;
data<=8'bzzzz_zzzz;
end
CLEAR:
beginlcd_rs<=0;lcd_rw<=0;
data<=8'h01;
state<=SETFUNCTION;//清屏
end
SETFUNCTION:
beginlcd_rs<=0;lcd_rw<=0;
data<=8'h3c;
state<=SWITCHMODE;
end
SWITCHMODE:
beginlcd_rs<=0;lcd_rw<=0;//显示状态开关设置0C
data<=8'h0c;//开光标、开闪烁
state<=SETMODE;
end
SETMODE:
beginlcd_rs<=0;lcd_rw<=0;
data<=8'h06;//采取增量方式,光标不移动
state<=SHIFT;
end
SHIFT:
beginlcd_rs<=0;lcd_rw<=0;
data<=8'h18;
state<=SETDDRAM1;
end
SETDDRAM1:
beginlcd_rs<=0;lcd_rw<=0;data<=8'b10000100;//显示数据存储器地址804
state<=WRITERAM1;end
SETDDRAM2:
beginlcd_rs<=0;lcd_rw<=0;data<=8'b11000010;//显示数据存储器地址80402
state<=WRITERAM2;end
WRITERAM1:
begin
if(address<=6'b000_111)
begin
lcd_rs<=1;
lcd_rw<=0;
data<=ddram(address);
address<=address+1;
state<=WRITERAM1;
end
else
begin
lcd_rs<=0;
lcd_rw<=0;
state<=SETDDRAM2;
end
end
WRITERAM2:
begin
if(address<=6'b010_100)begin
lcd_rs<=1;
lcd_rw<=0;
data<=ddram(address);
address<=address+1;
state<=WRITERAM2;
end
else
begin
lcd_rs<=0;
lcd_rw<=0;
state<=SHIFT;
address<=6'b000000;
end
end
endcase
end
endmodule
实验结果截图:
实验三VGA显示矩形框
任务:
1、弄清楚VGA显示的原理,理解并写在实训报告中
2、在VGA显示器上显示一个矩形框。
建议步骤:
1、建立VGA显示所需其他辅助模块,包括分频等;
2、建立VGA控制模块(用纯硬件实现,也可以先实现NIOSII,再用C实现);
VGA显示原理:
FPGA对系统进行编程可输出红、绿、蓝三基色信号和HS、VS行场扫描同步信号。
当FPGA接受输出的控制信号后,内部的数据选择器模块根据控制信号选择相应的图像生成模块,输出图像信号,与行场扫描时序信号一起通过VGA接口电路送入显示器,VGA显示器上便可看到对应在的彩色图像。
主芯片时钟由外部提供,由一片晶振提供50MHz频率的时钟源,接入芯片全局时钟引脚CLK。
控制中,只需要考虑行同步信号(Hs)、场同步信号(Vs)以及红绿蓝(RGB)这5个信号。
如果能从FPGA发出这5个信号到VGA接口,就可以实现对VGA的控制。
系统模块图如下:
程序源代码:
module vga_controller(iclk,irst_n,
ovga_r,ovga_g,
ovga_b,
ovga_sync,
ovga_blank,
ovga_clock,
ovga_h_sync,
ovga_v_sync
);
input iclk,irst_n; //iclk应为25.175MHZ
output[9:
0] ovga_r;
output[9:
0] ovga_g;
output[9:
0] ovga_b;
output ovga_sync; //同步信号输出
output ovga_blank; //消隐信号输出
output ovga_clock; //时钟输出
output reg ovga_h_sync; //水平同步信号输出
output reg ovga_v_sync; //垂直同步信号输出
reg [9:
0]h_cnt; //行扫描计数器
reg [9:
0]v_cnt; //列扫描计数器//水平参数(单位:
像素)
parameter h_sync_cyc=96,
h_sync_back=45+3,
h_sync_act=640,
h_sync_front=13+3,
h_sync_total=800;
//垂直参数(单位:
线)
parameter v_sync_cyc=2,
v_sync_back=30+2,
v_sync_act=480,v_sync_front=9+2,
v_sync_total=525;
//起始偏移
parameter x_start=h_sync_cyc+h_sync_back,
y_start=v_sync_cyc+v_sync_back;
assign ovga_blank=ovga_h_sync & ovga_v_sync;
assign ovga_sync=1'b0;
assign ovga_clock=iclk;
assign valid = (h_cnt > x_start) && (h_cnt < x_start+h_sync_act)
&& (v_cnt > y_start) && (v_cnt < y_start+v_sync_act);
wire[9:
0] xpos,ypos; //有效显示区坐标
assign xpos = h_cnt-10'd144;
assign ypos = v_cnt-10'd34;
//--------------------------------------------------
//显示一个矩形框
wire a_dis,b_dis,c_dis,d_dis; //矩形框显示区域定位
reg[9:
0] aa_dis;
reg[9:
0] bb_dis;
reg[9:
0] cc_dis;
reg[9:
0] dd_dis;
reg[9:
0] ee_rdy;
always @(posedge iclk or negedge irst_n)
begin
if(!
irst_n)
begin
aa_dis<=10'd0;
bb_dis<=10'd0;
cc_dis<=10'd0;
dd_dis<=10'd0;
end
else
begin
if(a_dis)
aa_dis<=10'h3ff;
else
aa_dis<=0;
if(b_dis)
bb_dis<=10'h3ff;
else
bb_dis<=0;if(c_dis)
cc_dis<=10'h3ff;
else
cc_dis<=0;
if(d_dis)
dd_dis<=10'h3ff;
else
dd_dis<=0;
if(e_rdy)
ee_rdy<=10'h3ff;
else
ee_rdy<=0;
end
end
assign a_dis = ( (xpos>=200) && (xpos<=220) )
&& ( (ypos>=100) && (ypos<=380) );
assign b_dis = ( (xpos>=440) && (xpos<=460) )
&& ( (ypos>=100) && (ypos<=380) );
assign c_dis = ( (xpos>=220) && (xpos<=440) )
&& ( (ypos>100) && (ypos<=120) );
assign d_dis = ( (xpos>=220) && (xpos<=440) )
&& ( (ypos>=360) && (ypos<=380) );
//显示一个小矩形
wire e_rdy; //矩形的显示有效矩形区域
assign e_rdy = ( (xpos>=310) && (xpos<=330) )
&& ( (ypos>=230) && (ypos<=250) );
//--------------------------------------------------
//r,g,b控制液晶屏颜色显示,背景显示蓝色,矩形框显示红蓝色
assign ovga_r = valid && e_rdy ?
ee_rdy :
1'b0;
assign ovga_g = valid && (a_dis | b_dis | c_dis | d_dis) ?
10'h3ff:
1'b0;
assign ovga_b = valid &&(a_dis | b_dis | c_dis | d_dis) ?
10'h3ff :
1'b0;if(!
irst_n)
begin
h_cnt<=0;
ovga_h_sync<=0;
end
else
begin
if(h_cnt计数器计数
h_cnt<=h_cnt+1;
else
h_cnt<=0;
if(h_cnt生成h_sync
ovga_h_sync<=0;
else
ovga_h_sync<=1;
e