我有一个关于在LCD屏幕上打印字符的问题。
我正在使用Altera DE1-SoC 5CSEMA5F31C6N 和LT24 Terasic LCD。
我有一个关于在液晶显示屏上连续打印字母的问题。
我依靠x和y计数器来屏幕上的光栅,从屏幕左上角的(0,0)开始。 将x一直递增到行的末尾,一旦到达结尾,将x重置为0,递增y然后再次继续计算x直到屏幕结束
我正在创建数组以打印字符值(8x8像素)
长数组连接所有字符的'每行像素',然后当计数器在屏幕上光栅化时,每个字符的像素将打印到lcd。
例如。 row0 - 打印所有字符的第一行像素。 row1 - 为所有字符打印第二行像素。
然而,当我尝试打印2个字符时,正在打印的字符的顺序与原点(0,0)的顺序相反
e.g。如果我想打印'我'然后'M'。我实际按顺序得到'M'和'I'。
当我尝试打印3个字符时,根本没有显示任何字符!
我真的很难理解为什么会这样,因为计数器值用于测试角色的当前位然后绘制像素
任何帮助都将不胜感激。
我有基本的verilog理解,但对c编程感到满意
谢谢,
代码片段如下。
////////////////////////////// code ////////////////////////////////////////////
reg [0] totalCharData [23:0]; // pixel row0
reg [1] totalCharData [23:0]; // pixel row1
reg [2] totalCharData [23:0]; // pixel row2
reg [3] totalCharData [23:0]; // pixel row3
reg [4] totalCharData [23:0]; //
reg [5] totalCharData [23:0]; //
reg [6] totalCharData [23:0]; //
reg [7] totalCharData [23:0]; // pixel row 7
// character ‘I'
totalCharData[7][7:0] = 8'b11111111;
totalCharData[6][7:0] = 8'b11111111;
totalCharData[5][7:0] = 8'b00111100;
totalCharData[4][7:0] = 8'b00111100;
totalCharData[3][7:0] = 8'b00111100;
totalCharData[2][7:0] = 8'b00111100;
totalCharData[1][7:0] = 8'b11111111;
totalCharData[0][7:0] = 8'b11111111;
// character ‘M'
totalCharData[7][15:8] = 8'b11100111;
totalCharData[6][15:8] = 8'b11101111;
totalCharData[5][15:8] = 8'b11111111;
totalCharData[4][15:8] = 8'b11111111;
totalCharData[3][15:8] = 8'b11010011;
totalCharData[2][15:8] = 8'b11000011;
totalCharData[1][15:8] = 8'b11000011;
totalCharData[0][15:8] = 8'b11000011;
// character ‘E'
totalCharData[7][23:16] = 8'b11111111;
totalCharData[6][23:16] = 8'b11111111;
totalCharData[5][23:16] = 8'b11100000;
totalCharData[4][23:16] = 8'b11111111;
totalCharData[3][23:16] = 8'b11111111;
totalCharData[2][23:16] = 8'b11100000;
totalCharData[1][23:16] = 8'b11111111;
totalCharData[0][23:16] = 8’b11111111;
// X Counter
always @ (posedge clock or posedge resetApp) begin
if (resetApp) begin
xAddr <= 8'b0;
end else if (pixelReady) begin
if (xAddr < (WIDTH-1)) begin
xAddr <= xAddr + 8'd1;
end else begin
xAddr <= 8'b0;
end
end
end
// Y Counter
always @ (posedge clock or posedge resetApp) begin
if (resetApp) begin
yAddr <= 9'b0;
end else if (pixelReady && (xAddr == (WIDTH-1))) begin
if (yAddr < (HEIGHT-1)) begin
yAddr <= yAddr + 9'd1;
end else begin
yAddr <= 9'b0;
end
end
end
// draw characters to the lcd
always @ (posedge clock or posedge resetApp) begin
if (resetApp) begin
pixelData[15:0] <= 16'h0000; ; // wipe the full screen with background
end else begin // whilst bitton held, make blue
if ((xAddr>=0) && (xAddr<24) && (yAddr>=0) && (yAddr<8))begin // draw complete row of pixels for all the characters in line
if ((totalCharData[yAddr][xAddr] == 1'b1))begin // test the current bit using the counters
pixelData[15:0] <= 16'hFFE0; // yellow - draw pixel if the current bit is 1 as defined
end
else begin
pixelData[15:0] <= 16'h0000;
end // else
end else begin
pixelData[15:0] <= 16'h0000; // black screen
end
end
end
答案 0 :(得分:0)
我会看看你最初如何定义你的寄存器。根据您在RTL中访问它们的方式,我希望它们被定义为
reg [23:0] total_char_data [0:7]
这在一行中确实是你在8中尝试做的,但是注意到[23:0]在左侧(打包数组)而[0:7]在右侧(解包数组)在我的定义中。如果这样做,我认为您现有的作业有效。
基于此,我不知道你是如何得到两个角色出现的。我想象一下,在8x8窗口内只能看到一个角色。我不认为你的编译中有任何有趣的警告说“比特范围之外”?