《EDA技术及应用》实验报告系部:电子通信工程系指导教师:张松炜学号:121307214 ____ 姓名:李俊杰_______2014___年_6___月__19_日实验一点亮LED设计一、实验目的通过此试验可以让大家逐步了解,熟悉和掌握FPGA开发软件Quartus II的使用方法及VerilogHDL的编程方法。
二、实验内容本实验是一个简单的点亮LED灯的实验,具体包括:1)使用Quartus II建立一个工程;2)Quartus II工程设计;3)设置编译选项并编译硬件系统;4)下载硬件设计到目标FPGA;5)观察LED的状态;三、实验原理和单片机一样,向片子里写进数据,输出高电平(对于共阴极的),或者输出低电平(对于共阳极)。
根据Cyclone片子已经分配好的针脚设置好针脚。
四、实验步骤建立-----个工程-----输入程序-----软件编译------生成下载文件-----下载—调试。
五、实验程序module led1(led); //模块名led1output[7:0] led; //定义输出端口reg[7:0] led; //定义寄存器always //过程1beginled = 8'b10101010; //输出0xAAendendmodule六、思考题(1)写出使用QuartusII软件开发工程的完整的流程。
建立一个工程—输入程序—软件编译综合—生成下载文件—下载—硬件调。
实验二流水灯实验一、实验目的通过此试验让大家进一步了解熟悉和掌握FPGA开发软件的使用方法及软件编程方法。
学习简单的时序电路的设计和硬件测试。
二、实验内容本实验的内容是建立用于控制LED流水灯的简单硬件电路,要求在SmartSOPC上实现LED1-LED8发光二极管流水灯的显示。
三、实验原理这里的显示用分频模块(int_div)得到的较低的始终作为信号,在此时钟下,对输入数据进行移位,就得到了流水灯的效果。
四、实验步骤建立工程—输入源程序—调用模块—生成符号—调用符号—连成电路图—编译—下载—调试五、实验程序 原理图VCCclockINPUT led[7..0]OUTPUTclk led[7..0]ledwaterinstF_DIV 24000000F_DIV_WIDTH 25Parameter Valueclockclk_outint_divinst1六、思考题1.本实验顶层采用了图形输入的方式,若采用文本输入方式,如何编写顶层文件?写出相应程序。
module led2(clock,led); input clock; output [7:0]led; wire p;int_div u1( .clock(clock),.clk_out(p)); ledwater u2(.clk(p),.led(led)); endmodule实验三键盘、LED发光实验一、实验目的本实验的主要目的是联系顶层模块的设计。
学习和体会分支条件语句case的使用及FPGA的I/O控制。
二、实验内容用跳线把key1-key8和指定的引脚连起来,以实现功能控制。
三、实验原理FPGA的所有的I/O控制块允许每个引脚单独的配置为输入口。
只要配置正确,则一暗淡几个键中有键输入,在检测到键盘输入的情况下,继续判断其键盘值并作出相应的处理。
四、实验步骤1:按以前的步骤建立工程,并按说明书进行配置引脚,未用的按三态处理。
2:对文件进行编译,并检错。
3:按说明短接跳帽和连接跳线。
4:观察输入情况。
五、实验程序module keyled(key,led); //模块名keyledinput[7:0] key; //定义键盘输入口output[7:0] led; //定义发光管输出口reg[7:0] led_r; //定义寄存器reg[7:0] buffer_r;assign led = led_r; //输出键值always@(key) //过程1beginbuffer_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,则给寄存器赋值0x00default: led_r = 8'b11111111; //否则给寄存器赋值0xff endcaseendendmodule六、思考题1.能否用if语句改写本实验程序?如果能,写出相应程序。
module keyled(key,led); //模块名keyledinput[7:0] key; //定义键盘输入口output[7:0] led; //定义发光管输出口reg[7:0] led_r; //定义寄存器reg[7:0] buffer_r;assign led = led_r; //输出键值always@(key) //过程1beginbuffer_r = key; //读取键值if (buffer_r==8'b11111110) led_r = 8'b11111110;else if (buffer_r==8'b11111101) led_r = 8'b11111100;else if (buffer_r==8'b11111011) led_r = 8'b11111000;else if (buffer_r==8'b11110111) led_r =8'b11110000;else if (buffer_r==8'b11101111) led_r = 8'b11100000;else if (buffer_r==8'b10111111) led_r = 8'b10000000;else (buffer_r==8'b01111111) led_r = 8'b00000000;endendmodule实验四静态数码管显示实验一、实验目的学习LPM兆模块的调用。
二、实验内容建立7段译码显示模块,用于控制LED数码管的静态显示。
要求在实验箱上的数码管依显示0—9和A-F16个字符。
三、实验原理本实验通过分频模块int_div 分频得到1HZ的频率信号,加载4位计数器的时钟输入端,计数循环输出0-9,A-F 16个数,最后通过七段译码后在数码显示出来。
四、实验步骤1:立源程序文件dec17s.v,输入程序代码并保存,并对此生成符号。
2:添加LPM模块并按需要生成相应的文件。
五、实验程序VCCclockINPUT seg[7..0]OUTPUTdig[7..0]OUTPUT up counterclockq[3..0]counterinstd[3..0]seg[7..0]decl7sinst1F_DIV 48000000F_DIV_WIDTH 26Parameter Value clock clk_outint_divinst2GND数码管位码输出数码管段码输出六、思考题1.本实验采用的是共阳极数码管,若采用共阴极数码管,有什么不同?答:对应显示相同的数时,输入的不同。
2.如何显示HHHHHHHH 和PPPPPPPP? 答:H 对应的89h, P 对应的时73h ;实验五 动态数码管显示实验一、实验目的学习动态扫描显示的原理图及电路的设计。
二、实验内容1:在SmartSOPC 试验箱上完成LED 数码管的动态显示“1-8”个数字。
2:放慢扫描速度演示动态显示的原理过程。
三、实验原理虽然每次只有一个LED 显示,但只要扫描显示速率够快,由于人的视觉余辉效应,使我们仍会感觉所有的数码管都在同时显示。
四、实验步骤1:建立一个空白工程,并命名。
2:对该工程文件进行全程编译处理,若在编译过程中发现错误,则找出并更改,直至编译成功为止。
3:从设计文件创建模块。
4:将光盘中EDA目录文件拷贝到工程目录。
5:添加常量兆功能模块。
五、实验程序module scan_led(clk_1k,d,dig,seg); //模块名scan_ledinput clk_1k; //输入时钟input[31:0] d; //输入要显示的数据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; //定义计数寄存器assign dig = dig_r; //输出数码管选择assign seg = seg_r; //输出数码管译码结果always @(posedge clk_1k) //定义上升沿触发进程begincount <= count + 1'b1;endalways @(posedge clk_1k)begincase(count) //选择扫描显示数据3'd0:disp_dat = d[31:28]; //第一个数码管3'd1:disp_dat = d[27:24]; //第二个数码管3'd2:disp_dat = d[23:20]; //第三个数码管3'd3:disp_dat = d[19:16]; //第四个数码管3'd4:disp_dat = d[15:12]; //第五个数码管3'd5:disp_dat = d[11:8]; //第六个数码管3'd6:disp_dat = d[7:4]; //第七个数码管3'd7:disp_dat = d[3:0]; //第八个数码管endcasecase(count) //选择数码管显示位3'd0:dig_r = 8'b01111111; //选择第一个数码管显示3'd1:dig_r = 8'b10111111; //选择第二个数码管显示3'd2:dig_r = 8'b11011111; //选择第三个数码管显示3'd3:dig_r = 8'b11101111; //选择第四个数码管显示3'd4:dig_r = 8'b11110111; //选择第五个数码管显示3'd5:dig_r = 8'b11111011; //选择第六个数码管显示3'd6:dig_r = 8'b11111101; //选择第七个数码管显示3'd7:dig_r = 8'b11111110; //选择第八个数码管显示endcaseendalways @(disp_dat)begincase(disp_dat) //七段译码4'h0:seg_r = 8'hc0; //显示04'h1:seg_r = 8'hf9; //显示14'h2:seg_r = 8'ha4; //显示24'h3:seg_r = 8'hb0; //显示34'h4:seg_r = 8'h99; //显示44'h5:seg_r = 8'h92; //显示54'h6:seg_r = 8'h82; //显示64'h7:seg_r = 8'hf8; //显示74'h8:seg_r = 8'h80; //显示84'h9:seg_r = 8'h90; //显示94'ha:seg_r = 8'h88; //显示a4'hb:seg_r = 8'h83; //显示b4'hc:seg_r = 8'hc6; //显示c4'hd:seg_r = 8'ha1; //显示d4'he:seg_r = 8'h86; //显示e4'hf:seg_r = 8'h8e; //显示fendcaseendendmodule六、思考题1.说出数码管动态显示的原理。