聲附MU塞农程舉龜Zhengzhou In^lituleof Aeronautical Industry Management《EDA技术及应用》实验报告系部: _________________________指导教师:________________________学号:___________________________姓名:___________________________实验一点亮LED设计一、实验目的通过此实验让用户逐步了解、熟悉和掌握FPGA开发软件Quartusll的使用方法及Verilog HDL的编程方法。
本实验力求以详细的步骤和讲解让读者以最快的方式了解EDA技术开发以及软件的使用,从而快速入门并激起读者对EDA技术的兴趣。
二、实验内容SmartSOPC实验箱上有8个发光二极管LED1~8,并分别与FPGA的50、53~55、176和47~49引脚相连。
本实验的内容是建立可用于控制LED亮/灭的简单硬件电路,要求点亮SmartSOPC实验箱上的4个发光二极管(LED1、LED3、LED5 和LED7 )。
三、实验原理FPGA器件同单片机一样,为用户提供了许多灵活独立的输入/输出I/O 口(单元)。
FPGA每个I/O 口可以配置为输入、输出、双向I/O、集电极开路和三态门等各种组态。
作为输出口时,FPGA的I/O 口可以吸收最大为24mA的电流,可以直接驱动发光二极管LED等器件。
所以只要正确分配并锁定引脚后,在相应的引脚上输出低电平“0”就可以实现点亮该发光二级管的功能。
四、实验步骤1、启动Quarters II建立一个空白工程,命名为led_test.qpf。
然后分别建立图形设计文件,命名为led_test.bdf,以及文本编辑文件led1.v,将他们都添加进工程中。
2、对工程进行设计。
在led1.v中输入程序代码,并保存,进行综合编译,若在编译中发现错误,则找出并更正错误,直至编译成功为止。
从设计文件中创建模块,由led1.v生成名为led1.bsf的模块符号文件。
在led_test.bdf中任意空白处双击鼠标左键,将symbol对话框中libraries : project下的led1模块添加到图形文件led_test.bdf 中,加入输入、输出引脚,双击各管脚符号,进行管脚命名。
完整的顶层模块原理图如下图所示。
选择目标器件并进行引脚锁定。
将未使用的管脚设置为三态输入。
3、设置编译选项并编译硬件系统。
将led_test.bdf设置为顶层实体。
对该工程文件进行全程编译处理。
若在编译过程中发现错误,则找出并更正错误,直到编译成功为止。
4、下载硬件设计到目标FPGA 。
将产生的led test.sof 输出对FPGA 进行配置5、观察 LED 的状态。
五、实验程序 //利用连续赋值 assign 语句实现 module ledl(led);output[7:0] led; assign led =8'b10101010;endmodule//利用过程赋值语句实现(暂时已屏蔽) /*写出使用 QuartusII 软件开发工程的完整的流程实验二流水灯实验一、实验目的通过此实验让用户进一步了解、熟悉和掌握 CPLD/FPGA 开发软件的使用方 法及 Verilog HDL 的编程方法。
学习简单时序电路的设计和硬件测试。
二、实验内容本实验的内容是建立可用于控制 LED 流水灯的简单硬件电路,要求在SmartSOPC 实验箱上实现LED1~LED8发光二极管流水灯显示。
三、 实验原理1、 在LED1~LED8引脚上周期性的输出流水数据,如原来输出的数据是 11111100 则表示点亮LED1、LED2,流水一次后,输出的数据应该为 1111100Q 而此时则 应点亮 LED1~LED3 三个 LED 发光二极管 ,就可以实现 LED 流水灯。
为了观察方 便,流水速率最好在 2Hz 左右。
在QuickSOPC 核心板上有一个 48MHz 的标准时 钟源,该时钟脉冲Clock 与芯片的28管脚相连。
为了产生2Hz 的时钟脉冲,在此 调用了一个分频模块(int_div 模块,位于光盘中EDA_Component 目录下),通过 修改分频系数来改变输出频,当分频系数为24x10%时,输出即为2Hz 的频率信号。
2、 Int_div 分频模块说明: int_div 模块是一个占空比为 50%的任意整数分频器。
输入时钟为clock ,输出时钟为clk_out 。
其中F_DIV 为分频系数,分频系数范围 为1~2A n (n=F_DIV_WIDTH),若要改变分频系数,改变参数F_DIV 和 F_DIV_WIDTH 到相应范围即可。
在本例中输入时钟为 48MHz ,要得到2Hz 的信 号,所以分频系数为//模块名 led1 //定义输出端口、 // 输出 0xAA module led1(led);output[7:0] led;reg[7:0] led;alwaysbeginled = 8'b10101010;endendmudule*/ 六、思考题//模块名 led1 //定义输出端口 //定义寄存器 //过程 1 ,无敏感变量 //输出 0xAA48x10A6/2=24x10A6;对于分频系数为24乂10八6的数需要一个25 位宽的计数器即可。
四、实验步骤1 、启动Quarters II 建立一个空白工程,命名为led_water.qpf。
2、新建Verilog HDL源程序文件ledwater.v,输入程序代码并保存,进行综合编译,若在编译中发现错误,则找出并更正错误,直至编译成功为止。
3、从设计文件中创建模块,由ledwater.v生成名为ledwater.bsf的模块符号文件。
4、将光盘中EDA_Component目录下的int_div.bsf和int_div.v拷贝到工程目录。
5、新建图形设计文件命名为led_water.bdf并保存。
在空白处双击鼠标左键,分别将symbol 对话框中libraries:project 下的ledwater 和int_div 模块放在图形文件led_water.bdf中,加入输入、输出引脚,双击各管脚符号,进行管脚命名。
双击int_div 的参数框,并修改参数,将F_DIV 的值改为24000000,F_DIV_WIDTH 的值改为25.完整的顶层模块原理图如下图所示过程中发现错误,则找出并更正错误,直到编译成功为止8、将产生的led_water.sof输出对FPGA进行配置9、更改分频模块(int_div)五、实验程序module ledwater (led,clk); output[7:0] led;in put clk;reg[8:0] led_r;assig n led = led_r[7:0]; always @(posedge clk) begin led_r <= led_r << 1;if(led_r == 9'dO)led_r <= 9'b111111111; end en dmodule 的分频系数,并重新编译下载,观察流水灯的变化//模块名ledwaterII定义LED输出口//定义时钟输入口II定义输出寄存器〃寄存器输出II在时钟上升沿触发进程II是,则输出左移一位II循环完毕吗?II是,则重新赋初值六、思考题本实验顶层采用了图形输入的方式,若采用文本输入方式,如何编写顶层文件?写出相应程序。
实验三键盘、LED 发光实验一、实验目的通过此实验让用户进一步了解、熟悉和掌握CPLD/FPGA 开发软件的使用方法及Verilog HDL 的编程方法,熟悉以Verilog HDL 文件为顶层模块的设计。
学习和体会分支条件语句case的使用方法及FPGA I/O 口的输出控制。
二、实验内容SmartSOPC实验箱上有8个发光二极管LED1~8和8个按键KEY1~KEY8。
本实验的内容要求在SmartSOPC实验箱上完成对8个按键KEY1~KEY8进行监控,一旦有按键输入判断其键值,并点亮相应的发光二极管,如若KEY3 按下,则点亮LED1~LED3 发光二极管。
三、实验原理FPGA的所有I/O控制块允许每个I/O 口引脚单独配置为输出口,不过这种配置是系统自动完成的,一旦该I/O 口被设置为输入口使用时(如定义keyO为输入引脚:in put keyO;)该I/O控制模块将直接使三态缓冲区的控制端接地,使得该I/O 口引脚对外呈高阻态,这样该I/O 口引脚即可用作专用输入引脚。
只要正确分配并锁定引脚后,一旦在KEY1~KEY8 中有按键输入,在检测到键盘输入的情况下,继续判断其键值并做出相应的处理。
四、实验步骤1 、启动Quarters II 建立一个空白工程,命名为keyled.qpf。
2、新建Verilog HDL源程序文件keyled.v,输入程序代码并保存,进行综合编译,若在编译中发现错误,则找出并更正错误,直至编译成功为止。
3、选择目标器件并进行引脚锁定。
将未使用的管脚设置为三态输入。
4、对该工程文件进行全程编译处理。
若在编译过程中发现错误,则找出并更正错误,直到编译成功为止。
5、将产生的keyled.sof 输出对FPGA 进行配置。
按下不同按键观察LED 发光管的 状态。
五、实验程序 module keyled(key,led); input[7:0] key; output[7:0] led; reg[7:0] led_r; reg[7:0]buffer_r;assign led = led_r;always@(key)//过程 1 beginbuffer_r = key;//读取键值case(buffer_r) 8'b11111110:led_r = 8'b11111110; // 是键 KEY1 ,则给寄存器赋值 0xfe8'b11111101:led_r = 8'b11111100; // 是键 KEY2 ,则给寄存器赋值 0xfc8'b11111011:led_r = 8'b11111000; // 是键 KEY3 ,则给寄存器赋值 0xf88'b11110111:led_r = 8'b11110000; // 是键 KEY4 ,则给寄存器赋值 0xf08'b11101111:led_r = 8'b11100000; // 是键 KEY5 ,则给寄存器赋值 0xe08'b11011111:led_r = 8'b11000000; // 是键 KEY6 ,则给寄存器赋值 0xc08'b10111111:led_r = 8'b10000000; // 是键 KEY7 ,则给寄存器赋值 0x808'b01111111:led_r = 8'b00000000; // 是键 KEY8 ,则给寄存器赋值 0x00 default: led_r =8'b11111111; // 否则给寄存器赋值 0xff endcaseendendmodule六、思考题能否用 if 语句改写本实验程序?如果能,写出相应程序。