본문 바로가기

원s/FPGA

[DE2-115] Lab.4-2: ASCII Decoder

DE2-115 보드를 이용하여 Text LCD 제어를 실습한다.  

 

[Text LCD]

 

[text_lcd.v]

text lcd controller 에서 다음을 수정 기술한다.  

더보기
/////----------------------------------------/////
module text_lcd(
    input           clk, 
    input           rst_n, 	
    input           en,  
    input   [7:0]   din, 
    
    output          lcd_en, 
    output          lcd_rs, 
    output          lcd_rw, 
    output          lcd_on, 
    output  [7:0]   lcd_dout
);

    reg     [2:0]   state;
    reg     [7:0]   cnt;
    parameter   S0 = 0, S1 = 1, S2 = 2, S3 = 3, S4 = 4, S5 = 5;
/////----------------------------------------/////
    always @(posedge clk, negedge rst_n) begin
        if (rst_n == 0) begin
            state		<= S0;
            cnt		<= 8'd0; 
        end
        else begin
            cnt		<= cnt + 1'b1; 
            case (state)
                S0	: begin
                    if (cnt == 8'd70) begin
                        state		<= S1;
                        cnt		<= 8'd0; 
                    end
                end 
                S1	: begin
                    if (cnt == 8'd30) begin
                        state		<= S2;
                        cnt		<= 8'd0; 
                    end
                end 
                S2	: begin
                    if (cnt == 8'd30) begin
                        state		<= S3;
                        cnt		<= 8'd0; 
                    end
                end 
                S3	:  begin
                    if (cnt == 8'd30) begin
                        state		<= S4;
                        cnt		<= 8'd0; 
                    end
                end 
                S4	: begin
                    if (cnt == 8'd16) begin
                        state		<= S5;
                        cnt		<= 8'd0; 
                    end
                end 
                S5	: begin
                    if (cnt == 8'd16) begin
                        state		<= S4;
                        cnt		<= 8'd0; 
                    end
                end 
            endcase
        end
    end
	
    reg             rs; 
    reg             rw; 
    reg     [7:0]   dt;
/////----------------------------------------/////
    always @(posedge clk, negedge rst_n) begin
        if (rst_n == 0) begin
            rs  <= 1'b0;
            rw  <= 1'b0;
            dt  <= 8'h00;
        end
        else begin
            case (state) 
                8'h0	:   {rs, rw, dt}    <= {1'b0, 1'b0, 8'h00}; 
                8'h1	:   {rs, rw, dt}    <= {1'b0, 1'b0, 8'h38};
                8'h2	:   {rs, rw, dt}    <= {1'b0, 1'b0, 8'h0c};
                8'h3	:   {rs, rw, dt}    <= {1'b0, 1'b0, 8'h06};
                8'h4	: begin
                    case (cnt)
                        8'd0:   {rs, rw, dt}    <= {2'b00, 8'h80};
                        8'd1:   {rs, rw, dt}    <= {2'b10, 8'h41};
                        8'd2:   {rs, rw, dt}    <= {2'b10, 8'h6c};
                        8'd3:   {rs, rw, dt}    <= {2'b10, 8'h74};
                        8'd4:   {rs, rw, dt}    <= {2'b10, 8'h65};
                        8'd5:   {rs, rw, dt}    <= {2'b10, 8'h72};
                        8'd6:   {rs, rw, dt}    <= {2'b10, 8'h61};
                        8'd7:   {rs, rw, dt}    <= {2'b10, 8'h20};
                        8'd8:   {rs, rw, dt}    <= {2'b10, 8'h44};
                        8'd9:   {rs, rw, dt}    <= {2'b10, 8'h45};
                        8'd10:  {rs, rw, dt}    <= {2'b10, 8'h32};
                        8'd11:  {rs, rw, dt}    <= {2'b10, 8'h2d};
                        8'd12:  {rs, rw, dt}    <= {2'b10, 8'h31};
                        8'd13:  {rs, rw, dt}    <= {2'b10, 8'h31};
                        8'd14:  {rs, rw, dt}    <= {2'b10, 8'h35};
                        8'd15:  {rs, rw, dt}    <= {2'b10, 8'h20};
                        8'd16:  {rs, rw, dt}    <= {2'b10, 8'h20};
                    endcase
                end
                8'h5	: begin
                    case (cnt)
                        8'd0:   {rs, rw, dt}    <= {2'b00, 8'hc0};
                        8'd1:   {rs, rw, dt}    <= {2'b10, 8'h48};
                        8'd2:   {rs, rw, dt}    <= {2'b10, 8'h65};
                        8'd3:   {rs, rw, dt}    <= {2'b10, 8'h6c};
                        8'd4:   {rs, rw, dt}    <= {2'b10, 8'h6c};
                        8'd5:   {rs, rw, dt}    <= {2'b10, 8'h6f};
                        8'd6:   {rs, rw, dt}    <= {2'b10, 8'h20};
                        8'd7:   {rs, rw, dt}    <= {2'b10, 8'h57};
                        8'd8:   {rs, rw, dt}    <= {2'b10, 8'h6f};
                        8'd9:   {rs, rw, dt}    <= {2'b10, 8'h72};
                        8'd10:  {rs, rw, dt}    <= {2'b10, 8'h6c};
                        8'd11:  {rs, rw, dt}    <= {2'b10, 8'h64};
                        8'd12:  {rs, rw, dt}    <= {2'b10, 8'h21};
                        8'd13:  {rs, rw, dt}    <= {2'b10, 8'h20};
                        8'd14:  {rs, rw, dt}    <= {2'b10, 8'h20};
                        8'd15:  {rs, rw, dt}    <= {2'b10, 8'h20};
//                        8'd16:  {rs, rw, dt}    <= {2'b10, 8'h20};
                        8'd16:  {rs, rw, dt}    <= {2'b10, din};
                    endcase
                end
            endcase
        end
    end
	
    assign  lcd_en = ~clk;  
    assign  lcd_rs = rs;
    assign  lcd_rw = rw;
    assign  lcd_dout = dt;
    assign  lcd_on = en; 
/////----------------------------------------/////

endmodule

 

[lut_8.v]

lut_8.v 코드에서 dout 의 값을 ASCII 로 변경 기술한다.  

더보기
/////----------------------------------------/////
module lut_8(
    input               clk, 
    input               rst_n,
    input               en, 
    input       [2:0]   addr, 
    output  reg [7:0]   dout
); 

/////----------------------------------------/////
    always @(posedge clk, negedge rst_n) begin
        if (rst_n == 0) begin
            dout <= 8'h20; 
        end
        else begin
            if(en == 1) begin
                case (addr)
                    4'd7	: dout = 8'h37;	//	7
                    4'd6	: dout = 8'h36;	//	6
                    4'd5	: dout = 8'h35;	//	5
                    4'd4	: dout = 8'h34;	//	4
                    4'd3	: dout = 8'h33;	//	3
                    4'd2	: dout = 8'h32;	//	2
                    4'd1	: dout = 8'h31;	//	1
                    4'd0	: dout = 8'h30;	//	0
                endcase				
            end
            else begin
                dout <= 8'h20; 
            end
        end
    end
endmodule

 

[Test Result]

이를 합성 후 출력결과를 학인하면 dout 이 LED 에 출력됨을 알 수 있다.

'원s > FPGA' 카테고리의 다른 글

[DE2-115] Lab.5-2: UART Receiver  (0) 2020.07.26
[DE2-115] Lab.5-1: UART transmitter  (0) 2020.07.25
[DE2-115] Lab.4-1: Text LCD  (0) 2020.07.18
[DE2-115] Lab.3-2: 7-segment Decoder  (0) 2020.07.12