将字符打印到LCD - Verilog HDL

时间:2017-04-14 11:43:25

标签: printing ascii verilog lcd

我有一个关于在LCD屏幕上打印字符的问题。

我正在使用Altera DE1-SoC 5CSEMA5F31C6N 和LT24 Terasic LCD。

我有一个关于在液晶显示屏上连续打印字母的问题。

我依靠x和y计数器来屏幕上的光栅,从屏幕左上角的(0,0)开始。 将x一直递增到行的末尾,一旦到达结尾,将x重置为0,递增y然后再次继续计算x直到屏幕结束

LCD pixels

我正在创建数组以打印字符值(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

1 个答案:

答案 0 :(得分:0)

我会看看你最初如何定义你的寄存器。根据您在RTL中访问它们的方式,我希望它们被定义为

reg [23:0] total_char_data [0:7]

这在一行中确实是你在8中尝试做的,但是注意到[23:0]在左侧(打包数组)而[0:7]在右侧(解包数组)在我的定义中。如果这样做,我认为您现有的作业有效。

基于此,我不知道你是如何得到两个角色出现的。我想象一下,在8x8窗口内只能看到一个角色。我不认为你的编译中有任何有趣的警告说“比特范围之外”?