FPGA实验.docx
《FPGA实验.docx》由会员分享,可在线阅读,更多相关《FPGA实验.docx(31页珍藏版)》请在冰豆网上搜索。
FPGA实验
电子科技大学成都学院
实验报告册
课程名称:
FPGA实验
姓名:
学号:
院系:
专业:
教师:
2012年12月21日
实验一:
计数器
一、实验目的:
本实验的目的要求我们掌握怎样在QuartusII上面编写Verilog代码,并且要求我们掌握如何在时钟Clk下进行计数为以后的时钟分频做铺垫。
二、实验原理和内容:
实验原理:
在外部的时钟的上升沿到来时,输出Out从零进行自加一。
当加到自己的学号30时则利用状态机切换到自减的状态直到减到0为止时,又利用状态机进行切换到自加的状态直到加到30为止。
就这样反复的执行下去。
实验内容:
在QuartusII软件上面编写出对计数器的Verilog代码,并且最终在QuartusII上面进行波形仿真进行验真。
三、实验步骤:
在这里先给出详细的QuartusII如何编写Verilog代码的步骤,在后续的实验里不再介绍。
步骤一:
先打开QuartusII软件,进行工程的建立,进入到界面中点击菜单栏的File下面的NewProjectWizard...的选项则马上跳出NewProjectWizard窗口如图1-1所示,再点击Next,在跳出来的窗口的最上面一栏中填写你的工程的保存路径(注意路径中不要出现中文),在后面的栏里填写工程的名字(这里的名字必须要与你编写的Verilog代码的模块名一样),接着点击Next,一般这个窗口不设置,再次点击Next,在跳出来的窗口里里面你要设置你的开发板的芯片属于哪个类型、封装类、引脚个数、芯片名字等,设置完后再次点击Next,这后面的几个窗口一般都不用设置所以都不用管,最后点击finish。
到这里一个工程就建立完了。
图1-1
步骤二:
建立完工程之后就要在工程里面添加VerilogHDLFile文件进行Verilog代码的编写。
在菜单栏里面点击File里的New。
在跳出来的New窗口如图1-2所示选择VerilogHDLFile。
这样VerilogHDLFile就建立完成了。
图1-2
步骤三:
编写计数器的Verilog代码,编写完之后进行保存接着综合编译。
即点击菜单栏里面的一个三角形。
如果综合编译的过程中出现错误必须改正直到一个错误都没有为止。
步骤四:
综合编译成功和进行波形仿真,来检验代码是否实现的预期的目的,点击菜单栏的File里面的New,在跳出来的窗口里面选择VectorWaveformFile即建立波形仿真文件。
四、实验数据和结果:
代码:
//实现计数到自己的学号30之后又从30计数到0如此反复循环下去
moduleCounter(Clk,Count);
inputClk;
output[4:
0]Count;
reg[4:
0]Count;
reg[1:
0]state=2'b00;
always@(posedgeClk)
begin
case(state)
2'b00:
begin
if(Count==30)
state<=2'b01;
else
Count<=Count+1;
end
2'b01:
begin
if(Count==0)
state<=2'b00;
else
Count<=Count-1;
end
default:
state<=2'b00;
endcase
end
endmodule
仿真波形图如图1-3所示
图1-3
五、实验总结:
通过本次实验我学会了如何使用QuartusII软件,这为以后进行Verilog编写代码提供一个平台。
同时学会了状态机如何在实际的例子中的应用,同时掌握了计数器的编写,后续的实验分频打下的基础。
实验二:
奇数分频
一、实验目的:
本次实验的目的是要求我们掌握在计数器的基础上对开发板上面自带的时钟频率进行分频从而得到实际工程中需要的时钟频率。
二、实验原理和内容:
实验原理:
分频分为偶数分频和计数分频,因为计数分频中都包含了如何偶数分频,所以这里就只说明奇数分频的原理。
用两个计数器,一个由输入时钟上升沿触发,另一个有输入时钟下降沿触发,最后将两个计数器的输出相或,即可得到占空比为50%的方波波形。
实验内容:
在QuartusII软件上面编写出对奇数21进行分频,其中占空比为1:
1的Verilog代码,并且最终在QuartusII上面进行波形仿真进行验真。
三、实验步骤:
步骤一:
打开QuartusII软件建立名字为“fen_21”的工程,并且在其工程里面建立VerilogHDLFile文件进行分频的Verilog代码的编写。
步骤二:
在对Verilog代码编写完之后,进行保存,并且进行综合编译。
如果有错误必须依次错误直到里面没有任何错误为止。
步骤三:
在综合编译成功之后,在次建立波形的仿真文件VectorWaveformFile,进行波形仿真验真,如果波形不是我们预期的波形,再次返回VerilogHDLFile文件中对Verilog代码进行修改直到仿真波形真确为止。
四、实验数据和结果:
代码:
modulefen_21(CLK,RSTn,Out);
inputCLK;
inputRSTn;
outputOut;
reg[4:
0]Count1,Count2;
regOut1,Out2;
//..............................//
assignOut=Out1|Out2;
//...............................//
always@(posedgeCLK)
begin
if(!
RSTn)
begin
Out1<=1'b0;
Count1<=5'b0;
end
elseif(Count1==5'b10100)
Count1<=5'b0;
elseCount1<=Count1+1'b1;
if(Count1==5'b1001)
Out1<=~Out1;
elseif(Count1==5'b10011)
Out1<=~Out1;
end
always@(negedgeCLK)
begin
if(!
RSTn)
begin
Out2<=1'b0;
Count2<=5'b0;
end
elseif(Count2==5'b10100)
Count2<=5'b0;
elseCount2<=Count2+1'b1;
if(Count2==5'b1001)
Out2<=~Out2;
elseif(Count2==5'b10011)
Out2<=~Out2;
end
endmodule
仿真波形如图1-4所示
图1-4
五、实验总结:
通过本次实验可以体会到这个实验的重要性,它不仅仅是计数器的扩展和应用。
它可以把开发板的固定的时钟频率分频成我们在实际工程中需要的时钟频率。
这就摆脱了单片机的固定时钟频率的限制,使得开发板更加灵活从而更加应以我们以后项目开发。
实验三:
花样流水灯
一、实验目的:
本次试验的目的要求我们掌握如何在实际例子中利用分频来达到我们预期的要求。
同时要求我们掌握状态机的编写来实现不同状态的切换。
并且要求我们掌握如何为芯片配置引脚来实现在开发板上面的功能。
二、实验原理和内容:
实验原理:
开发板上面的LED灯是共阳极,给LED灯的阴极提供低电平就会让LED灯点亮。
所以对时钟进行一秒钟的分频,来逐一点亮LED灯来实现花样流水灯。
同时用状态机来切换不同形式的花样流水灯。
实验内容:
在QuartusII软件中编写实现不同样式相互切换的花样流水灯的Verilog代码。
并且下载到开发板上进行调试,同时生成综合后的电路图作为实验的结果。
三、实验步骤:
步骤一:
打开QuartusII软件建立名字为“LED_water”的工程,并且在其工程里面建立VerilogHDLFile文件进行流水灯的Verilog代码的编写。
步骤二:
在对Verilog代码编写完之后,进行保存,并且进行综合编译。
如果有错误必须依次错误直到里面没有任何错误为止。
步骤三:
在综合编译成功之后,对芯片的引脚进行配置并且把不用的引脚设置成三态,再把Verilog代码下载到开发板进行调试,如果调试不成功则返回到代码上面进行修改直到调试成功为止,最后生成综合后的电路图。
四、实验数据和结果:
代码:
moduleLED_water(clk,LED_Out);
inputclk;
output[7:
0]LED_Out;
reg[7:
0]LED_Out=8'hff;
regclk_out;
reg[31:
0]count;
always@(posedgeclk)
begin
count<=count+1;
if(count==12000000)
begin
clk_out<=~clk_out;
count<=0;
end
end
reg[2:
0]state;
always@(posedgeclk_out)
begin
case(state)
2'b00:
begin//流水灯由中间向两边流动
if(LED_Out==8'b0000_0000)
beginLED_Out<=8'b1111_1111;state<=2'b01;end
elsebeginLED_Out[7:
4]<=LED_Out[7:
4]>>1;
LED_Out[3:
0]<=LED_Out[3:
0]<<1;
end
end
2'b01:
begin//流水灯由两边向中间流动
if(LED_Out==8'b0000_0000)
beginLED_Out<=8'b1111_1111;state<=2'b10;end
elsebegin
LED_Out[7:
4]<=LED_Out[7:
4]<<1;
LED_Out[3:
0]<=LED_Out[3:
0]>>1;
end
end
2'b10:
begin//流水灯由右向左流动
if(LED_Out==8'b0000_0000)
beginLED_Out<=8'b1111_1111;state<=2'b11;end
elsebegin
LED_Out<=LED_Out<<1;
end
end
2'b11:
begin//流水灯由左向右流动
if(LED_Out==8'b0000_0000)
beginLED_Out<=8'b1111_1111;state<=2'b11;end
elsebegin
LED_Out<=LED_Out>>1;
end
end
endcase
end
endmodule
综合电路图如图1-5所示
图1-5
五、实验总结:
本次实验给我们提供了分频时钟的一个实例,让我们深刻体会到掌握和熟练应用分频的重要性。
并且在本次实验中通过开发板上面的现象深刻体会到Verilog语言的并行执行,这与单片机的串行执行有非常大的差别。
同时还学会了怎样让编写出的Verilog程序在开发板调试的一系列操作和注意的事项。
实验四:
显示学号
一、实验目的:
本次实验的目的要求我们掌握熟练应用时钟分频,并且要求我们区分数码管的静态显示和动态显示的区别同时要求我们如何在实例中来应用数码管的动态显示。
二、实验原理和内容:
实验原理:
开发板上面的数码管为共阳极所以给数码管的段提供相应的低电平就可以让它现实所要表达的数字,同时利用分频后的时钟快速扫描数码管从而完成学号的显示。
实验内容:
在QuartusII软件中编写实现数码管动态显示的Verilog代码。
并且下载到开发板上进行调试,同时把开发板上面的数码管显示的学号作为实验的结果。
三、实验步骤:
步骤一:
打开QuartusII软件建立名字为“LCD_view”的工程,并且在其工程里面建立VerilogHDLFile文件进行数码管显示学号的Verilog代码的编写。
步骤二:
在对Verilog代码编写完之后,进行保存,并且进行综合编译。
如果有错误必须依次错误直到里面没有任何错误为止。
步骤三:
在综合编译成功之后,对芯片的引脚进行配置并且把不用的引脚设置成三态,再把Verilog代码下载到开发板进行调试,如果调试不成功则返回到代码上面进行修改直到调试成功为止,最后拍下开发板上数码管显示的学号。
四、实验数据和结果:
代码:
moduleLCD_view(Clk,dig,seg);
inputClk;
output[5:
0]dig;
output[7:
0]seg;
reg[5:
0]dig;
reg[7:
0]seg;
reg[31:
0]Count1,Count2;
regClk_Out1,Clk_Out2;
//1US
always@(posedgeClk)
begin
if(Count1==25000)
begin
Clk_Out1<=~Clk_Out1;
Count1<=0;
end
else
Count1<=Count1+1;
end
reg[2:
0]a;
always@(posedgeClk_Out1)
begin
a<=a+1;
end
//scan_led
reg[3:
0]disp_dat;
always@(posedgeClk_Out1)
begin
case(a)
3'd0:
disp_dat=4'h0;
3'd1:
disp_dat=4'h3;
3'd2:
disp_dat=4'h1;
3'd3:
disp_dat=4'h0;
3'd4:
disp_dat=4'h1;
3'd5:
disp_dat=4'h7;
//3'd6:
disp_dat=4'hf;
//3'd7:
disp_dat=8'hf;
endcase
case(a)
3'd0:
dig=6'b11_1110;
3'd1:
dig=6'b11_1101;
3'd2:
dig=6'b11_1011;
3'd3:
dig=6'b11_0111;
3'd4:
dig=6'b10_1111;
3'd5:
dig=6'b01_1111;
//3'd6:
dig=8'b1111_1011;
//3'd7:
dig=8'b1101_1111;
endcase
end
always@(disp_dat)
begin
case(disp_dat)
4'h0:
seg=8'hc0;
4'h1:
seg=8'hf9;
4'h2:
seg=8'ha4;
4'h3:
seg=8'hb0;
4'h4:
seg=8'h99;
4'h5:
seg=8'h92;
4'h6:
seg=8'h82;
4'h7:
seg=8'hf8;
4'h8:
seg=8'h80;
4'h9:
seg=8'h90;
4'ha:
seg=8'h88;
4'hb:
seg=8'h83;
4'hc:
seg=8'hc6;
4'hd:
seg=8'ha1;
4'he:
seg=8'h86;
4'hf:
seg=8'hbf;
endcase
end
endmodule
实验结果如图1-6所示
图1-6
注:
由于数码管有限,所以只显示了自己学号的后六位。
五、实验总结:
通过本次实验明白了数码管的动态显示和静态显示的区别,同时更加熟练的掌握和应用分频时钟。
同时也更加熟练的在开发板上面调试Verilog代码。
实验五:
秒表
一、实验目的:
本次实验的目的要求我们掌握多个时钟分频的应用,同时要求我们掌握和体会Verilog代码的并行执行的特点。
二、实验原理和内容:
实验原理:
利用一个把系统时钟分成1S的时钟来作为秒表计数的间隔时间,同时利用把系统时钟分成1us的时钟来作为数码管扫描的时间间隔从而让数码管动态显示。
从而构成一个秒表。
实验内容:
在QuartusII软件中编写实现数码管动态显示秒表的Verilog代码。
并且下载到开发板上进行调试,同时把开发板上面的数码管显示的秒表作为实验的结果。
三、实验步骤:
步骤一:
打开QuartusII软件建立名字为“LCD_maio”的工程,并且在其工程里面建立VerilogHDLFile文件进行数码管显示秒表的Verilog代码的编写。
步骤二:
在对Verilog代码编写完之后,进行保存,并且进行综合编译。
如果有错误必须依次错误直到里面没有任何错误为止。
步骤三:
在综合编译成功之后,对芯片的引脚进行配置并且把不用的引脚设置成三态,再把Verilog代码下载到开发板进行调试,如果调试不成功则返回到代码上面进行修改直到调试成功为止,最后拍下开发板上数码管显示的秒表。
四、实验数据和结果:
代码:
moduleLCD_miao(Clk,dig,seg);
inputClk;
output[1:
0]dig;
output[7:
0]seg;
reg[1:
0]dig;
reg[7:
0]seg;
reg[31:
0]Count1,Count2;
regClk_Out1,Clk_Out2;
//1US
always@(posedgeClk)
begin
if(Count1==24000)
begin
Clk_Out1<=~Clk_Out1;
Count1<=0;
end
else
Count1<=Count1+1;
end
//1s
always@(posedgeClk)
begin
if(Count2==24000000)
begin
Clk_Out2<=~Clk_Out2;
Count2<=0;
end
else
Count2<=Count2+1;
end
//counter
reg[7:
0]Out;
always@(posedgeClk_Out2)
begin
if(Out[3:
0]==9)
begin
Out[3:
0]<=0;
Out[7:
4]<=Out[7:
4]+1;
end
else
Out[3:
0]<=Out[3:
0]+1;
if(Out[7:
4]==6)
Out<=0;
end
rega=0;
always@(posedgeClk_Out1)
begin
a<=a+1;
end
//scan_led
reg[3:
0]disp_dat;
always@(a)
begin
case(a)
1'd0:
disp_dat=Out[3:
0];
1'd1:
disp_dat=Out[7:
4];
endcase
case(a)
1'd0:
dig=8'b1111_1110;
1'd1:
dig=8'b1111_1101;
endcase
end
always@(disp_dat)
begin
case(disp_dat)
4'h0:
seg=8'hc0;
4'h1:
seg=8'hf9;
4'h2:
seg=8'ha4;
4'h3:
seg=8'hb0;
4'h4:
seg=8'h99;
4'h5:
seg=8'h92;
4'h6:
seg=8'h82;
4'h7:
seg=8'hf8;
4'h8:
seg=8'h80;
4'h9:
seg=8'h90;
4'ha:
seg=8'h88;
4'hb:
seg=8'h83;
4'hc:
seg=8'hc6;
4'hd:
seg=8'ha1;
4'he:
seg=8'h86;
4'hf:
seg=8'h8e;
endcase
end
endmodule
实验结果如图1-7所示
图1-7
五、实验总结:
通过本次实验掌握了如何利用把系统时钟分频成所需的不同时钟。
同时通过本次实验更加能体会到Verilog代码的并行执行的特点。
实验六:
多功能数字时钟
一、实验目的:
本次实验的目的要求我们掌握如何在Verilog代码中为按键消抖,并且掌握如何利用按键对状态的切换和利用按键进行校时,同时理解和掌握对系统时钟分成不同时钟的应用。
二、实验原理和内容:
实验原理:
该实验原理与前面的实验五的原理一样,不同的是多了一个按键功能,把系统时钟进行分频,分成5us的时钟来作为按键消抖的触发条件,即当在连续的3个5us的时间内按键都是按下的这判断按键是按下的。
实验内容:
在QuartusII软件中编写实现数码管动态显示时钟和按键控制时钟的Verilog代码。
并且下载到开发板上进行调试,同时把开发板上面的数码管显示的时钟作为实验的结果。
三、实验步骤:
步骤一:
打开QuartusII软件建立名字为“LCD_clock”的工程,并且在其工程里面建立VerilogHDLFile文件进行多功能数字时钟的Verilog代码的编写。
步骤二:
在对Verilog代码编写完之后,进行保存,并且进行综合编译。
如果有错误必须依次错误直到里面没有任何错误为止。
步骤三:
在综合编译成功之后,对芯片的引脚进行配置并且把不用的引脚设置成三态,再把Verilog代码下载到开发板进行调试,如果调试不成功则返回到代码上面进行修改直到调试成功为止,最后拍下开发板上数码管显示的时钟。
四、实验数据和结果:
代码:
moduleLCD_clock(Clk,dig,seg,key);
inputClk;
input[3:
0]key;
output[5:
0]dig;
output[7:
0]seg;
reg[5:
0]dig;
reg[7:
0]seg;
reg[31:
0]Count1,Count2;
regClk_Out1,Clk_Out2;
//1US
always@(posedgeClk)
begin
if(Count1==50000)
begin
Clk_Out1<=~Clk_Out1;
Count1<=0;
end
else
Coun