edafpgaverilog实验报告.docx
- 文档编号:28709404
- 上传时间:2023-07-19
- 格式:DOCX
- 页数:30
- 大小:339.82KB
edafpgaverilog实验报告.docx
《edafpgaverilog实验报告.docx》由会员分享,可在线阅读,更多相关《edafpgaverilog实验报告.docx(30页珍藏版)》请在冰豆网上搜索。
edafpgaverilog实验报告
FPGA实验报告
学号:
姓名:
院系:
微电子技术系
专业:
集成电路设计
指导教师:
李海
2010年12月
实验一一位全加器
一、实验目的:
1、通过此实验进一步熟悉和掌握CPLD/FPGA开发软件的使用方法。
2、掌握VerilogHDL语言的书写格式及编程方法。
3、学会对VerilogHDL代码进行编译,检查,改错。
4、学会编写代码,验证1位全加器。
5、学习简单时序电路的设计和硬件测试。
二、实验内容和原理:
(一)实验内容:
本实验的内容是建立一个1位全加器。
具体内容包括:
(1)使用Quartus
建立工程、编写程序;
(2)进行波形仿真验证;
(3)进行硬件测试
(二)实验原理:
1、一位全加器包括输入端A、B,进位Cin,和输出count,sum,下图是真值表:
A
B
Cin
Sum
Cout
0
0
0
0
0
1
0
0
1
0
0
1
0
1
0
1
1
0
0
1
0
0
1
1
0
1
0
1
0
1
0
1
1
0
1
1
1
1
1
1
2、全加器的电路原理图:
三、实验步骤:
1、启动QuartusII软件,新建空白的工程,名为:
full_add.qdf。
2、新建VerilogHDL源文件full_add.v如下
full.v:
modulefull_add(a,b,cin,sum,count);
inputa,b,cin;
outputsum,count;
assign{count,sum}=a+b+cin;
endmodule
3、编译完成,找出错误,并改正,直到编译无误为止。
4、新建测试文件如下:
modulefull_add_test;
rega,b,cin;
wirecount,sum;
full_add(a,b,cin,sum,count);
initial
begin
a=0;b=0;cin=0;
#1000a=1;
#1000a=0;b=1;
#1000a=1;
#1000a=0;b=0;cin=1;
#1000a=1;
#1000a=0;b=1;
#1000a=1;
#1000$finish;
end
endmodule
5、编译测试文件,结合full_add.v,使用MODELSIM进行时序仿真,观察结果。
四、实验数据和结果:
比对该波形图的电平与真值表的大小发现其一一对应。
五:
实验总结:
通过本实验,了解了QuartusII的基本使用方法,学会了对VerilogHDL代码的调试,并能通过编译、波形仿真和验证,最终得到了预想的结果。
实验二花样流水灯
一、实验目的:
1、通过此实验进一步熟悉和掌握CPLD/FPGA开发软件的使用方法
2、熟悉LED灯的工作原理。
3、掌握控制LED灯的开关。
4、编写代码实现LED灯的花样流水闪烁。
5、学习简单时序电路的设计和硬件测试。
二、实验内容和原理:
(一)实验内容:
本实验的内容是建立可用与控制LED流水灯的简单硬件电路,要求在SmartSOPC实验箱上实现LED1~LED8发光二极管流水灯显示。
(二)实验原理:
50MHz的时钟源,假如我们直接把它输入。
LED灯的点亮和熄灭,主要是控制发光二极管的阴极置低电平到发光二极管LED,由于人眼的延迟性,我们将无法看到LED闪烁,认为它一直亮着。
如果我们期望看到闪烁灯,就需要将时钟源的频率降低后再输出。
本实验采用计数与判段的方式来实现降低时钟源的频率。
计数电路可用计数器实现,每来一个时钟脉冲CLK,计数器就加1,而每当判断出计数器达到某个数值时,把输出状态求反。
三、实验步骤:
1、打开QuartusII软件建立一个空白工程,然后命名为led_water.qpf.
2、点击File→New...,在该项目下新建VerilogHDL源程序文件led_water.v,输入试验程序中的源程序代码保存后选择工具栏中启动编译,若在编译中发现错误,则找出并更正错误,直到编译成功为止。
moduleled_water(sys_clk,led);
inputsys_clk;
output[7:
0]led;
reg[7:
0]led;
reg[24:
0]count;
reg[4:
0]state;
wireclk;
always@(posedgesys_clk)
count<=count+1'b1;
assignclk=count[23];
always@(posedgeclk)
begin
case(state)
5'b00000:
led=8'b11111111;
5'b00001:
led=8'b00000000;
5'b00010:
led=8'b10000000;
5'b00011:
led=8'b11000000;
5'b00100:
led=8'b11100000;
5'b00101:
led=8'b11110000;
5'b00110:
led=8'b11111000;
5'b00111:
led=8'b11111100;
5'b01000:
led=8'b11111110;
5'b01001:
led=8'b11111111;
5'b01010:
led=8'b00000000;
5'b01011:
led=8'b11111111;
5'b01100:
led=8'b00000001;
5'b01101:
led=8'b00000010;
5'b01110:
led=8'b00000100;
5'b01111:
led=8'b00001000;
5'b10000:
led=8'b00010000;
5'b10001:
led=8'b00100000;
5'b10010:
led=8'b01000000;
5'b10011:
led=8'b10000000;
5'b10100:
led=8'b11111111;
5'b10101:
led=8'b00000000;
5'b10110:
led=8'b11111111;
5'b10111:
led=8'b10000001;
5'b11000:
led=8'b11000011;
5'b11001:
led=8'b11100111;
5'b11010:
led=8'b11111111;
5'b11011:
led=8'b00011000;
5'b11100:
led=8'b00111100;
5'b11101:
led=8'b01111110;
5'b11110:
led=8'b11111111;
5'b11111:
led=8'b00000000;
endcase
state=state+1;
end
endmodule
3、配置FPGA引脚:
在QuartusII软件主页面下,选择Assignments→Pins或选择工具栏上,配置led[0]---led[7]以及clk的引脚。
信号
引脚
信号
引脚
<1C>6
<1C>12
EDA
<1C>6
<1C>12
EDA
led[0]
50
50
50
led[5]
47
47
47
led[1]
53
53
53
led[6]
48
48
48
led[2]
54
54
54
led[7]
49
49
49
led[3]
55
55
55
clock
28
28
28
led[4]
176
176
176
4、更改分频模块(int_div)的分频系数,并重新编译下载,观察流水灯的变化。
四、实验结果:
led7-led0依次点亮,全部8灯闪烁两次,之后led0-led7依次点亮。
全部8灯闪烁两次,之后led7&led0,led6&led1,led5&led2,led6&led3,依次点亮,再返回按顺序熄灭。
五、实验总结:
通过使用赋值语句,熟练掌握了7个led灯的控制,并进行花样闪烁。
熟悉了对IO口的控制操作。
掌握了Verilog语言的case语句的书写和调试。
实验三分频器的设计(偶数分频)
一、实验目的:
1、通过此实验进一步熟悉和掌握CPLD/FPGA开发软件的使用方法。
2、掌握VerilogHDL语言的书写格式及编程方法。
3、学会对VerilogHDL代码进行编译,检查,改错。
4、学会数控分频器的设计、分析和测试方法。
。
5、学习简单电路的设计和硬件测试。
二、实验内容和原理:
(一)实验内容:
在SmartSOPC试验箱上的实现数控分频器的设计。
在clk输入64kHz或更高(要确保分频后落在音频范围)的频率信号(由int_div模块分频得到);输出FOUT接蜂鸣器BUZZ-ER,由KEY1/KEY2控制输入8位预置数,并在数码管1~2上显示(调用key_led模块)。
(二)实验原理:
数控分频器的功能就是输入端输入不同的数据时,产生不同的分频比,从而产生不同的频率值。
本例是用计数值可并行预置的加法计数器设计完成的,方法是将计数溢出位与预置数加载输入信号相接即可。
三、实验步骤:
1、启动QuartusII建立一个空白工程,然后命名为dvf16.qpf。
2、建立波形仿真文件()并进行功能仿真验证。
3、分别新建VerilogHDL源程序文件、、int_div.v,输入程序代码并保存(完整的VerilogHDL程序参考程序清单五.1、五.2和二.2),然后进行综合编译.若在编译过程中发现错误,则找出并更正错误,直到编译成功为止。
4、从设计文件创建模块,由、、分别生成名为pulse.bsf、、的模块符号文件。
5、新建图形设计文件(顶层模块)命名为dvf16.bdf并保存。
其模块原理图如图五.1所示。
图五.18位全加器顶层模块
6、选择目标器件并对相应的引脚进行锁定,在这里缩选择的器件为Altera公司Cyclone系列的EP1C6Q240C8芯片。
引脚锁定方法如表五.1所列。
将未使用的引脚设置为三态输入。
表五.1引脚锁定方法
信号
引脚
信号
引脚
信号
引脚
IC6
IC12
EDA
IC6
IC12
EDA
IC6
IC12
EDA
seg(0)
169
169
169
seg(7)
164
164
164
dig(6)
198
238
213
seg
(1)
170
170
170
dig(0)
160
160
160
dig(7)
205
239
214
seg
(2)
167
167
167
dig
(1)
159
159
159
key(0)
121
121
121
seg(3)
168
168
168
dig
(2)
162
162
162
key
(1)
122
122
122
seg(4)
165
165
165
dig(3)
161
161
161
fout
175
175
175
seg(5)
166
166
166
dig(4)
204
236
215
clock
28
28
28
seg(6)
163
163
163
dig(5)
199
237
216
7、将设置为顶层实体。
对该工程文件进行全程编译处理,若在编译过程中发现错误,则找出并更正错误直至编译成功为止。
8、连接硬件、下载程序。
①如果核心板是QuickSOPC-1C12,则须执行此步骤;否则跳过此步。
将实验箱配置的连线将核心板上PACK区的引脚236、237、238和239分别与数码管显示区的COM3(DIG_COM)的DIG4~DIG7相对应连接。
②将跳线短接帽跳接到JP7和JP6的KEY1、KEY2和BEEP。
将AlteraByteBlasterII下载电缆的两端分别接到PC机的打印机并口和QUICKSOPC核芯板上的JTAG下载口上,打开电源,执行下载命令,把程序下载到FPGA器件中。
按下KEY1、KEY2键改变分频预置数,观察蜂鸣器发出的声音有何变化。
9、实验程序:
modulediv16(clk_in,clk_out,rst);
parameterwidth=3;
inputclk_in;
inputrst;
outputclk_out;
reg[width-1:
0]cnt;
regtmp_clk;
always@(posedgeclk_in)
begin
if(!
rst)
begin
cnt<=0;
tmp_clk<=0;
end
elseif(cnt==3'b111)
begin
cnt<=0;
tmp_clk<=~tmp_clk;
end
elsecnt<=cnt+1;
end
assignclk_out=tmp_clk;
endmodule
四、实验结果:
五、实验总结:
通过本实验,熟练掌握了分频器的工作原理及设计,并进行偶数分频器的波形仿真。
熟悉了对IO口的控制操作。
掌握了Verilog语言的语言的书写和调试。
实验四按键控制数码管的显示
一、实验目的:
1、进一步了解、熟悉和掌握FPGA开发软件Quartus
的使用方法及VerilogHDL的编程方法。
2、学习数码管的工作原理和电路设计。
3、熟悉对按键功能的操作。
4、学会按键控制数码管的显示,并通过显示数值,区分是安格按键被按下。
二、实验内容和原理:
(一)实验内容:
要求当按下KEY1是数码管显示1;当按下KEY2是数码管显示2依次类推,直到当按下KEY8是数码管显示8。
(二)实验原理:
1、数码管的显示原理:
LED的结构LED数码管里面有8只发光二极管,分别做a,b,c,d,e,f,g,dp断,其中dp为小数点断,每个段都有两个外部引脚,其中一个接外部电路,另外一个8段共用一个极,或阴极,或阳极。
在非共用端加入并行数据就可以控制数码管各段LED的亮和灭,来显示不同的数字。
下面是0-9需要再并行一端配置的数据
{0xc0,0xf9,x0a4,x0b0,x099,x092,x082,x0f8,0x80,0x98}
2、实验设计:
当KEY按下时,我们对KEY_IN的取值进行读取,根据读取的信号,对数码管位选信号进行控制,使其显示对应的数值。
例如当第一个按键按下时,有key_in=8'b11111110,
则赋值seg=8'hf9,数码管显示1。
三、实验步骤:
1、启动QuartusⅡ建立一个空白工程,然后命名为key_led。
2、点击File→New...,在该项目下新建VerilogHDL源程序文件key_led.v,输入试验程序中的源程序代码保存后选择工具栏中启动编译,若在编译中发现错误,则找出并更正错误,直到编译成功为止。
modulekey_led(key_in,seg);
input[7:
0]key_in;
output[7:
0]seg;
reg[7:
0]seg;
reg[7:
0]buffer;
always@(key_in)
begin
buffer=key_in;
case(buffer)
8'b11111110:
seg=8'hf9;
8'b11111101:
seg=8'ha4;
8'b11111011:
seg=8'hb0;
8'b11110111:
seg=8'h99;
8'b11101111:
seg=8'h92;
8'b11011111:
seg=8'h82;
8'b10111111:
seg=8'hf8;
8'b01111111:
seg=8'h80;
default:
seg=8'hc0;
endcase
end
endmodule
3、引脚设置:
Key0
Key1
Key2
Key2
Key4
Key5
Key6
Key7
121
122
123
124
125
126
127
128
Seg0
Seg1
Seg2
Seg3
Seg4
Seg5
Seg6
Seg7
169
170
167
168
165
166
163
164
4、下载sof文件到试验箱里,观察试验箱上的实验结果。
四、实验数据和结果
当按下KEY1时数码管显示为1;
当按下KEY2时数码管显示为2;
当按下KEY3时数码管显示为3;
当按下KEY4时数码管显示为4;
当按下KEY5时数码管显示为5;
当按下KEY6时数码管显示为6;
当按下KEY7时数码管显示为7;
当按下KEY8时数码管显示为8;
五、实验总结
通过本实验,学会了按键对数码管的控制,并且掌握了数码管数值显示的控制方法,还能通过按键控制数码管显示相应的数值。
实验五学号的显示
一、实验目的:
1、熟练掌握FPGA开发软件Quartus
的使用方法及VerilogHDL的编程方法。
2、熟悉数码管段选和位选的操作。
3、掌握分频程序的使用。
4、实验设计实现8个数码管显示学号后8位。
二、实验原理和内容。
(一)实验内容:
要求调试好实验以后实验箱上的第一个数码管显示4,一秒后熄灭,此时第二个数码管显示0,然后依次类推直到第八个数码管依次显示数字4、0、7、1、0、6、3、1。
(二)实验原理:
在实验箱上,在非共用端加入并行数据就可以控制数码管各段LED的亮和灭,来显示不同的数字。
由于实验使用的时钟引脚频率比较高,在扫描数值的时候比较快,肉眼无法识别显示的数字,故先做预分频处理。
实验用的原理图:
三、实验步骤:
1、启动QuartusⅡ建立一个空白工程,然后命名为scan_led。
2、点击File→New...,在该项目下新建VerilogHDL源程序文件scan_led.v,输入试验程序中的源程序代码保存后选择工具栏中启动编译,若在编译中发现错误,则找出并更正错误,直到编译成功为止。
modulescan_led(clk,dig,seg);
inputclk;
output[7:
0]dig;
output[7:
0]seg;
reg[7:
0]seg_r;
reg[7:
0]dig_r;
reg[3:
0]disp_dat;
reg[2:
0]count;
assigndig=dig_r;
assignseg=seg_r;
always@(posedgeclk)
begin
count<=count+1'b1;
end
always@(posedgeclk)
begin
case(count)
3'd0:
disp_dat=4;
3'd1:
disp_dat=0;
3'd2:
disp_dat=7;
3'd3:
disp_dat=1;
3'd4:
disp_dat=0;
3'd5:
disp_dat=6;
3'd6:
disp_dat=3;
3'd7:
disp_dat=1;
endcase
case(count)
3'd0:
dig_r=8'b11111110;
3'd1:
dig_r=8'b11111101;
3'd2:
dig_r=8'b11111011;
3'd3:
dig_r=8'b11110111;
3'd4:
dig_r=8'b11101111;
3'd5:
dig_r=8'b11011111;
3'd6:
dig_r=8'b10111111;
3'd7:
dig_r=8'b01111111;
endcase
end
always@(disp_dat)
begin
case(disp_dat)
4'h0:
seg_r=8'hc0;
4'h1:
seg_r=8'hf9;
4'h2:
seg_r=8'ha4;
4'h3:
seg_r=8'hb0;
4'h4:
seg_r=8'h99;
4'h5:
seg_r=8'h92;
4'h6:
seg_r=8'h82;
4'h7:
seg_r=8'hf8;
4'h8:
seg_r=8'h80;
4'h9:
seg_r=8'h90;
endcase
end
endmodule
3、点击File→New...,在该项目下新建VerilogHDL源程序文件int_div.v,输入试验程序中的源程序代码保存后选择工具栏中启动编译,若在编译中发现错误,则找出并更正错误,直到编译成功为止。
moduleint_div(clock,clk_out);
inputclock;
outputclk_out;
regclk_p_r;
regclk_n_r;
reg[F_DIV_WIDTH-1:
0]count_p;
reg[F_DIV_WIDTH-1:
0]count_n;
parameterF_DIV=48000000;
parameterF_DIV_WIDTH=32;
wirefull_div_p;
wirehalf_div_p;
wirefull_div_n;
wirehalf_div_n;
assignfull_div_p=(count_p assignhalf_div_p=(count_p<(F_DIV>>1)-1); assignfull_div_n=(count_n assignhalf_div_n=(count_n<(F_DIV>>1)-1); assignclk_out=(F_DIV==1)? clock: (F_DIV[0]? (clk_p_r&clk_n_r): clk_p_r); always@(posedgeclock) begin if(full_div_p) begin count_p<=count_p+1'b1; if(half_div_p) clk_p_r<=1'b0; else clk_p_r<=1'b1; end else begin count_p<=0; clk_p_r<=1'b0; end end always@(negedgeclock) begin if(full_div_n) begin count_n<=count_n+1'b1; if(half_div_n) clk_n_r<=1'b0; else clk
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- edafpgaverilog 实验 报告