2017-04-14 9 views
-1

LCD 화면에 문자를 인쇄하는 것과 관련된 질문이 있습니다.LCD에 문자 인쇄 - Verilog HDL

저는 Altera DE1-SoC 5CSEMA5F31C6N과 LT24 Terasic LCD를 사용하고 있습니다.

LCD에 문자를 연속으로 인쇄하는 것과 관련된 질문이 있습니다.

화면의 왼쪽 상단 모서리에서 (0,0) 시작하여 화면에서 래스터의 x 및 y 카운터를 사용하고 있습니다. 증가는 0으로 X를 재설정 Y를 증가 다음 화면이 끝날 때까지 다시 X를 계산 계속 행의 마지막에 모든 방법을 X, 한 번 끝에 도달

LCD pixels

내가 문자 값 (8x8 픽셀)을 인쇄 할 배열 만들기

긴 배열은 모든 문자에 대해 '각 픽셀 행'을 연결 한 다음 카운터가 화면 전체에 걸쳐 표시되는 동안 각 문자의 픽셀이 lcd로 인쇄됩니다.

예 : row0 - 모든 문자에 대해 픽셀의 첫 번째 행을 인쇄합니다. row1 - 모든 문자에 대해 픽셀의 두 번째 행을 인쇄합니다.

제가 2 개 문자를 인쇄하려고 할 때

하지만, 인쇄되는 문자의 순서 [원점에서 (0,0)] 반전

예컨대 만약 내가 '나는'다음 '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 23]을에 당신이 당신의 RTL에서 그들을 액세스하는 방법에 따라, 나는 그들이

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

이것은 당신이 8 일을하려고했는지 한 라인에서와 같이 정의하지만,이 통지 될 예정 왼쪽 (packed array)이고 [0 : 7]은 내 정의에서 오른쪽 (unpacked array)입니다. 이렇게하면 기존 과제가 효과가 있다고 생각합니다.

그러나이 사실을 바탕으로 두 캐릭터가 어떻게 나타나는지 모릅니다. 8x8 창 안에 한 캐릭터 만 등장한다는 것을 상상했을 것입니다. 나는 당신이 "비트 범위 밖"과 같은 말을하는 컴파일에 흥미로운 경고를 가지고 있다고 가정하지 않습니까?