FPGA字符显示原理
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
0 0 0 0
0 0 0 0 0 0 0 0
0 8 0 4
0 0 0 0
0 0 0 0 0 0 0 0
1 F F C
0 0 0 4
0 0 0 4
0 0 0 0
0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
addr <= `CHAR_a;
addr <= 9’d97; 也可以模仿1602液晶显示模块中的字符库 形式,将起始地址设为所存字符的ASCII码。 如a的ASCII码为97,则起始地址设为97。
但是需要的存储容量要大些,而且汉字是没 有ASCII码的。
=
100 0144 101 0144 102 0144 103 00FC 103 0004
字 模
0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
字库容量: 地址线与所有字符 所占列数(决定于 字符数量)有关, 数据线与一个字符 所占行数有关。 如该例中假设存放 2个汉字的字符, 则所占列数为16列, 地 址 线 为 4bit, 数 据线为16bit。
0 8 0 4
char_rom char_rom_inst //查字符库 (.address(addr), .clock(clk),.q(data)); always @(posedge clk) begin if((y_cnt >= 10'd5 && //起始位置 y_cnt <= 10'd20) begin addr=0; if (x_cnt == 10'd10) addr <= 8; //求地址 else if (x_cnt >= 10'd11 & x_cnt <= 10'd17 ) addr<=addr+1; end end wire [3:0] dis_bit=10'd20-y_cnt; always @ (posedge clk) //数据位 rgb<=3'000; if (y_cnt>=5 && y_cnt<=20 && x_cnt>=10 && x_cnt<=17 ) begin if(data[dis_bit]) rgb <= 3'b001; //RGB赋值
10 9 8
7
6 5 4 3 2 1 0
16
17 18 19 20
0
0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 1 0 0 1 1 0 0 0
0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0
0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0
addr 0 1 2 data 0000 0804 0804
0 0 0 0
0 0
0 8 0 4
0 0
0 8 0 4
0 0
1 F F C
0 0
0 0 0 4
0 0
0 0 0 4
0 0
0 0 0 0
0 0
0 0 0 0
0 0
0
0 0 0
0
0
0
0
0
0
0 0 0
0
0 0 0
0
0 0 0
0
0 0 0
1 1 1
0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0
0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0
0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
六、字符显示程序设计思路
例:要在屏幕第5行第10列开始显示蓝色字符a
屏幕显示
y x1011121314151617
5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
Hale Waihona Puke char_rom char_rom_inst //查字符库,求数据 (.address(addr), .clock(clk),.q(data)); 七、字符显示关键语句
HS CLK
40ns
32us
X
Y
毛刺,时钟可以是系 统时钟。
将起始地址用宏定义的方法与字符关联
addr data
字 符
`define CHAR_a 9’d97;
49 50 51 52 53 54 55 56 97 98 99
0000 0804 0804 1FFC 0004 0004 0000 0000 0000 0098 0124 a 1
0 0 9 8
0 0 0 0 0 0 0 0 1 0 0 1 1 0 0 0
0 1 2 4
0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0
0 1 4 4
0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0
0 1 4 4
0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0
always @(posedge clk) //求字符库地址 begin if((y_cnt >= 10'd5 && y_cnt <= 10'd20) begin 两 个 always 块 , 第 if (x_cnt == 10'd10) //屏幕显示起始位置 一个求字符库地址, addr <= 8; //求字符起始地址 时钟是像素时钟; else if (x_cnt >= 10'd11 && x_cnt <= 10'd17 ) addr<=addr+1; 第二个是给rgb赋值, else addr=0; 可以设计成组合函数, end 但是会有毛刺,设计 end 成时序电路可以减小 wire [3:0] dis_bit=10'd20-y_cnt; always @ (posedge clk) //rgb赋值 rgb<=3'000; if (y_cnt>=5 && y_cnt<=20 && x_cnt>=10 &&_cnt<=17 ) begin if(data[dis_bit]) rgb <= 3'b001; //字符色 else rgb <= 3'b111; end
四、字符显示原理
正确显示字符的要素:
0,0
x_cnt 10,5
Char_ROM
DATA ADDR
屏幕显示 y x1011121314151617
5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
CLK
y_cnt
1. 确定屏幕显示起始位置 屏幕显示起始位置由行列计数值决定 2. 求Char_ROM地址 Char_ROM起始地址由所要显示的字符决 定(可将地址用宏定义的方法与字符关联) 3. 读取该地址对应的数据 4. 确定数据位和像素位置的关系 数据位和像素位置的关系由行计数值、起始 行数、字符所占行数决定 5. 显示颜色,RGB赋值 若数据为1,则对应位置上的RGB赋值为 字符色,否则RGB值赋值为背景色
第5行第10列起始
五、数据位和显示位置的关系
屏幕显示
y x
5 6 1011121314151617
7
8 9 10 11 12 13 14 15 0 0 0 0
可以看出: y=5的位置要显示bit15的,即: y=5 → data[15] y=6 → data[14] y=7 → data[13] …… y=i → data[20-i]
字符
1
a
对下一列, y_cnt=5~20处的 RGB进行赋值。 若数据位为1,则对应位置上的 RGB赋值001,否则赋值000
显示完最后一列停止循环
七、字符显示关键语句
addr data 0 0000 0804 0804 1FFC 0004 0004 0000 0000 0000 0098 0124 0144 0144 0144 00FC 0004 a 1 字 符
1 1
0 0
0
0 0 0
0
0 0 0
0
0 0 0
1
1 1 1
0
0 0 0
0
0 0 0
0
0 0 0
0
0 0 0
3
4 5 6 7
1FFC
0004 0004 0000 0000
0
0 0 0
0
0 0
0
0 0
1
1 1 1
0
0
0
0 0
0
0 0
0
0 0
0
0 0 0
1 1
0
0
1 1 0
0
0
0
0
0
0
0
0
0
0
0
0
注意:一列数据为一个字。
三、字库容量
例:设字库中只有1和a两个字模,如右图
则对应字符库的数据表如下表
Char_ROM address data 0 0000 1 0804 2 0804 3 1FFC 4 0004 5 0004 6 0000 7 0000 8 0000 9 0098 10 0124 11 0144 12 0144 13 0144 14 00FC 15 0004
5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
addr data 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 0000 0804 0804 1FFC 0004 0004 0000 0000 0000 0098 0124 0144 0144 0144 00FC 0004
采用字符库形式 显示字符的原理
一、字库
要显示字母、数字、符号、汉字等,需要自建字库
(以后简称Char_ROM)。
Char_ROM中存放字模数据。
字模尺寸自行设定,例如英文字母、数字等可设置
为16行*8列像素,汉字可设置为16行*16列像素。
二、字模举例
例:16行*8列的字模1的数据如右图 则对应字符库的数据表如下表
x_cnt=10, y_cnt=5时, 将a的起始地址8赋值给 Char_ROM地址变量addr
对x_cnt=10, y_cnt=5~20处 的RGB进行赋值。 若数据位为1,则对应位置上的 RGB赋值001,否则赋值000
下一个像素时钟(下一列),地址加1 屏幕显示 y x1011121314151617
一般公式: bit=起始行数-y+15 数据表
bit
15 14 13 12 11
即: 第y行的颜色决定于第“20-y”位 数据是否为1, 如果data[20-y]=1,则显示字 符色,否则显示背景色。
rgb赋值语句: if(char_data[10'd20-y_cnt]) vga_rgb <= 3’b001; else vga_rgb <= 3’b000;
0 1 4 4
0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0
0 0 F C
0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0
0 0 0 4
0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
1 1
1 1
0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 8 0 4
0 0 0 0
0 0 0 0 0 0 0 0
1 F F C
0 0 0 4
0 0 0 4
0 0 0 0
0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
addr <= `CHAR_a;
addr <= 9’d97; 也可以模仿1602液晶显示模块中的字符库 形式,将起始地址设为所存字符的ASCII码。 如a的ASCII码为97,则起始地址设为97。
但是需要的存储容量要大些,而且汉字是没 有ASCII码的。
=
100 0144 101 0144 102 0144 103 00FC 103 0004
字 模
0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
字库容量: 地址线与所有字符 所占列数(决定于 字符数量)有关, 数据线与一个字符 所占行数有关。 如该例中假设存放 2个汉字的字符, 则所占列数为16列, 地 址 线 为 4bit, 数 据线为16bit。
0 8 0 4
char_rom char_rom_inst //查字符库 (.address(addr), .clock(clk),.q(data)); always @(posedge clk) begin if((y_cnt >= 10'd5 && //起始位置 y_cnt <= 10'd20) begin addr=0; if (x_cnt == 10'd10) addr <= 8; //求地址 else if (x_cnt >= 10'd11 & x_cnt <= 10'd17 ) addr<=addr+1; end end wire [3:0] dis_bit=10'd20-y_cnt; always @ (posedge clk) //数据位 rgb<=3'000; if (y_cnt>=5 && y_cnt<=20 && x_cnt>=10 && x_cnt<=17 ) begin if(data[dis_bit]) rgb <= 3'b001; //RGB赋值
10 9 8
7
6 5 4 3 2 1 0
16
17 18 19 20
0
0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 1 0 0 1 1 0 0 0
0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0
0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0
addr 0 1 2 data 0000 0804 0804
0 0 0 0
0 0
0 8 0 4
0 0
0 8 0 4
0 0
1 F F C
0 0
0 0 0 4
0 0
0 0 0 4
0 0
0 0 0 0
0 0
0 0 0 0
0 0
0
0 0 0
0
0
0
0
0
0
0 0 0
0
0 0 0
0
0 0 0
0
0 0 0
1 1 1
0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0
0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0
0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
六、字符显示程序设计思路
例:要在屏幕第5行第10列开始显示蓝色字符a
屏幕显示
y x1011121314151617
5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
Hale Waihona Puke char_rom char_rom_inst //查字符库,求数据 (.address(addr), .clock(clk),.q(data)); 七、字符显示关键语句
HS CLK
40ns
32us
X
Y
毛刺,时钟可以是系 统时钟。
将起始地址用宏定义的方法与字符关联
addr data
字 符
`define CHAR_a 9’d97;
49 50 51 52 53 54 55 56 97 98 99
0000 0804 0804 1FFC 0004 0004 0000 0000 0000 0098 0124 a 1
0 0 9 8
0 0 0 0 0 0 0 0 1 0 0 1 1 0 0 0
0 1 2 4
0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0
0 1 4 4
0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0
0 1 4 4
0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0
always @(posedge clk) //求字符库地址 begin if((y_cnt >= 10'd5 && y_cnt <= 10'd20) begin 两 个 always 块 , 第 if (x_cnt == 10'd10) //屏幕显示起始位置 一个求字符库地址, addr <= 8; //求字符起始地址 时钟是像素时钟; else if (x_cnt >= 10'd11 && x_cnt <= 10'd17 ) addr<=addr+1; 第二个是给rgb赋值, else addr=0; 可以设计成组合函数, end 但是会有毛刺,设计 end 成时序电路可以减小 wire [3:0] dis_bit=10'd20-y_cnt; always @ (posedge clk) //rgb赋值 rgb<=3'000; if (y_cnt>=5 && y_cnt<=20 && x_cnt>=10 &&_cnt<=17 ) begin if(data[dis_bit]) rgb <= 3'b001; //字符色 else rgb <= 3'b111; end
四、字符显示原理
正确显示字符的要素:
0,0
x_cnt 10,5
Char_ROM
DATA ADDR
屏幕显示 y x1011121314151617
5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
CLK
y_cnt
1. 确定屏幕显示起始位置 屏幕显示起始位置由行列计数值决定 2. 求Char_ROM地址 Char_ROM起始地址由所要显示的字符决 定(可将地址用宏定义的方法与字符关联) 3. 读取该地址对应的数据 4. 确定数据位和像素位置的关系 数据位和像素位置的关系由行计数值、起始 行数、字符所占行数决定 5. 显示颜色,RGB赋值 若数据为1,则对应位置上的RGB赋值为 字符色,否则RGB值赋值为背景色
第5行第10列起始
五、数据位和显示位置的关系
屏幕显示
y x
5 6 1011121314151617
7
8 9 10 11 12 13 14 15 0 0 0 0
可以看出: y=5的位置要显示bit15的,即: y=5 → data[15] y=6 → data[14] y=7 → data[13] …… y=i → data[20-i]
字符
1
a
对下一列, y_cnt=5~20处的 RGB进行赋值。 若数据位为1,则对应位置上的 RGB赋值001,否则赋值000
显示完最后一列停止循环
七、字符显示关键语句
addr data 0 0000 0804 0804 1FFC 0004 0004 0000 0000 0000 0098 0124 0144 0144 0144 00FC 0004 a 1 字 符
1 1
0 0
0
0 0 0
0
0 0 0
0
0 0 0
1
1 1 1
0
0 0 0
0
0 0 0
0
0 0 0
0
0 0 0
3
4 5 6 7
1FFC
0004 0004 0000 0000
0
0 0 0
0
0 0
0
0 0
1
1 1 1
0
0
0
0 0
0
0 0
0
0 0
0
0 0 0
1 1
0
0
1 1 0
0
0
0
0
0
0
0
0
0
0
0
0
注意:一列数据为一个字。
三、字库容量
例:设字库中只有1和a两个字模,如右图
则对应字符库的数据表如下表
Char_ROM address data 0 0000 1 0804 2 0804 3 1FFC 4 0004 5 0004 6 0000 7 0000 8 0000 9 0098 10 0124 11 0144 12 0144 13 0144 14 00FC 15 0004
5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
addr data 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 0000 0804 0804 1FFC 0004 0004 0000 0000 0000 0098 0124 0144 0144 0144 00FC 0004
采用字符库形式 显示字符的原理
一、字库
要显示字母、数字、符号、汉字等,需要自建字库
(以后简称Char_ROM)。
Char_ROM中存放字模数据。
字模尺寸自行设定,例如英文字母、数字等可设置
为16行*8列像素,汉字可设置为16行*16列像素。
二、字模举例
例:16行*8列的字模1的数据如右图 则对应字符库的数据表如下表
x_cnt=10, y_cnt=5时, 将a的起始地址8赋值给 Char_ROM地址变量addr
对x_cnt=10, y_cnt=5~20处 的RGB进行赋值。 若数据位为1,则对应位置上的 RGB赋值001,否则赋值000
下一个像素时钟(下一列),地址加1 屏幕显示 y x1011121314151617
一般公式: bit=起始行数-y+15 数据表
bit
15 14 13 12 11
即: 第y行的颜色决定于第“20-y”位 数据是否为1, 如果data[20-y]=1,则显示字 符色,否则显示背景色。
rgb赋值语句: if(char_data[10'd20-y_cnt]) vga_rgb <= 3’b001; else vga_rgb <= 3’b000;
0 1 4 4
0 0 0 0 0 0 0 1 0 1 0 0 0 1 0 0
0 0 F C
0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0
0 0 0 4
0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0
1 1
1 1
0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0