滚动显示“verilog”字符串程序代码及相关说明
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验报告
一、 实验题目
8*8点阵显示设计
二、 题目要求
用8*8点阵滚动显示一组字符串
本题中,设计使用8*8点阵循环滚动显示VerilogHDL字符串。
三、 设计思路
显示效果:字符串VerilogHDL向左以一速度移动,每次移动一步。
显示原理:
首先应该实现一个字符的静态显示任务。
由于人的视觉暂留效应,只要图像的变化速率大于25帧每秒,人所看到的图像就是一副运动的景象。
由于显示一个字符就是需要控制每一个像素——每一个LED点的亮灭来组合形成整个一副图像,所以为了达到静态显示的目的,必须先使得显示每个点的时间小于(1 / 64) * ( 1 / 25)S,既一帧中每个点的暂留时间。
由于一次可对一行或者一列赋值(控制),所以时间上只需每次刷屏时间小于1 / 25 s 、每行属性显示的时间小于( 1 / 8 ) * ( 1 /25 ) s。
为了达到字符运动的效果,需要在每一帧画面的时间( 1 / 25 ) s 里改变一次需要显示的屏幕的内容即可。
如图一,
\
图一、显示字样图示
首先,L7=1(置高),L5—L0都置低,行信号为:H=8’h00,此步骤显示第一列LED。
按照这个方法,分别:
L6=1,H=8’H40;显示第二列LED
L5=1,H=8’H78;显示第三列LED
… …
L0=1,H=8’H40;显示第八列LED
每条语句持续时间小于( 1 / 8 ) * ( 1 /25 ) s;如此构成第一幅图像。
接下来使数据向左移动,只需重复上述步骤,唯一不同的是以前的L7的那一列数据不再是H=8’h00,而是H=8’H40;L6的数据H=8’H78变成同理,依次向后移动一位。
这样一个移动后,又显示了一屏。
之后就按照这个规律对后来的数据进行如此操作,形成连续的可移动的图像了。
程序流程图参考如下:
如图,按照图二、图三所示的程序流程图即可达到显示一个向左流动的字符运动效果。
图二、程序流程图
图三、任务display的流程图
系统设计循环移动字符串的各字符编码如下(使用PCtoLCD2002取
字模软件)
V:00H 40H 78H 04H 02H 04H 78H 40H
e: 00H 3CH 52H 92H 92H 52H 34H 00H
r: 00H 00H 80H FEH 10H 20H 40H 40H
i: 00H 00H 00H 20H BFH 02H 00H 00H
l: 00H 00H 00H 7EH 02H 02H 00H 00H
o: 00H 3CH 42H 42H 42H 3CH 00H 00H
g: 00H 00H 64H 92H 92H 6CH 00H 00H
H: 00H FEH 10H 10H 10H 10H FEH 00H
D: 00H 7EH 42H 42H 42H 3CH 00H 00H
L: 00H 00H 7EH 02H 02H 02H 02H 00h
结构框图如下:
图四、系统框图
四、 实验总结
本实验作为一个显示系统还存在很多问题,还不具备数据更新、方向调节、颜色控制等功能,只是简单的使用了任务、寄存器来实现一个字符串的循环滚动功能,但是时序的思想将会在以后的设计中作为主要的指导思想。
编程的思维也发生很大改变,对使用其他高级语言也会起到一个指点作用。
附件:程序清单及部分仿真图
/*
工程内容:在8*8点阵显示器上滚动显示字符“S”
Line : 点阵的列输出
Column : 点阵的行输出
Clk : 点阵显示的时钟信号
*/
module dianzhen5(line,column,clk);
input clk;
output [7:0] line,column;
reg [7:0] line,column;
reg[7:0] i,j,k; //定义计算用于显示具体一个点的参数
//--------------------------
task display; //定义任务display
reg[7:0] column_out; //行显示中间变量,可以省略
reg[7:0] line_out; //列显示中间变量,可以省略
begin
case(i) //每一个i值进来以后,判断需要显示一个点的横坐标0:column_out=8'H01; //
1:column_out=8'H02; //
2:column_out=8'H04; //
3:column_out=8'H08; //
4:column_out=8'H10; //
5:column_out=8'H20; //
6:column_out=8'H40; //
7:column_out=8'H80; //
endcase
k=(i+j)%80; //k用取余计算来确定,使字符能够向左移动,每次移动一步case(k) //每一个k值进来以后,判断需要显示一行上面的纵
//坐标上的数据
0:line_out = 8'h00; // V
1:line_out = 8'h40; //
2:line_out = 8'h78; //
3:line_out = 8'h04; //
4:line_out = 8'h02; //
5:line_out = 8'h04; //
6:line_out = 8'h78; //
7:line_out = 8'h40; //
8:line_out = 8'h00; // e
9:line_out = 8'h3C; //
10:line_out = 8'h52; //
11:line_out = 8'h92; //
12:line_out = 8'h92; //
13:line_out = 8'h52; //
14:line_out = 8'h34; //
15:line_out = 8'h00; //
16:line_out = 8'h00; // r 17:line_out = 8'h00; // 18:line_out = 8'h80; // 19:line_out = 8'hFE; // 20:line_out = 8'h10; // 21:line_out = 8'h20; // 22:line_out = 8'h40; // 23:line_out = 8'h40; //
24:line_out = 8'h00; // i 25:line_out = 8'h00; // 26:line_out = 8'h00; // 27:line_out = 8'h20; // 28:line_out = 8'hBF; // 29:line_out = 8'h02; // 30:line_out = 8'h00; // 31:line_out = 8'h00; //
32:line_out = 8'h00; // l 33:line_out = 8'h00; // 34:line_out = 8'h00; // 35:line_out = 8'h7E; // 36:line_out = 8'h02; // 37:line_out = 8'h02; // 38:line_out = 8'h00; // 39:line_out = 8'h00; //
40:line_out = 8'h00; // o 41:line_out = 8'h3C; // 42:line_out = 8'h42; // 43:line_out = 8'h42; // 44:line_out = 8'h42; // 45:line_out = 8'h3C; // 46:line_out = 8'h00; // 47:line_out = 8'h00; //
48:line_out = 8'h00; // g 49:line_out = 8'h00; // 50:line_out = 8'h64; // 51:line_out = 8'h92; // 52:line_out = 8'h92; // 53:line_out = 8'h6C; // 54:line_out = 8'h00; // 55:line_out = 8'h00; //
56:line_out = 8'h00; // H 57:line_out = 8'hFE; // 58:line_out = 8'h10; // 59:line_out = 8'h10; // 60:line_out = 8'h10; //
61:line_out = 8'h10; //
62:line_out = 8'hFE; //
63:line_out = 8'h00; //
64:line_out = 8'h00; // D
65:line_out = 8'h7E; //
66:line_out = 8'h42; //
67:line_out = 8'h42; //
68:line_out = 8'h42; //
69:line_out = 8'h3C; //
70:line_out = 8'h00; //
71:line_out = 8'h00; //
72:line_out = 8'h00; // l
73:line_out = 8'h00; //
74:line_out = 8'h7E; //
75:line_out = 8'h02; //
76:line_out = 8'h02; //
77:line_out = 8'h02; //
78:line_out = 8'h02; //
79:line_out = 8'h00; //
endcase
column = column_out; //结束判断后给行输出赋值
line = line_out; //结束判断后给列输出赋值
end
endtask
//--------------------------
always @(posedge clk )
begin
i=i+1; // 每个clk信号来了以后自加1
if(i==9)
begin
i=0; // 八行都显示完毕后归零
j=j+1; // 同时纵向所有数据向左移动一位
end //
if(j==81) j=0; // 都完成移动后计数器j归零
display; // 调用显示任务,clk连续不断,保持视觉暂留,形成滚动//的S字样end
endmodule。