EDA实验报告.docx
《EDA实验报告.docx》由会员分享,可在线阅读,更多相关《EDA实验报告.docx(32页珍藏版)》请在冰豆网上搜索。
![EDA实验报告.docx](https://file1.bdocx.com/fileroot1/2023-2/1/d3010623-2c92-4001-a5d0-641cebf96979/d3010623-2c92-4001-a5d0-641cebf969791.gif)
EDA实验报告
《CPLD及FPGA设计》
实验报告
姓名:
学号:
班级:
专业:
电气工程及其自动化
学院:
电气与信息工程学院
江苏科技大学张家港校区
2011年12月
实验一:
8-3编码器及QuartusII的基础
一、实验目的
1.学习组合逻辑电路,学习编码器的功能与定义,学习Verilog和VHDL语言
2.熟悉利用QuartusII开发数字电路的基本流程和QuartusII软件的相关操作
二、实验内容
编写8‐3编码器的Verilog代码和VHDL代码,编译下载后通过拨动拨码开关观察LED灯的变化,来验证8‐3编码器是否成功。
三、实验原理
在数字系统中,常常需要将某一信息(输入)变换为某一特定的代码(输出)。
把二进制码按一定的规律排列,例如8421码、格雷码等,使每组代码具有一特定的含义(代表某个数字或是控制信号)称为编码。
具有编码功能的逻辑电路称为编码器。
编码器有若干个输入,在某一时刻只有一个输入被转换为二进制码。
例如8线‐3线编码器和10线‐4线编码器分别有8输入、3位输出和10位输入、4位输出。
8‐3编码器的真值表见表1。
表18—3编码器真值表
输入
输出
A7A6A5A4A3A2A1A0
00000001
00000010
00000100
00001000
00010000
00100000
01000000
10000000
Y2Y1Y0
000
001
010
011
100
101
110
111
四、实验步骤
1.选择“开始”→“所有程序”→“Altera”→“QuartusII9.0”→“QuartusII9.0(32‐Bit)”,启动软件。
图1QuartusII启动界面
2.选择“File”→“NewProjectWizard”,出现“Introduction”页面,如图2所示,该页面介绍所要完成的具体任务。
图2选择NewProjectWizard
图3新建工程向导
3.单击“Next”按钮,进入工程名称的设定、工作目录的选择。
图4指定工程路径、工程名和顶层实体名
4.如图4所示。
在对话框中第一行选择工程路径;第二行输入工程名,第三行输入顶层文件的实体名(注意:
工程名必须与顶层实体名相同,工程目录可以随意设置,但必须是英文的目录,工程名跟顶层实体名必须也是英文开头。
不要将文件夹设在计算机已有的安装目录中,更不要将工程文件直接放在安装目录中。
文件夹所在的路径名和文件夹名不能用中文,不能用空格,不能用括号,也不能以数字开头这里输入encoder8_3;单击“Next”按钮,出现如图5所示的对话框。
图5新建工程文件添加对话框
在图所示的对话框中,可以为工程添加先期已经输入的设计文件,制定用户自定义的元件库的路径,这里没有事先输入好的文件,也没有自定义的元件库,单击“Next”按钮如图5所示的对话框。
进入下一步,出现如图6的新建工程器件选择对话框。
图6新建工程器件选择对话框
在图所示的对话框中,我们根据本试验箱所选的芯片型号,在Family下拉菜单中选择
CycloneII系列。
然后在Filters下的Package下拉菜单中选择封装形式FBGA,Pincount下拉菜单中选择管脚数672,Speedgrade下拉菜单中选择速度级别8;然后在Availabledevices中选择EP2C35F672C8器件。
点击“Next”进入下一步。
图6所示的对话框,用户指定在QuartusII之外的用于设计输入。
5.单击“Next”进入图
综合、仿真、时序分析的第三方EDA工具对话框,这里都不选,直接单击“Next”进入工程信息对话框.
图7工程信息对话框点击Next进入图8新建工程完毕最后单击“Finish”完成工程建立。
图8新建工程完毕
6.新建设计文件,选择“File|New”,在New对话框中选择DeviceDesignFiles下的VerilogFile,单击OK,完成新建设计文件。
如图9所示。
图9在QuattusII里面新建文件
7.在新建设计文件中输入VDHL程序,源代码如下:
libraryieee;
useieee.std_logic_1164.all;
entityencoder8_3is
port(
y0,y1,y2,y3,y4,y5,y6,y7:
instd_logic;
c,b,a:
outstd_logic);
end;
architectureoneofencoder8_3is
signaljieguo:
std_logic_vector(7downto0);
begin
jieguo<=y7&y6&y5&y4&y3&y2&y1&y0;
process(jieguo)
begin
casejieguois
when"00000001"=>c<='0';b<='0';a<='0';
when"00000010"=>c<='0';b<='0';a<='1';
when"00000100"=>c<='0';b<='1';a<='0';
when"00001000"=>c<='0';b<='1';a<='1';
when"00010000"=>c<='1';b<='0';a<='0';
when"00100000"=>c<='1';b<='0';a<='1';
when"01000000"=>c<='1';b<='1';a<='0';
when"10000000"=>c<='1';b<='1';a<='1';
whenothers=>null;
endcase;
endprocess;
end;
本例只有一个设计文件,即为顶层设计文件,它的实体名一定要与顶层设计文件名encoder8_3一致,然后保存到工程文件夹Project下,命名为encoder8_3,即为顶层设计文件。
如图10所示。
图10保存文件
10.选择“Processing→StartCompilation”,或者单击工具栏中的StartCompilation按钮进行全程编译,也可以在“Processing”菜单中选择“Start”子菜单中的分布编译操作。
图11编译工程
11.编译的时候,QuartusII会给出编译进度,“CompilationReport”窗口会给出编译结果,编译结果会随着编译进度随时更新。
Message窗口会给出编译过程的具体情况,包括“information,warning,error”等。
“information”多是完成的一些编译的进展描述;可能会出现很多warning但并不影响编译的进行;如果出现error,那么设计是不成功的,用户需要改正这些错误,然后重新编译。
可以对错误进行定位,选中错误信息,右击,在弹出的菜单中选择Locate来实现对错误的定位。
编译成功以后,会出现如下图所示的提示。
图12编译结果提示
12.仿真设置
在QuartusII中点击选择file-new弹出如图x的界面,按照图13选择。
图13新建仿真图设置界面
13.仿真结果
实验二:
半加器与全加器
一、实验目的
1.学习半加器和全加器的设计,进一步了解、熟悉和掌握FPGA开发软件QuartusII的使用方法
2.学习VerilogHDL和VHDL的编程方法
3.巩固QuartusII的仿真和图形设计方法。
二、实验内容
编写半加器和全加器的Verilog代码和VHDL代码并仿真,编译下载验证。
三、实验原理
算术运算式数值系统的基本功能,更是计算机中不可缺少的组成单元。
1.半加器
半加法和全加法是算术运算电路中的基本单元,它们是完成1位二进制相加的一种组合逻辑电路。
一位加法器的真值表见表1.7‐1;由表中可以看见,这种加法没有考虑低位来的进位,所以称为半加。
半加器就是实现表1.7‐1中逻辑关系的电路。
二进制输入
和输出
进位输出
A
B
S
Co
0
0
0
0
0
1
1
0
1
0
1
0
1
1
0
1
2.全加器
全加器能进行加数、被加数和低位来的进位信号相加,并根据求和结果给出该位的进位信号。
根据它的功能,可以列出它的真值表,如表1.7‐2所示。
表1.7‐2全加器的真值表
二进制输入
低位进位输入
和输出
进位输出
A
B
Ci
S
Co
0
0
0
0
0
0
1
0
1
0
1
0
0
1
0
1
1
0
0
1
0
0
1
1
0
0
1
1
0
1
1
0
1
0
1
1
1
1
1
1
3、半减法和全减法
半减法和全减法与加法器一样是算术运算电路中的基本单元。
半减器和全减器的设计方法和设计加法器相同,但是实际上,为了简化系统结构,通常不设计减法器,而是将减法运算变为加法运算来出来,使运算器即能实现加法器运算,又能实现减法器运算。
一般采用加补码的方法代替减法运算。
从原理图中可见,需要有两个数据输入位还有一个低位进位,数据输入我们采用实验箱上的SW1和SW2,进位采用SW3,LED1显示和输出,LED2显示进位输出。
引脚分配情况
表1.7‐3引脚分配
四、实验步骤
1.新建工程,取名为adder,如下图所示。
2.新建VHDL设计文件“File|New”,在New对话框中选择DeviceDesignFiles下的VHDLFile,单击OK,完成新建设计文件。
3.在新建设计文件中输入VHDL程序,源代码如下:
LIBRARYIEEE;
USEIEEE.STD_LOGIC_1164.ALL;
entityadderis
port
(
A:
instd_logic;
B:
instd_logic;
Ci:
instd_logic;
S:
outstd_logic;
Co:
outstd_logic
);
endadder;
architecturert1ofadderis
begin
S<=(AxorB)xorCi;
Co<=(AandB)or(AandCi)or(BandCi);
endrt1;
4.生成“Symbol”文件,新建“BlockDiagram/SchematicFile”文件,在文件中添加刚刚生成的“Symbol”以及输入输出管脚,最后完整的系统顶层模块图如图1.5‐3所示。
5.保存文件,使用qsf或者tcl进行管脚分配(相应的文件在本工程里面都可以找到)。
6.对该工程文件进行全程编译处理,若在编译过程中发现错误,则找出并更正错误,直至编译成功为止。
7.新建“VectorWaveformFile”文件进行波形仿真。
其中A,B为输入数据,Ci低位进位。
8.下载完成后,通过SW1—SW3控制着输入的电平,观察实验结果。
实验三:
分频器
一、实验目的
1.学习分频器的设计,进一步了解、熟悉和掌握FPGA开发软件QuartusII的使用方法
2.学习VerilogHDL和VHDL的编程方法
3.学会使用VectorWave功能仿真
4.掌握使用多种方法分配管脚
二、实验内容
编写一个分频器的Verilog代码和VHDL代码并仿真,编译下载验证。
三、实验原理
在数字电路中,时钟信号的分频是很常见的电路。
分频器除了可以对时钟信号频率做除以二的计算外,分频器同时很类似涟波计数器。
涟波计数器是计数器的一种,它属于异步设计。
因为触发器并非皆由同一个时钟信号同步操作,所以它非常节省电路面积。
本实验要设一个带选择的分SEL[1:
0]用于选择是几分频。
分频器设计原理框图如图所示:
图1设计原理框图
从原理图中可见,核心板的时钟是50MHz,通过sel[1:
0]选择分频数,00:
不分频;01:
12.5M分频;10:
25M四分频;11:
50M分频。
采用SW1‐SW2设置分频值,SW3复位。
LED1为时钟的输出,通过调整SW1、SW2,可以得到不同的闪烁频率。
引脚分配情况
表1引脚分配
设计端口
芯片引脚
开发平台模块
设计端口
芯片引脚
开发平台模块
clk
PIN_P2
CLK1
rst
PIN_W10
SW3
s2x[1]
PIN_Y13
SW2
s2x[0]
PIN_AA16
SW1
outx
PIN_AB20
LED1
四、实验步骤
1.新建工程,取名为frediv
2.新建VHDL设计文件,选择“File|New”,在New对话框中选择DeviceDesignFiles
下的VHDLFile,单击OK,完成新建设计文件。
3.在新建设计文件中输入VHDL程序,源代码如下:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entityfenpinis
port(clk:
instd_logic;
s2x:
instd_logic_vector(1downto0);
outx:
outstd_logic_vector(1downto0);
q:
outstd_logic);
end;
architecturebhvoffenpinis
signalq1:
std_logic_vector(2downto0);
begin
process(clk)
begin
ifclk'eventandclk='1'then
q1<=q1+1;
endif;
cases2xis
when"00"=>q<=clk;
when"01"=>q<=q1(0);
when"10"=>q<=q1
(1);
when"11"=>q<=q1
(2);
whenothers=>null;
endcase;
outx<=nots2x;
endprocess;
end;
此程序通过两个输入端来选择进行何种分频,
‘00’对应1分频,即不分频,
‘01’对应2分频
‘10’对应4分频
‘11’对应8分频
4.生成“Symbol”文件,新建“BlockDiagram/SchematicFile”文件,在文件中添加刚2所示刚生成的“Symbol”以及输入输出管脚,最后完整的系统顶层模块图如图
图2顶层模块图
5.保存文件,使用qsf或者tcl进行管脚分配
6.对该工程文件进行全程编译处理,若在编译过程中发现错误,则找出并更正错误,直至编译成功为止。
7.新建“VectorWaveformFile”文件进行波形仿真。
8.下载完成后,观察实验结果。
五、实验结果
四分频
二分频
一分频
实验四:
七段数码管扫描显示
一、实验目的
1.学习动态扫描显示的原理,进一步了解、熟悉和掌握FPGA开发软件QuartusII的使用方法
2.学习VerilogHDL和VHDL的编程方法
3.学会使用VectorWave功能仿真
4.掌握使用多种方法分配管脚
二、实验内容
利用动态扫描的方式设计一个在8个数码管上面分别显示1,3,5,7….的程序
三、实验环境
硬件:
EP2C35实验箱、USBByteBlaster下载电缆
软件:
AlteraQuartusII9.0集成开发环境
四、实验原理
一般来说,多个数码管的连接并不是把每个数码管都独立的与可编程逻辑器件连接,而是把所有的LED管的输入连在一起。
如图3.1‐1所示。
其中每个数码管的8个段:
a、b、c、d、e、f、g、h(h是小数点),都分别连到SEG_D0~SEG_D7,8个数码管分别由8个选通信号DIG_C0~DIG_C7来选择。
被选通的数码管显示数据,其余关闭。
如在某一时刻DIG_C2为低电平“0”,其余选通信号为高电平“1”,这时仅DIG_C2对应的数码管显示来自段码信号端的数据,而其它7个数码管呈显示关闭状态。
根据这种电路状态,如果希望8个数码管显示希望的数据,就必须使得8个选通信号DIG_C0~DIG_C7分别被单独选通,并在此同时,在段信号输入口加上希望在该对应数码管上显示的数据,于是随着选通信号的扫描就能实现扫描显示的目的。
虽然每次只有一个LED显示,但只要扫描显示速率够快,由于人的视觉余辉效应,使我们仍会感觉所有的数码管都在同时显示。
图3.1‐1扫描数码管的原理图
扫描频率大小不许合适才能有很好的效果。
如果太小,而每个LED开启的时间大于人眼的视觉暂停时间,那么会产生闪烁现象。
而扫描频率太大,则会造成LED的频繁开启和关断,大大增加LED功耗(开启和关断的时刻功耗很大)。
一般来说,扫描频率选在50Hz比较合适。
SW1为清零信号使能,dig为数码管片选信号端,seg为7段显示片选信号。
五、引脚分配情况
设计端口
芯片引脚
开发平台模块
设计端口
芯片引脚
开发平台模块
clk
PIN_P2
CLK1
clr
PIN_AA16
SW1
dig[0]
PIN_D18
7SEG_bit_1
dig[1]
PIN_H12
7SEG_bit_2
dig[2]
PIN_K16
7SEG_bit_3
dig[3]
PIN_H15
7SEG_bit_4
dig[4]
PIN_C17
7SEG_bit_5
dig[5]
PIN_E22
7SEG_bit_6
dig[6]
PIN_K18
7SEG_bit_7
dig[7]
PIN_E15
7SEG_bit_8
seg[0]
PIN_J13
7SEG_a
seg[1]
PIN_G15
7SEG_b
seg[2]
PIN_C16
7SEG_c
seg[3]
PIN_C15
7SEG_d
seg[4]
PIN_D15
7SEG_e
seg[5]
PIN_G13
7SEG_f
seg[6]
PIN_D17
7SEG_g
seg[7]
PIN_D16
7SEG_h
表3.1‐1引脚分配
六、实验步骤
1.新建工程,取名为seven_seg,如下图所示。
3.在新建设计文件中输入VHDL程序,源代码如下:
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_arith.all;
useieee.std_logic_unsigned.all;
entityseven_segis
port
(
clk,clr:
instd_logic;
dig,seg:
outstd_logic_vector(7downto0)
);
endseven_seg;
architecturert1ofseven_segis
signalclk_r:
std_logic;
signalscan:
std_logic_vector(2downto0);
signaldig_r:
std_logic_vector(7downto0);
signaldata_r:
std_logic_vector(3downto0);
signalseg_r:
std_logic_vector(7downto0);
begin
dig<=dig_r;
seg<=seg_r;
a:
process(clk,clr)
variablecount:
integerrange0to50000000;
begin
ifclr='0'then
count:
=0;
elsifclk'eventandclk='1'then
ifcount=49999999then
count:
=0;
else
count:
=count+1;
endif;
ifcount<=24999999then
clk_r<='0';
else
clk_r<='1';
endif;
endif;
endprocess;
b:
process(clk_r,clr)
begin
ifclr='0'then
scan<="000";
elsifclk_r'eventandclk_r='1'then
scan<=scan+'1';
endif;
endprocess;
c:
process(scan)
begin
casescanis
when"000"=>dig_r<="00000000";data_r<="0001";
when"001"=>dig_r<="00000000";data_r<="0011";
when"010"=>dig_r<="00000000";data_r<="0101";
when"011"=>dig_r<="00000000";data_r<="0111";
when"100"=>dig_r<="00000000";data_r<="1001";
when"101"=>dig_r<="00000000";data_r<="1011";
when"110"=>dig_r<="00000000";data_r<="1101";
when"111"=>dig_r<="00000000";data_r<="1111";
endcase;
endprocess;
d:
process(data_r)
begin
casedata_ris
when"0000"=>seg_r<="11000000";‐‐0
when"0001"=>seg_r<=