2017-04-14 2 views
-1

液晶画面に印刷文字に関する質問があります。文字をLCDに印刷する - Verilog HDL

私は、アルテラDE1-SoC 5CSEMA5F31C6NとLT24テラシックLCDを使用しています。

私はLCDの行に文字を印刷することに関して質問があります。

画面の左上隅の(0,0)から始まる、ラスターのxとyカウンターに依存しています。 インクリメントは、私は、行の終わりまでずっとX、一旦終わりに達し、0にXリセット、Yをインクリメントし、画面の端

LCD pixels

まで再びXをカウントし続けます(8x8 px)

長い配列は、すべての文字に対して「各行の行」を連結し、カウンタが画面全体でラスタ化されている間に、各文字のピクセルがlcdに印刷されます。

例えば、 row0 - すべての文字に対して1行目のピクセルを印刷します。 row1 - すべての文字に対して2行目のピクセルを印刷します。

iは2つの文字を印刷しようとするが、印刷される文字の順序は、[原点(0,0)から】反転さ

例えばもし私が '私は'次に 'M'を印刷したいです。私は実際に 'M'と '私'の順番で取得します。

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

最初にレジスタを定義する方法を見ていきます。 [23:0]上にある、あなたのRTLでそれらにアクセスしているかに基づいて、私は彼らが

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

これは、あなたが8でやろうとしたものを1行でないとして定義され、それに気づくことが予想されます(梱包された配列)、[0:7]は私の定義の右側(展開されていない配列)です。このようにすると、あなたの既存の割り当てが機能すると思います。

これに基づいて、どのように2文字が表示されるのかわかりません。私はそれを見て、8x8ウィンドウ内には1文字だけしか現れないと想像していたでしょう。私はあなたのコンパイルで "ビット範囲外"のような面白い警告があるとは思いませんか?