资源描述
数字电子技术课程设计报告(LED矩形点阵)
———————————————————————————————— 作者:
———————————————————————————————— 日期:
16
个人收集整理 勿做商业用途
【设计题目】 LED点阵循环显示设计
【设计任务及要求】
利用EDA/SOPC试验开发平台提供的16*16点阵LED以及EP2C35核心板,实现循环显示设定内容,显示内容为自己的“学号名字”。
(1) 手动生成“学号姓名”这几个字符在16*16点阵LED上的字摸(即控制某些LED亮,某些LED灭,可下载字摸软件帮助确定)。
(2) 实现循环显示“学号姓名",并要求左移
(3) 扩展要求:自主设计(如控制循环速度,方向等)。
设计原理及方案:
1、16*16点阵LED内部结构如下图所示。
2、 总体设计框图。
计数器
列数据
列选择
系统时钟输入
输出
输出
16*16点阵
FPGA
3、 各子模块的设计:
(1)分频,扫描
module saomiao (clk_50Mhz,clk_1k);
input clk_50Mhz;
output clk_1k;
reg[24:0] cnt;
reg clk_1k;
always @(posedge clk_50Mhz)
begin
if (cnt〈25000)
begin
cnt〈=cnt+1;
clk_1k<=0;
end
else if(cnt<50000)
begin
cnt〈=cnt+1;
clk_1k〈=1;
end
else cnt=0;
end
endmodule
封装生成的模块如下:
(2)分频,移动,控制速度
module yidong (clk_50Mhz,clk_fourhz,k2,k3);
input clk_50Mhz,k2,k3; // 输入端口声明
output clk_fourhz; // 输出端口声明
reg[24:0] count,ccount;
reg clk_fourhz;
always @(posedge clk_50Mhz)
begin
if ((k2==0) && (k3==0))
ccount<=50000000;
if ((k2==0) && (k3==1))
ccount〈=100000000;
if ((k2==1) && (k3==0))
ccount〈=5000000;
if ((k2==1) && (k3==1))
ccount<=10000000;
if(count<ccount)
begin
count〈=count+1’b1;
clk_fourhz〈=0;
end
else
begin
count〈=0;
clk_fourhz〈=1;
end
end
endmodule
封装生成的模块如下:
(3)显示,控制输出,控制左右移动
module xianshi(clk_saomiao,clk_pingyi,row,con,k);
input clk_saomiao,clk_pingyi,k;
output[15:0] row;
output[15:0] con;
reg[15:0] row;
reg[15:0] con;
integer cnt=0,b=0;
reg[15:0] r[111:0];
initial
begin
// 学号:
r[0]〈=16’b1111_0111_1011_1111;
r[1]<=16'b1111_0111_1101_1111;
r[2]<=16’b1111_0000_0001_1111;
r[3]<=16'b1111_0111_1111_1111;
r[4]<=16'b1111_0111_1111_1111;
r[5]<=16'b1111_1111_1111_1111;
r[6]〈=16'b1111_0111_0011_1111;
r[7]〈=16’b1111_0111_1101_1111;
r[8] <=16'b1111_0111_1101_1111;
r[9]〈=16'b1111_1000_0011_1111;
r[10]<=16'b1111_1111_1111_1111;
r[11] <=16’b1111_1111_1111_1111;
r[12] <=16’b1111_1000_0011_1111;
r[13] 〈=16’b1111_0111_1101_1111;
r[14]〈=16'b1111_0111_1101_1111;
r[15] 〈=16’b1111_1000_0011_1111; //”100"
r[16] <=16’b1111_0111_1011_1111;
r[17] <=16’b1111_0111_1101_1111;
r[18] 〈=16’b1111_0000_0001_1111;
r[19] <=16’b1111_0111_1111_1111;
r[20] 〈=16'b111_0111_1111_1111;
r[21] 〈=16'b1111_1111_1111_1111;
r[22] <=16'b1111_0011_1011_1111;
r[23] 〈=16’b1111_0101_1101_1111;
r[24]<=16’b1111_0110_1101_1111;
r[25]<=16’b1111_0111_0011_1111;
r[26]〈=16’b1111_1111_1111_1111;
r[27]<=16'b1111_1111_1111_1111;
r[28]<=16'b1111_1011_0011_1111;
r[29]〈=16’b1111_0111_1101_1111;
r[30]〈=16'b1111_0111_1101_1111;
r[31]<=16'b1111_1001_0011_1111; //”123”
r[32] 〈=16'b1111_1111_1111_1111;
r[33]<=16'b1111_1111_1111_1111;
r[34]<=16’b1110_1111_1111_1111;
r[35]〈=16’b1110_1111_1110_1111;
r[36]〈=16’b1110_1111_1111_0111;
r[37]<=16'b1110_0000_0000_0111;
r[38]<=16’b1110_1111_1111_1111;
r[39]<=16'b1110_1111_1111_1111;
r[40]<=16'b1111_1111_1111_1111;
r[41] <=16’b1110_1111_1111_1111;
r[42] 〈=16'b1110_1111_1110_1111;
r[43] 〈=16’b1110_1111_1111_0111;
r[44] <=16'b1110_0000_0000_0111;
r[45] <=16’b1110_1111_1111_1111;
r[46] 〈=16’b1111_1111_1111_1111;
r[47] <=16'b1111_1111_1111_1111; //"11”
//姓名:
r[48] <=16’b1111_1111_0110_1111;
r[49]〈=16'b1101_1111_0111_1111;
r[50]<=16’b1110_1111_0111_1011;
r[51]<=16’b1111_0111_0111_1011;
r[52]<=16’b1111_1011_0111_1011;
r[53]〈=16’b1111_1101_0111_1011;
r[54]〈=16'b1111_1110_0111_1010;
r[55]〈=16’b0000_0000_0000_1001;
r[56] 〈=16'b1111_1110_0111_1011;
r[57] <=16’b1111_1101_0111_1011;
r[58] <=16’b1111_1011_0111_1011;
r[59] <=16’b1111_0111_0111_1011;
r[60] <=16’b1110_1111_0111_1011;
r[61] <=16'b1101_1111_0110_1011;
r[62] <=16’b1101_1111_0111_0011;
r[63] <=16’b1111_1111_1111_1111;
r[64]<=16’b1111_1111_0111_1111;
r[65]〈=16'b1111_1111_1011_1111;
r[66]〈=16'b1111_1111_1101_1111;
r[67]〈=16'b0000_0000_0000_1111;
r[68]<=16'b1111_1111_1111_0000;
r[69]<=16’b1011_1111_1011_1111;
r[70]〈=16’b1011_1011_1011_0111;
r[71]〈=16’b1011_1011_1011_0111;
r[72] <=16’b1011_1011_1011_0111;
r[73]〈=16'b1000_0000_0000_0000;
r[74]〈=16’b1011_1011_1011_0111;
r[75] <=16'b1011_1011_1011_0111;
r[76] <=16’b1011_1011_1011_0111;
r[77] 〈=16’b1011_1011_1011_0111;
r[78]<=16’b1011_1111_1011_1111;
r[79] <=16'b1111_1111_1111_1111;
r[80] <=16'b1111_1111_1111_1111;
r[81] <=16'b1011_1101_1111_1111;
r[82] 〈=16'b1100_1110_1111_1111;
r[83] 〈=16’b1111_1111_0111_0111;
r[84] <=16’b1111_1111_1011_0111;
r[85] 〈=16'b1110_1111_1101_1111;
r[86] <=16’b1001_1111_1110_0111;
r[87] 〈=16'b1111_0000_0000_0000;
r[88]<=16'b1110_1111_1110_0111;
r[89]〈=16'b1001_1111_1101_0111;
r[90]〈=16’b1111_1111_1011_0111; r[91]<=16’b1111_1111_0111_0111;
r[92]〈=16'b1110_1110_1111_0111;
r[93]〈=16'b1001_1101_1111_0111;
r[94]〈=16’b1111_1101_1111_1111;
r[95]〈=16’b1111_1111_1111_1111;
r[96]〈=16’b1111_1111_1111_1111;
r[97]<=16’b1111_1111_1111_1111;
r[98]<=16'b1111_1111_1111_1111;
r[99]〈=16’b1111_1111_1111_1111;
r[100]〈=16’b1111_1111_1111_1111;
r[101]〈=16'b1111_1111_1111_1111;
r[102]<=16’b1111_1111_1111_1111;
r[103]〈=16'b1111_1111_1111_1111;
r[104] <=16’b1111_1111_1111_1111;
r[105]〈=16'b1111_1111_1111_1111;
r[106]<=16'b1111_1111_1111_1111;
r[107] <=16'b1111_1111_1111_1111;
r[108] <=16'b1111_1111_1111_1111;
r[109] 〈=16’b1111_1111_1111_1111;
r[110]〈=16’b1111_1111_1111_1111;
r[111] <=16'b1111_1111_1111_1111;
end
always@(posedge clk_pingyi)
begin
if (k==0) //k值控制左右移动
begin
if (b==95)
b〈=0;
else
b<=b+1;
end
else
begin
if (b==0)
b<=96;
else
b<=b-1;
end
end
always@(posedge clk_saomiao)
begin
if(cnt==15)
begin
cnt〈=0;
end
else
cnt〈=cnt+1;
case(cnt)
0: con〈=16'b0000_0000_0000_0001;
1: con〈=16’b0000_0000_0000_0010;
2: con<=16’b0000_0000_0000_0100;
3: con〈=16'b0000_0000_0000_1000;
4: con〈=16’b0000_0000_0001_0000;
5: con〈=16'b0000_0000_0010_0000;
6: con〈=16’b0000_0000_0100_0000;
7: con〈=16'b0000_0000_1000_0000;
8: con<=16'b0000_0001_0000_0000;
9: con〈=16'b0000_0010_0000_0000;
10: con〈=16'b0000_0100_0000_0000;
11: con〈=16’b0000_1000_0000_0000;
12: con〈=16’b0001_0000_0000_0000;
13: con<=16'b0010_0000_0000_0000;
14: con〈=16'b0100_0000_0000_0000;
15: con<=16’b1000_0000_0000_0000;
endcase
//行使能
case(cnt)
0: row〈=r[b+0];
1: row〈=r[b+1];
2: row<=r[b+2];
3: row<=r[b+3];
4: row<=r[b+4];
5: row<=r[b+5];
6: row<=r[b+6];
7: row〈=r[b+7];
8: row〈=r[b+8];
9: row<=r[b+9];
10: row〈=r[b+10];
11: row<=r[b+11];
12: row<=r[b+12];
13: row<=r[b+13];
14: row<=r[b+14];
15: row<=r[b+15];
endcase
end
endmodule
封装生成的模块如下:
【电路设计、仿真与实现】
(1) 电路设计
将封装好的三个模块连接起来。
电路如下:
(2) 电路仿真
扫描模块和移动模块实际上都是分频器,只是分频不一样,前者的分频后频率高(看不到很明显地闪烁),后者低(控制移动速度便于观察)。这里只仿真分频器的功能如下(10分频):
字体显示模块的仿真如下,由于所给频率太高,分频又太大,仿真不易实现。本仿真的clk2取1ns,clk3取32ns,k取0(进行左移)。
(3) 电路实现
将连接好的电路的输入和输出端分别用对应的FBGA管脚封装起来,便可以在实验室的平台上进行电路的实现了.
【分析与讨论】
这次数电课程设计我一共去下载了三次,第一次的时候在那个模版上没有显示,只是看到了列的灯有亮的,回去检查的时候发现是扫描的频率太小了,之前设定的频率只有2Hz,这样的情况下每秒只会显示两列数据,不能得出所需要的显示。将扫描的频率改成10kHz后去下载的时候发现能够正常地循环显示了,这也完成了基本的设计。我中午回去后又对原有程序进行了改写,多加了三个输入端,其中两个输入端用来控制字幕移动的速度,另一个用来控制左右移动,编了一个中午,程序没有错误后,仍然有点忐忑的去下载(quartusⅡ只能检查错误不能检验功能,而且这是最后一次下载机会了),不过去老师那里下载的时候,模版上正常循环我的学号名字显示,而且通过三个附加的输入端可以控制它的左右移动以及移动速度(移动的速度共设定了4个),看到自己所编译的功能都实现后,心情还是很愉悦的。个人感觉整个编译过程中,写自己名字的二进制代码太费劲了。通过这次课程设计,我巩固了之前数电实验课上学的quartusⅡ的一些基本操作,并且会自己编写简单的verilog程序了,有些东西和我们之前学过的一些语言很是相像。最重要的还是我自己学会了如何将之前所学过的知识和查找的资料有机的融合在一起,并且得到自己想要的结果。非常感谢老师在我设计过程中的指导。文档为个人收集整理,来源于网络本文为互联网收集,请勿用作商业用途
【参考文献】
[1] Verilog数字系统设计教程(第2版)(夏宇闻 ,北京航空航天大学出版)
[2] Verilog HDL入门(第3版)
[3] 数字电子技术基础(刘润华,于云华,中国石油大学出版社,2008)
展开阅读全文