大连理工大学软件学院
《FPGA设计与应用实验》实验报告
姓 名:王鑫明 学号: 201292223 班级: 软1212
姓 名: 席翀宇 学号: 201292383 班级: 软1212
组 号: 实验箱编号:
实验时间:2015年5月20日 实验室:嵌入式实验室 实验台:SEED教学实验平台_
指导教师: 王 洁 成绩:
实验2:LED点阵实验
一、实验目的和要求
熟悉ISE8.2开发环境,掌握工程的生成方法;
熟悉SEED-XDTK_V4实验环境;
了解HDL语言在FPGA中的使用;
了解定时器的HDL实现。
实验内容:
定时时钟设计;
LED点阵点亮。
二、实验原理和内容
实验内容:
定时时钟设计;
LED点阵点亮。
三、主要仪器设备及软件编程环境
主要仪器设备:
SEED-XDTK_V4实验环境
软件编程环境:
ISE8.2开发环境
Modelsim仿真工具
四、实验步骤与编程
实验步骤:
创建工程
添加HDL资源文件
编写代码
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date: 09:43:00 04/18/2008
// Design Name:
// Module Name: dot
// Project Name:
// Target Devices:
// Tool versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
module dot(CLK_IN, nRST, CPLD_E,DOT_DATA , DOT_CON ,AD_nCS , DA_nCS ,USB_nCS,LCD_nCS );
input CLK_IN;
input nRST;
output [1:0] CPLD_E;
output [15:0] DOT_DATA;
output [15:0]DOT_CON;
output USB_nCS;
output AD_nCS;
output DA_nCS;
output LCD_nCS;
reg CLK_OUT = 1'b1;
reg [15:0]DOT_CON =16'h0000;
reg [15:0]DOT_DATA =16'h0000;
reg [13:0] DIV_counter = 14'h000;
reg [3:0] cnt= 4'h0;
reg [13:0] cnt1=14'h000;
reg [2:0] cnt2=3'h0;
parameter DIV_FACTOR = 14'h1f98;
//CPLD功能切换
assign CPLD_E = 2'b11;
//其他芯片功能禁止
assign USB_nCS = 1'b1;
assign AD_nCS = 1'b1;
assign DA_nCS = 1'b1;
assign LCD_nCS = 1'b1;
//时钟分频
always@(posedge CLK_IN)
begin
if(!nRST)
begin
CLK_OUT <= 1'b1;
DIV_counter <= 10'h000;
end
else
begin
if(DIV_counter <= DIV_FACTOR )
begin
DIV_counter <= DIV_counter + 1;
end
else
begin
DIV_counter <= 12'h000;
CLK_OUT <= !CLK_OUT;
end
end
end
//点亮点阵
always@(posedge CLK_OUT)
begin
cnt = cnt+1;
cnt1 = cnt1+1;
if(cnt1 == 14'hf)
begin
cnt2 = cnt2+1;
end
if(cnt2 == 3'h0)
begin
if(cnt == 4'h0)
begin
DOT_CON <= 16'h8000;
DOT_DATA <= 16'h0000;
end
else if(cnt == 4'h1)
begin
DOT_CON <= 16'h4000;
DOT_DATA <= 16'hfffe;
end
else if(cnt == 4'h2)
begin
DOT_CON <= 16'h2000;
DOT_DATA <= 16'h0104;
end
else if(cnt == 4'h3)
begin
DOT_CON <= 16'h1000;
DOT_DATA <= 16'h0100;
end
else if(cnt == 4'h4)
begin
DOT_CON <= 16'h0800;
DOT_DATA <= 16'h0100;
end
else if(cnt == 4'h5)
begin
DOT_CON <= 16'h0400;
DOT_DATA <= 16'h0100;
end
else if(cnt == 4'h6)
begin
DOT_CON <= 16'h0200;
DOT_DATA <= 16'h0100;
end
else if(cnt == 4'h7)
begin
DOT_CON <= 16'h0100;
DOT_DATA <= 16'h0100;
end
else if(cnt == 4'h8)
begin
DOT_CON <= 16'h0080;
DOT_DATA <= 16'h7ffc;
end
else if(cnt == 4'h9)
begin
DOT_CON <= 16'h0040;
DOT_DATA <= 16'h0108;
end
else if(cnt == 4'ha)
begin
DOT_CON <= 16'h0020;
DOT_DATA <= 16'h0100;
end
else if(cnt == 4'hb)
begin
DOT_CON <= 16'h0010;
DOT_DATA <= 16'h0100;
end
else if(cnt == 4'hc)
begin
DOT_CON <= 16'h0008;
DOT_DATA <= 16'h0100;
end
else if(cnt == 4'hd)
begin
DOT_CON <= 16'h0004;
DOT_DATA <= 16'h0100;
end
else if(cnt == 4'he)
begin
DOT_CON <= 16'h0002;
DOT_DATA <= 16'h7ffc;
end
else if(cnt == 4'hf)
begin
DOT_CON <= 16'h0001;
DOT_DATA <= 16'h0008;
end
end
///////////////////////////////////////////////
if(cnt2 == 3'h1)
begin
if(cnt == 4'h0)
begin
DOT_CON <= 16'h8000;
DOT_DATA <= 16'h2040;
end
else if(cnt == 4'h1)
begin
DOT_CON <= 16'h4000;
DOT_DATA <= 16'h2040;
end
else if(cnt == 4'h2)
begin
DOT_CON <= 16'h2000;
DOT_DATA <= 16'h2040;
end
else if(cnt == 4'h3)
begin
DOT_CON <= 16'h1000;
DOT_DATA <= 16'h2040;
end
else if(cnt == 4'h4)
begin
DOT_CON <= 16'h0800;
DOT_DATA <= 16'h27fc;
end
else if(cnt == 4'h5)
begin
DOT_CON <= 16'h0400;
DOT_DATA <= 16'he040;
end
else if(cnt == 4'h6)
begin
DOT_CON <= 16'h0200;
DOT_DATA <= 16'h2040;
end
else if(cnt == 4'h7)
begin
DOT_CON <= 16'h0100;
DOT_DATA <= 16'h15f4;
end
else if(cnt == 4'h8)
begin
DOT_CON <= 16'h0080;
DOT_DATA <= 16'h0a4e;
end
else if(cnt == 4'h9)
begin
DOT_CON <= 16'h0040;
DOT_DATA <= 16'h2110;
end
else if(cnt == 4'ha)
begin
DOT_CON <= 16'h0020;
DOT_DATA <= 16'h60a0;
end
else if(cnt == 4'hb)
begin
DOT_CON <= 16'h0010;
DOT_DATA <= 16'h8040;
end
else if(cnt == 4'hc)
begin
DOT_CON <= 16'h0008;
DOT_DATA <= 16'h00a0;
end
else if(cnt == 4'hd)
begin
DOT_CON <= 16'h0004;
DOT_DATA <= 16'h1110;
end
else if(cnt == 4'he)
begin
DOT_CON <= 16'h0002;
DOT_DATA <= 16'h33f8;
end
else if(cnt == 4'hf)
begin
DOT_CON <= 16'h0001;
DOT_DATA <= 16'h4000;
end
end
///////////////////////////////////////
if(cnt2 == 3'h2)
begin
cnt2 = 3'h0;
end
end
endmodule
烧写
1. 进入烧写界面
2. 在第三个芯片载入bit文件
3. 右击第三个芯片开始烧写
五、实验数据与结果分析
六、讨论、建议
延时采用循环计数获得时钟信号实现,通过自摸软件对点阵进行赋值。
第二篇:点阵实验报告
1.实验目的
(1)掌握LED16X16点阵显示与单片机接口的方法;
(2)了解LED16X16点阵显示的基本原理与功能;
(3)掌握LED16X16点阵显示软件编程方法。
2.点阵显示简介
汉字显示屏到处可见,被广泛应用于汽车报站器,广告屏等。本文中的16*16LED显示屏是采用4块8*8LED合并而成的,实验介绍一种实用的汉字显示屏的制作,考虑到电路元件的易购性,采用了16×16的点阵模块,汉字显示的原理我们以UCDOS中文宋体字库为例,每一个字由16行16列的点阵组成显示。即国标汉字库中的每一个字均由256点阵来表示。
LED阵列的显示方式是按显示编码的顺序,一行一行地显示。每一行的显示时间大约为4ms,由于人类的视觉暂留现象,将感觉到8行LED是在同时显示的。若显示的时间太短,则亮度不够,若显示的时间太长,将会感觉到闪烁。本文采用低电平逐行扫描,高电平输出显示信号。即轮流给行信号输出低电平,在任意时刻只有一行发光二极管是处于可以被点亮的状态 ,其它行都处于熄灭状态。
3.点阵屏有两个类型,一类为共阴极(左),另一类则为共阳极(右),下图给出了两种类型的内部电路原理及相应的管脚图
4 .系统电路设计
(1) 单片机系统及外围电路
单片机采用MSC-51 或其兼容系列芯片,采用24MHZ 或更高频率晶振,以获得较高的刷新频率,时期显示更稳定。单片机的串口与列驱动器相连,用来显示数据。P1 口低4 位与行驱动器相连,送出行选信号;P1.5~P1.7 口则用来发送控制信号。P0 口和P2口空着,在有必要的时候可以扩展系统的ROM 和RAM。
(2)列驱动电路
列驱动电路有集成电路74HC595 构成。它具有一个8 位串入并出的移位寄存器和一个8 位输出锁存器的结构,而且移位寄存器和输出锁存器的控制是各自独立的,可以实现在显示本行列数据的同时,传送下一行的列数据,既达到重叠处理的目的。它的输入侧有8 个串行移位寄存器,每个移位寄存器的输出都连接一个输出锁存器。引脚SI 是串行数据的输入端。引脚SCK 是移位寄存器的移位时钟脉冲,在其上升沿发生移位,并将SI 的下一个数据打入最低位。移位后的各位信号出现在各移位寄存器的输出端,也就是输出锁存器的输入端。RCK 是输出锁存器的打入信号,其上升沿将移位寄存器的输出打入输出锁存器。引脚G 是输出三态门的开放信号,只有当其为低时锁存器的输出才开放,否则为高组态。SCLR 信号是移位寄存器清零输入端,当其为低时移位寄存器的输出全部为零。由于SCK 和RCK 两个信号是互相独立的,所以能够做到输入串行移位与输出锁存互不干扰。芯片的输出端为
QA~QH,最高位QH 可作为多片74HC595 级联应用时,向上一级的级联输出。但因为QH受输出锁存器的打入控制,所以还从输出锁存器前引出QH,作为与移位寄存器完全同步的级联输出。
(3)行驱动器
单片机P1 口低4 位输出的行号经4/16 线译码器74LS154 译码后生成16 条行选通信号线,再经过驱动器驱动对应的行线。一条行线上要带动16 列的LED 进行显示,按每一LED 器件20MA 电流计算,16 个LED 同时发光时,需要320MA 电流,选通三极管8550作为驱动管可满足要求。
5.LED16X16点阵显示的基本原理
为了让大家更清楚的理解点阵的扫描过程,在这我们以显示汉字“计”为例,来说明其扫描原理:
单片机首先由P2口输出显示数据信号给右部分的第一行如图9所示,即第一行的P20---P27口。方向为P20到P27 ,显示汉字“计”时,P22点亮,由左到右排,为P20灭,P21灭, P22亮,P23灭, P24灭, P25灭, P26灭, P27灭。即二进制00000100,转换为16进制为 0x05。
右部分的第一行完成后,继续扫描左半部的第一行,为了接线的方便,我们仍设计成由左往右扫描,即从P00向P07方向扫描,从上图可以看到,这一行没有LED亮,均灭, 即为00000000,16进制则为0x00。然后单片机再次转向右半部第二行,仍为P22点亮,为00000100,即16进制0x05。这一行完成后继续进行左半部分的第二行扫描,P03点亮,为二进制00001000,即16进制0x09
依照这个方法,继续进行下面的扫描,一共扫描32个8位,
6.LED16X16点阵显示软件编程如下
#include<reg51.h>
#include<absacc.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define com8255 XBYTE[0xff2b]//宏定义口地址
#define pa8255 XBYTE[0xff28]
#define pb8255 XBYTE[0xff29]
#define pc8255 XBYTE[0xff2a]
sbit c=PSW^7;
bit flag=0;
int x1,x,y,temp,tp;
uint code table[]={
/*"计",*/
0x02,0x02,0x42,0x33,0x00,0x02,0x02,0x02,0x02,0xFF,0x02,0x02,0x02,0x06,0x02,0x00,
0x00,0x00,0x00,0xFE,0x04,0x08,0x10,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,
/*"算",*/
0x10,0x20,0xC0,0x5F,0x75,0x55,0x55,0x35,0xD5,0x55,0x75,0x5F,0x40,0x40,0x00,0x00,
0x10,0x10,0x11,0xD2,0x7C,0x50,0x50,0x50,0x50,0x50,0x7F,0xD0,0x10,0x30,0x10,0x00,
/*"机", */
0x08,0x08,0x0B,0xFF,0x09,0x08,0x00,0x3F,0x20,0x20,0x20,0x7F,0x20,0x00,0x00,0x00,
0x20,0xC0,0x00,0xFF,0x01,0x82,0x04,0xF8,0x00,0x00,0x00,0xFC,0x02,0x02,0x0E,0x00,
void delay(unsigned int i)
{
unsigned int j,k;
for(k=0;k<i;k++)
for(j=0;j<100;j++);
}
void main(void)
{
com8255=0x80;//8255全输出
pa8255=0xff;
pb8255=0xff;
while(1)
{
x1=0x00;
do {uchar ,counter1,counter2;
unsigned int j,k,d;
for(k=0;k<1;k++)
{
for(j=0;j<10;j++) //扫描一个字的次数,决定了字的显示时间长短
{counter1=0x00;
counter2=0x00;
x=x1;
y=0x01;
c=0;
while(counter1<0x08)//描扫左8列
{counter1++;
pc8255=table[x];//输出左半字的上半字段码
temp=0x10+x;
P1=table[temp];//输出左半字下半字段码
x++;
temp=x;
temp=temp&0x0f;
if(!temp){temp=0x10+x;x=temp;}
c=0;
tp=~y;
pa8255=tp; //依次选中左半字的各列
d=70;
while(d--){};
pa8255=0xff; //关闭扫描,清隐
pb8255=0xff; //关闭扫描,清隐
y=_crol_(y,1);//位码左移,显示左移效果
}
c=0;
y=0x01;
while(counter2<0x08)//描扫右8列
{ counter2++;
pc8255=table[x]; //输出右半字的上半字段码
temp=0x10+x;
P1=table[temp]; //输出右半字的下半字段码
x++;
temp=x;
temp=temp&0x0f;
if(!temp){temp=0x10+x;x=temp;}
c=0;
tp=~y;
pb8255=tp; //依次选中右半字的各列
d=70;
while(d--){};
pa8255=0xff;
pb8255=0xff;
y=_crol_(y,1); //位码左移,显示左移效果
}
}
}
x1++;
temp=x1;
temp=temp&0x0f;
if(!temp) {temp=0x10+x1;x1=temp;} //显示完一个字后取下一个字的字模
}
while(x!=16*16*2);
}
}
7.实习总结
通过查阅大量的相关资料,详细了解了LED 的发光原理和LED 显示屏的原理,了解了LED 的现状,清楚地了解了LED 显示屏与其它显示屏相比较有那些
优点,明确了研究目标.总结这次实习,遇到一些问题,如显示时间的长短,显示时间短,会出现亮度不强,显示时间长,会出现闪烁,只有合理选择时间,才可出现理想的结果。通过这次实习,使我受益匪浅,只有自己动手才可发现问题,解决问题、、、、
8.参考文献
(1)《单片机原理及接口技术》 胡汉才 20##年第三版
(2)《51单片机C语言编程》 郭天祥
(3)《单片机技术实验实训教程》 周越 中国水利水电出版社 20##年
(4)《Protel电路设计与制版宝典》 赵建 电子工业出版社 20##年
(5)《单片机技术与应用》 东南大学出版社 郭建江