// // Title : LCD test fixture // Author : Carl Ebeling // Company : CSE 370 // //------------------------------------------------------------------------------------------------- // // File : lcd_tf.v // Description : This test fixture emulates the LCD, checking as much as possible valid timing // //------------------------------------------------------------------------------------------------- `timescale 1ns / 1ns module lcd_tf (reset, RS, EN, RW, data); input reset, RS, EN, RW; input [7:0] data; reg [2:0] resetCnt; // Counts through the reset sequence time dataTime, RSTime, ENTime, resetTime; parameter CMD0 = 8'h1, CMD1 = 8'h33, CMD2 = 8'hC, CMD3 = 8'h6; parameter hold = 7, setup = 7; initial begin resetCnt = 0; dataTime = 0; RSTime = 0; ENTime = 0; end always @(negedge reset) resetTime = $time; always @(data) begin dataTime = $time; if (~reset && (dataTime != resetTime) && (EN==0) && (($time - ENTime) < hold)) begin $display("Error: Data hold time not met: %t", ($time-ENTime)); $stop; end end always @(RS) begin RSTime = $time; if (~reset && (RSTime != resetTime) && (EN==0) && ($time - ENTime) < hold) begin $display("Error: RS hold time not met: %t", ($time-ENTime)); $stop; end end always @(posedge EN) begin ENTime = $time; // Check RS setup time - there is no setup/hold wrt. data if ((ENTime != resetTime) && ($time - RSTime) < setup) begin $display("Error: RS setup time not met: %t", ($time-RSTime)); $stop; end end always @(negedge EN) begin if (reset == 0) begin ENTime = $time; if (($time - dataTime) < setup) begin $display("Error: Data setup time not met: %t", ($time-dataTime)); $stop; end if (($time - RSTime) < setup) begin $display("Error: RS setup time not met: %t", ($time-RSTime)); $stop; end if (RW !== 0) begin $display("Error: RW should be 0"); $stop; end if (RS === 0) begin // Writing a command case (resetCnt) 0: begin // First reset if (data == CMD0) begin $display("Display cleared"); resetCnt = 1; end else begin $display("Error: Invalid reset command 0"); $stop; end end 1: begin if (data == CMD1) begin $display("Display function set"); resetCnt = 2; end else begin $display("Error: Invalid reset command 1"); $stop; end end 2: begin if (data == CMD2) begin $display("Display turned on"); resetCnt = 3; end else begin $display("Error: Invalid reset command 2"); $stop; end end 3: begin if (data == CMD3) begin $display("Display entry mode set"); resetCnt = 4; end else begin $display("Error: Invalid reset command 3"); $stop; end end default: begin $display("Error: Too many reset commands"); $stop; end endcase // case(resetCnt) end else if (RS === 1) begin // Writing a character if (resetCnt != 4) begin $display("Display has not been properly reset"); end $display("Write Character: %c", data); end // else: !if(RS == 0) end // if (reset == 0) end // always @ (negedge EN) endmodule