EDA实验报告文档格式.docx
《EDA实验报告文档格式.docx》由会员分享,可在线阅读,更多相关《EDA实验报告文档格式.docx(7页珍藏版)》请在冰豆网上搜索。
②建立工程并对工程进行设计;
③设置编译选项并编译硬件系统;
④下载硬件设计到目标FPGA;
⑤观察LED的状态。
5参考程序
点亮LED
①利用连续赋值语句assign语句来实现,文件名led.v
moduleled(led);
//模块名led1
output[7:
0]led;
//定义输出端口
assignled=8'
b10101010;
//输出0xAA
endmodule
②利用过程赋值语句来实现,文件名led1.v
moduleled1(led);
reg[7:
//定义寄存器
always//过程1
begin
led=8'
end
6思考:
若使实验箱上LED1~4亮,LED5~8灭,怎么修改程序。
实验2应用QuartusII完成流水灯的设计
通过此实验让用户进一步了解、熟悉和掌握CPLD/FPGA开发软件的使用方法及VerilogHDL的编程方法。
学习简单时序电路的设计和硬件测试。
本实验的内容是建立可用于控制LED流水灯的简单硬件电路,要求在SmartSOPC实验箱上实现LED1~LED8发光二极管流水灯显示。
①在LED1~LED8引脚上周期性的输出流水数据,如原来输出的数据是11111100则表示点亮LED1、LED2,流水一次后,输出的数据应该为11110000,而此时则应点亮LED1~LED3三个LED发光二极管,就可以实现LED流水灯。
为了观察方便,流水速率最好在2Hz左右。
在QuickSOPC核心板上有一个48MHz的标准时钟源,该时钟脉冲CLOCK与芯片的28管脚相连。
为了产生2Hz的时钟脉冲,在此调用了一个分频模块(int_div模块,位于光盘中EDA_Component目录下),通过修改分频系数来改变输出频,当分频系数为24x106时,输出即为2Hz的频率信号。
②Int_div分频模块说明:
int_div模块是一个占空比为50%的任意整数分频器。
输入时钟为clock,输出时钟为clk_out。
其中F_DIV为分频系数,分频系数范围为1~2n,若要改变分频系数,改变参数F_DIV和F_WIDTH到相应范围即可。
在本例中输入时钟为48MHz,要得到2Hz的信号,所以分频系数为48x106/2=24x106;
对于分频系数为24x106为的数需要一个25位宽的计数器即可。
②建立工程并对工程进行设计,工程名为led_water.qpf;
③新建VerilogHDL源程序文件ledwater.v,并对程序进行综合编译,若发现错误,找出并改正错误,直至编译成功为止;
④对硬件进行配置;
⑤对管脚进行配置,将与ledwater模块led[7:
0]连接的管脚命名为led[7:
],int_div模块的clk_out与ledwater模块的clk相连接;
⑥将生成的ledwater.sof文件加载到FPGA中,然后运行。
观察实验箱上LED流水灯的状态。
ledwater.v
moduleledwater[led,clk];
//模块名ledwater
output[7:
//定义LED输出口
inputclk;
//定义时钟输入口
reg[8:
0]led_r;
//定义输出寄存器
assignled=led[7:
0];
//寄存器输出
always@(posedgeclk)//在时钟上升沿触发进程
led_r<
=led_r<
<
1;
//是,则输出左移一位
if(led_r==9’d0)//循环完毕吗?
=9’b111111111;
//是,则重新赋初值
6思考题
①实现2种以上方法实现不同的花样流水。
②将几种方法,用一个程序让其轮流实现。
实验3应用QuartusII完成动态数码管显示
学习动态扫描显示的原理及电路的设计。
被实验的内容是建立数码管动态扫描显示模块,具体内容如下:
①在SmartSOPC实验箱上完成LED数码管的动态显示“1~8”8个数字;
②放慢扫描速度演示动态显示的原理过程。
一个FPGA的片子如果带动多个(比如说8个)数码管,选用静态显示的话,管脚很容易不够用,于是大多采用动态显示的方式。
本次采用共阳极的数码管(abcdefgh)(h是小数点)都分别连到SEG0~SEG7,8个数码管分别由8个选通信号DIG0~DIG7来选择,选通信号为高电平“0”,被选择的数码管显示数据,其余关闭。
根据这种电路状态,通过在段信号输入口加上希望在该对应数码管上显示的数据,于是随着选通信号的扫描就能实现扫描的目的。
虽然每次只有一个LED显示,但只要扫描显示速率足够快,由于人的视觉余辉效应,使我们仍会感觉所有的数码管都在同时显示。
②建立工程并对工程进行设计,然后命名为scan_led.qpf;
③新建VerilogHDL源程序文件scan_led.v,并对程序进行综合编译,若发现错误,找出并改正错误,直至编译成功为止;
④从设计文件创建模块,由scan_led.v生成名为scan_led.bsf的模块符号文件;
⑤选择目标器件并对相应的引脚进行锁定,将scan_led.bdf文件设置为顶层实体;
⑥下载硬件设计到目标FPGA;
⑦将生成的ledwater.sof文件加载到FPGA中,然后运行。
5实验程序
modulescan_led(clk_1k,d,dig,seg);
//模块名scan_led
inputclk_1k;
//输入时钟
input[31:
0]d;
//输入要显示的数据
0]dig;
//数码管选择输出引脚
0]seg;
//数码管段输出引脚
0]seg_r;
//定义数码管输出寄存器
0]dig_r;
//定义数码管选择输出寄存器
reg[3:
0]disp_dat;
//定义显示数据寄存器
reg[2:
0]count;
//定义计数寄存器
assigndig=dig_r;
//输出数码管选择
assignseg=seg_r;
//输出数码管译码结果
always@(posedgeclk_1k)//定义上升沿触发进程
count<
=count+1'
b1;
always@(posedgeclk_1k)
case(count)//选择扫描显示数据
3'
d0:
disp_dat=d[31:
28];
//第一个数码管
d1:
disp_dat=d[27:
24];
//第二个数码管
d2:
disp_dat=d[23:
20];
//第三个数码管
d3:
disp_dat=d[19:
16];
//第四个数码管
d4:
disp_dat=d[15:
12];
//第五个数码管
d5:
disp_dat=d[11:
8];
//第六个数码管
d6:
disp_dat=d[7:
4];
//第七个数码管
d7:
disp_dat=d[3:
//第八个数码管
endcase
case(count)//选择数码管显示位
dig_r=8'
b01111111;
//选择第一个数码管显示
b10111111;
//选择第二个数码管显示
b11011111;
//选择第三个数码管显示
b11101111;
//选择第四个数码管显示
b11110111;
//选择第五个数码管显示
b11111011;
//选择第六个数码管显示
b11111101;
//选择第七个数码管显示
b11111110;
//选择第八个数码管显示
endcase
always@(disp_dat)
case(disp_dat)//七段译码
4'
h0:
seg_r=8'
hc0;
//显示0
h1:
hf9;
//显示1
h2:
ha4;
//显示2
h3:
hb0;
//显示3
h4:
h99;
//显示4
h5:
h92;
//显示5
h6:
h82;
//显示6
h7:
hf8;
//显示7
h8:
h80;
//显示8
h9:
h90;
//显示9
ha:
h88;
//显示a
hb:
h83;
//显示b
hc:
hc6;
//显示c
hd:
ha1;
//显示d
he:
h86;
//显示e
hf:
h8e;
//显示f
6日积月累
动态扫描时显示刷新频率最好大于50Hz,即每显示完一轮的时间不超过20ms,每个数码管显示的时间不能太长也不能太短,时间太长可能会影响刷新率,导致总体显示呈现闪烁的现象;
时间太短发光二极管的电流导通时间也就短,会影响总体的显示亮度。
一般控制在1ms左右。