Quartus II 软件和 DE2-115 开发板使用入门

一、实验目的

1、熟悉 Quartus II 开发环境,掌握原理图输入方式、文本输入方式和波形仿真;

2、熟练掌握在 Quartus II 环境中进行 FPGA 设计的流程;熟悉DE2-115开发板及其使用。

二、实验任务及要求

1、熟悉 Quartus II 开发环境,掌握原理图输入方式,在 Quartus II 中用原理图方式实现半加器,并用 Quartus II5.1 中的波形仿真。仿真成功后,生成半加器图形符号以供后续程序调用;

2、在 Quartus II 中用原理图方式实现全加器,要求调用任务一中的半加器来实现;

3.采用文本输入方式编写一个简单的程序,要求用 DE2-115 开发板上的 SW0 拨动开关控制 LED0 二极管的亮灭,当 SW0 拨到 1 的位置,LED0 亮,否则 LED0 灭。

4.采用文本输入方式编写一个简单的程序,要求用 DE2-115 开发板上的SW17 拨动开关控制 LEDR17 二极管的亮灭,当 SW17 拨到 1 的位置,LED17 亮,否则 LED17 灭。

5(选做).尝试采用 2 个拨动开关控制 4 个 LED 等的亮灭,要求:当输入00 时,LEDR0 亮;当输入为 01 时,LEDR1 亮;当输入为 10 时,LEDR2 亮;当输入为 11 时,LEDR3 亮;

三、实验原理与步骤

1、实验原理

EDA 的设计是从设计输入开始,然后进行综合、适配、仿真,最后生成编程文件并装入PLD中。首先以HDL文本或原理图形式输入,描述连接关系和芯片内部逻辑及引脚的接口。然后将原理图或HDL语言表达、描述的电路编译成由逻辑单元组成的电路结构网表。之后将综合生成的短路逻辑网表映射到具体的目标器件中实现。最后将生产成的文件下载到PLD器件中。仿真则是对设计电路功能的验证,在quartus II 中进行。

2、实验步骤

(1) 任务一

①在开始菜单中打开 quartusII5.1 软件。

②在 D 盘新建一个名为 sy11 的文件夹。

③新建一个工程:在 quartusII5.1 软件中,单击 File 菜单,选择 New Project Wizard 菜单项,单击 next,出现如下对话框,选择工程所在文件夹并输 入工程名后单击 finish。

④新建文件:在 quartusII5.1 软件中,单击 File 菜单,选择 New 菜单项,弹出如下的窗口,选择 Block Diagram/Schematic File(原理图输入方式)后单击 ok 按钮。

⑤在画布上画出电路图

⑥保存文件,文件名保存为 sy11.bdf

⑦将当前文件设置为 top-level entity:首先在 project navigator 窗口单击 Files 按钮,然后单击 Device Design Files 前的加号+。

⑧编译,单击工具栏的编译按钮

⑨编译成功后,仿真:一,首先,建立仿真波形文件,在 quartusII5.1 软件 File 菜单中单击 new,弹出下图所示的对话框,选择第一行的 other files 选项 卡,然后选择 vector waveform file 选项,单击 ok 按钮。

⑩仿真成功后,将半加器设置成可调用的元件,供其它程序调用。

(2) 任务二

①在 D 盘新建一个文件夹,命名为 sy12。

②新建一个工程,工程路径为 D:/sy12,工程名为 sy12。将任务一的文件夹 sy11中的sy11.bdf和sy11.bsf两个文件拷贝一份到当前工程所在文件夹sy12中。

③新建一个原理图文件,按照任务一的方法和步骤在画布中画出全加器的原理图。

④画好原理图(全加器的原理图请见教材 P64 的图 3.25)后,编译,仿真。仿真具体过程参见任务一的步骤。该实验完成后直接关掉 quartusII5.1 软件。

(3) 任务三

①在开始菜单中打开 quartusII10.0 软件。

②在 D 盘新建一个文件夹,命名为 sy13。

③在 quartusII10.0 软件中新建一个工程,工程名为 sy13;

器件选择如下图所示。选好器件后直接点 finish。若在选器件之前不小心点了 finish 也没关系,可单击 Assignments 菜单栏中的 Device 选项打开器件选择窗口进行器件选择。也可在工程管理窗口的器件上点击右键,选择Device 选项设置。

④新建一个文本文件,注意,以后的 实验都是用文本输入方式,都是选择“VerilogHDL File”选项。选好后单击 ok 按钮。

⑤ 输入程序。并进行管脚分配,分配管脚需要参考文件“DE2-115 中文说明书”第四章的内容,用到哪个连接到 FPGA 上的元件,就要看该元件的说明,比如用到拨动开关 sw0 和 LEDR0,则需要参考 de2-115 第四章的4.2节(使用拨动开关)和第 4.3 节(使用 LED),具体管脚分配方法请参考 1415 本实验指导最前面开篇部分介绍的管脚分配方法,选择其中一种方法来分配管脚即可。

⑥保存文件,注意:文件名一定要和模块名一模一样(可把模块名复制一下,然后在保存的时候粘贴)。

⑦编译。

⑧编译成功后,下载程序。下载之前需要把 de2-115 开发板和电脑连起来,并安装 de2-115 的驱动,具体方法请参见该指导书的前言第 0.3.1 节的usb-blaster 驱动安装方法。

⑨下载程序。单击 Tools 菜单,选择 Programmer 选项,打开 Programmer 对 话框,在 Programmer 对话框中点击 hardware setup,点击 hardware setup 对话框中的 currently selected hardware 选项后的 no hardware 下拉菜单,选usb-blaster[USB-0],若没看到usb-blaster[USB-0]选项,重新点击hardware setup 进行选择(usb-blaster 驱动装好后有延时,需要耐心选择)硬件选择

好后 hardware setup 后面的那个框显示的是usb-blaster[USB-0],而不是 no hardware。最后单击 Programmer 对话框中的 start 按钮进行程序下载。

⑩在线测试。程序下载到开发板后观察程序运行结果是否与预期的一样,若不一样则需要修改程序。

(4) 任务四

采用文本输入方式编写一个简单的程序,要求用 DE2-115 开发板上的SW17 拨动开关控制 LEDR17 二极管的亮灭,当 SW17 拨到 1 的位置,LED17亮,否则 LED17 灭。

(5) 任务五(选做)

尝试采用 2 个拨动开关控制 4 个 LED 等的亮灭,要求:当输入

00 时,LEDR0 亮;当输入为 01 时,LEDR1 亮;当输入为 10 时,LEDR2 亮;当输入为 11 时,LEDR3 亮;

3、源程序清单以及注释

任务四

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0F2AkNlI-1630753632303)(file:///C:\Users\User\AppData\Local\Temp\ksohtml11372\wps1.jpg)]

任务五

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sibdlJFr-1630753632307)(file:///C:\Users\User\AppData\Local\Temp\ksohtml11372\wps2.jpg)]

四、实验结果与分析

1、仿真波形要截图、de2-115开发板上的实验结果要拍照

任务一

在这里插入图片描述
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OzQSlyWZ-1630753632312)(file:///C:\Users\User\AppData\Local\Temp\ksohtml11372\wps3.jpg)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HICC6EaP-1630753632317)(file:///C:\Users\User\AppData\Local\Temp\ksohtml11372\wps4.jpg)]

任务二

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2、仿真波形分析及对de2-115开发板上的实验结果分析

由于是第一次进行eda实验,还无法快速适应将课本上的理论知识与实验进行结合,所以对如何使用器材以及操作步骤不是很熟练,打代码也时不时寻求老师的帮助。通过这一次实验,让我基本了解了器材的使用以及QuartusII软件的使用,希望自己下一次可以更好地去掌握并使用FGPA/SoC 实验箱和QuartusII软件。

  • 9
    点赞
  • 62
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
// // Permission: // // Terasic grants permission to use and modify this code for use // in synthesis for all Terasic Development Boards and Altera Development // Kits made by Terasic. Other use of this code, including the selling // ,duplication, or modification of any portion is strictly prohibited. // // Disclaimer: // // This VHDL/Verilog or C/C++ source code is intended as a design reference // which illustrates how these types of functions can be implemented. // It is the user's responsibility to verify their design for // consistency and functionality through the use of formal // verification methods. Terasic provides no warranty regarding the use // or functionality of this code. // // -------------------------------------------------------------------- // // Terasic Technologies Inc // 356 Fu-Shin E. Rd Sec. 1. JhuBei City, // HsinChu County, Taiwan // 302 // // web: http://www.terasic.com/ // email: support@terasic.com // // -------------------------------------------------------------------- // // Major Functions: DE2_115_PS2 Mouse Controller // // -------------------------------------------------------------------- // // Revision History : // -------------------------------------------------------------------- // Ver :| Author :| Mod. Date :| Changes Made: // V1.0 :| Johnny FAN,HdHuang :| 05/16/10 :| Initial Revision // -------------------------------------------------------------------- module ps2( iSTART, //press the button for transmitting instrucions to device; iRST_n, //FSM reset signal; iCLK_50, //clock source; PS2_CLK, //ps2_clock signal inout; PS2_DAT, //ps2_data signal inout; oLEFBUT, //left button press display; oRIGBUT, //right button press display; oMIDBUT, //middle button press display; oX_MOV1, //lower SEG of mouse displacement display for X axis. oX_MOV2, //higher SEG of mouse displacement display for X axis. oY_MOV1, //lower SEG of mouse displacement display for Y axis. oY_MOV2 //higher SEG of mouse displacement display for Y axis. ); //interface; //======================================================= // PORT declarations //======================================================= input iSTART; input iRST_n; input iCLK_50; inout PS2_CLK; inout PS2_DAT; output oLEFBUT; output oRIGBUT; output oMIDBUT; output [6:0] oX_MOV1; output [6:0] oX_MOV2; output [6:0] oY_MOV1; output [6:0] oY_MOV2; //instantiation SEG7_LUT U1(.oSEG(oX_MOV1),.iDIG(x_latch[3:0])); SEG7_LUT U2(.oSEG(oX_MOV2),.iDIG(x_latch[7:4])); SEG7_LUT U3(.oSEG(oY_MOV1),.iDIG(y_latch[3:0])); SEG7_LUT U4(.oSEG(oY_MOV2),.iDIG(y_latch[7:4])); //instruction define, users can charge the instruction byte here for other purpose according to ps/2 mouse datasheet. //the MSB is of parity check bit, that's when there are odd number of 1's with data bits, it's value is '0',otherwise it's '1' instead. parameter enable_byte =9'b011110100; //======================================================= // REG/WIRE declarations //======================================================= reg [1:0] cur_state,nex_state; reg ce,de; reg [3:0] byte_cnt,delay; reg [5:0] ct; reg [7:0] x_latch,y_latch,cnt; reg [8:0] clk_div; reg [9:0] dout_reg; reg [32:0] shift_reg; reg leflatch,riglatch,midlatch; reg ps2_clk_in,ps2_clk_syn1,ps2_dat_in,ps2_dat_syn1; wire clk,ps2_dat_syn0,ps2_clk_syn0,ps2_dat_out,ps2_clk_out,flag; //======================================================= // PARAMETER declarations //======================================================= //state define parameter listen =2'b00, pullclk=2'b01, pulldat=2'b10, trans =2'b11; //======================================================= // Structural coding //======================================================= //clk division, derive a 97.65625KHz clock from the 50MHz source; always@(posedge iCLK_50) begin clk_div <= clk_div+1; end assign clk = clk_div[8]; //tristate output control for PS2_DAT and PS2_CLK; assign PS2_CLK = ce?ps2_clk_out:1'bZ; assign PS2_DAT = de?ps2_dat_out:1'bZ; assign ps2_clk_out = 1'b0; assign ps2_dat_out = dout_reg[0]; assign ps2_clk_syn0 = ce?1'b1:PS2_CLK; assign ps2_dat_syn0 = de?1'b1:PS2_DAT; // assign oLEFBUT = leflatch; assign oRIGBUT = riglatch; assign oMIDBUT = midlatch; //multi-clock region simple synchronization always@(posedge clk) begin ps2_clk_syn1 <= ps2_clk_syn0; ps2_clk_in <= ps2_clk_syn1; ps2_dat_syn1 <= ps2_dat_syn0; ps2_dat_in <= ps2_dat_syn1; end //FSM shift always@(*) begin case(cur_state) listen :begin if ((!iSTART) && (cnt == 8'b11111111)) nex_state = pullclk; else nex_state = listen; ce = 1'b0; de = 1'b0; end pullclk :begin if (delay == 4'b1100) nex_state = pulldat; else nex_state = pullclk; ce = 1'b1; de = 1'b0; end pulldat :begin nex_state = trans; ce = 1'b1; de = 1'b1; end trans :begin if (byte_cnt == 4'b1010) nex_state = listen; else nex_state = trans; ce = 1'b0; de = 1'b1; end default : nex_state = listen; endcase end //idle counter always@(posedge clk) begin if ({ps2_clk_in,ps2_dat_in} == 2'b11) begin cnt <= cnt+1; end else begin cnt <= 8'd0; end end //periodically reset ct; ct counts the received data length; assign flag = (cnt == 8'hff)?1:0; always@(posedge ps2_clk_in,posedge flag) begin if (flag) ct <= 6'b000000; else ct <= ct+1; end //latch data from shift_reg;outputs is of 2's complement; //Please treat the cnt value here with caution, otherwise wrong data will be latched. always@(posedge clk,negedge iRST_n) begin if (!iRST_n) begin leflatch <= 1'b0; riglatch <= 1'b0; midlatch <= 1'b0; x_latch <= 8'd0; y_latch <= 8'd0; end else if (cnt == 8'b00011110 && (ct[5] == 1'b1 || ct[4] == 1'b1)) begin leflatch <= shift_reg[1]; riglatch <= shift_reg[2]; midlatch <= shift_reg[3]; x_latch <= x_latch+shift_reg[19 : 12]; y_latch <= y_latch+shift_reg[30 : 23]; end end //pull ps2_clk low for 100us before transmit starts; always@(posedge clk) begin if (cur_state == pullclk) delay <= delay+1; else delay <= 4'b0000; end //transmit data to ps2 device;eg. 0xF4 always@(negedge ps2_clk_in) begin if (cur_state == trans) dout_reg <= {1'b0,dout_reg[9:1]}; else dout_reg <= {enable_byte,1'b0}; end //transmit byte length counter always@(negedge ps2_clk_in) begin if (cur_state == trans) byte_cnt <= byte_cnt+1; else byte_cnt <= 4'b0000; end //receive data from ps2 device; always@(negedge ps2_clk_in) begin if (cur_state == listen) shift_reg <= {ps2_dat_in,shift_reg[32:1]}; end //FSM movement always@(posedge clk,negedge iRST_n) begin if (!iRST_n) cur_state <= listen; else cur_state <= nex_state; end endmodule
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小天才才

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值