URL
https://opencores.org/ocsvn/lcd_block/lcd_block/trunk
Subversion Repositories lcd_block
Compare Revisions
- This comparison shows the changes necessary to convert path
/lcd_block
- from Rev 7 to Rev 8
- ↔ Reverse comparison
Rev 7 → Rev 8
/trunk/hdl/iseProject/lcd_controller.v
3,7 → 3,8
module lcd_controller( |
input rst, |
input clk, |
input [7:0] data_in, |
input rs_in, |
input [7:0] data_in, |
input strobe_in, |
input [7:0] period_clk_ns, |
output lcd_e, |
25,11 → 26,12
localparam lcd_init_wait_40us = 8; |
localparam lcd_init_write_02 = 9; |
localparam lcd_init_wait_50us = 10; |
localparam lcd_init_strobe = 11; |
localparam lcd_init_state_done = 11; |
localparam lcd_init_strobe = 12; |
reg [3:0] lcd_init_states, lcd_init_state_next; // Declare two variables of 4 bits to hold the FSM states |
reg [19:0] counter_wait_lcd_init; |
reg [7:0] counter_wait_strobe_lcd_init; |
reg [19:0] time_wait_lcd_init; |
reg [23:0] counter_wait_lcd_init; |
reg [8:0] counter_wait_strobe_lcd_init, counter_wait_stabilize_lcd_init; |
reg [23:0] time_wait_lcd_init; |
reg [3:0] lcd_init_data_out; // FSM output LCD_DATA |
reg lcd_init_e_out; // FSM output LCD_E |
reg lcd_init_done; |
36,13 → 38,19
|
// States for FSM that send data to LCD |
localparam lcd_data_rst = 1; |
localparam lcd_data_wait = 2; |
localparam lcd_data_wait_1us = 2; |
localparam lcd_data_wr_nibble_high = 3; |
localparam lcd_data_wr_nibble_low = 4; |
localparam lcd_data_strobe = 5; |
localparam lcd_data_wait_40us = 6; |
localparam lcd_data_done = 7; |
reg [19:0] time_wait_lcd_data; |
reg [19:0] counter_wait_lcd_data; |
reg [8:0] counter_wait_strobe_lcd_data, counter_wait_stabilize_lcd_data; |
reg [3:0] lcd_data_states, lcd_data_state_next; // Declare two variables of 4 bits to hold the FSM states |
reg [3:0] lcd_data_data_out; // FSM output LCD_DATA |
reg lcd_data_e_out; // FSM output LCD_E |
reg done; |
|
|
/* |
55,8 → 63,10
lcd_init_states <= lcd_init_rst; |
counter_wait_lcd_init <= 0; |
counter_wait_strobe_lcd_init <= 0; |
counter_wait_stabilize_lcd_init <= 0; |
lcd_init_e_out <= 0; |
lcd_init_done <= 0; |
lcd_init_data_out <= 0; |
end |
else |
begin |
73,20 → 83,32
lcd_init_wait: |
begin |
counter_wait_lcd_init <= counter_wait_lcd_init + period_clk_ns; |
if (counter_wait_lcd_init > time_wait_lcd_init) |
lcd_init_states <= lcd_init_state_next; |
if (counter_wait_lcd_init >= time_wait_lcd_init) |
begin |
lcd_init_states <= lcd_init_state_next; |
counter_wait_lcd_init <= 0; |
end |
end |
|
// Strobe the LCD for at least 240 ns |
lcd_init_strobe: |
begin |
lcd_init_e_out = 1; |
counter_wait_strobe_lcd_init <= counter_wait_strobe_lcd_init + period_clk_ns; |
if (counter_wait_strobe_lcd_init > 240) |
// We need to wait at least 40ns to stabilize the data before strobing the data... |
counter_wait_stabilize_lcd_init <= counter_wait_stabilize_lcd_init + period_clk_ns; |
if (counter_wait_stabilize_lcd_init >= 40) |
begin |
lcd_init_states <= lcd_init_state_next; |
lcd_init_e_out <= 0; |
end |
lcd_init_e_out <= 1; |
|
// After we got a strobe high hold for more 240 ns |
counter_wait_strobe_lcd_init <= counter_wait_strobe_lcd_init + period_clk_ns; |
if (counter_wait_strobe_lcd_init >= 240) |
begin |
lcd_init_states <= lcd_init_state_next; |
counter_wait_stabilize_lcd_init <= 0; |
counter_wait_strobe_lcd_init <= 0; |
lcd_init_e_out <= 0; |
end |
end |
end |
|
lcd_init_write_03_01: |
129,13 → 151,13
|
lcd_init_wait_40us: |
begin |
time_wait_lcd_init <= 100000; // Wait for 100us |
time_wait_lcd_init <= 40000; // Wait for 40us |
lcd_init_states <= lcd_init_wait; |
lcd_init_state_next <= lcd_init_write_02; |
end |
|
lcd_init_write_02: |
// Send 0x3 and pulse LCD_E for 240ns |
// Send 0x2 and pulse LCD_E for 240ns |
begin |
lcd_init_data_out <= 4'h2; |
lcd_init_states <= lcd_init_strobe; // Strobe for at least 230 ns |
144,18 → 166,26
|
lcd_init_wait_50us: |
begin |
time_wait_lcd_init <= 100000; // Wait for 100us |
time_wait_lcd_init <= 50000; // Wait for 50us |
lcd_init_states <= lcd_init_wait; |
lcd_init_state_next <= lcd_init_wait_50us; |
lcd_init_state_next <= lcd_init_state_done; |
end |
|
lcd_init_state_done: |
begin |
lcd_init_done <= 1; |
lcd_init_state_next <= lcd_init_state_done; |
end |
endcase; |
end; |
end; |
|
assign lcd_e = lcd_init_e_out; |
assign lcd_nibble = lcd_init_data_out; |
assign lcd_rw = 0; |
|
// Will assign the output of the FSM init or the FSM data depending if initialization is already done |
assign lcd_e = (!lcd_init_done) ? lcd_init_e_out : lcd_data_e_out; |
assign lcd_nibble = (!lcd_init_done) ? lcd_init_data_out : lcd_data_data_out ; |
|
/* |
FSM that deals to send data to the LCD (nibble High + nibble Low) |
*/ |
163,8 → 193,96
begin |
if (~lcd_init_done) |
begin |
|
lcd_data_e_out <= 0; |
lcd_data_data_out <= 0; |
lcd_data_states <= lcd_data_rst; |
done <= 0; |
counter_wait_stabilize_lcd_data <= 0; |
counter_wait_lcd_data <= 0; |
counter_wait_strobe_lcd_data <= 0; |
end |
else |
begin |
case (lcd_data_states) |
lcd_data_rst: |
begin |
done <= 0; |
// Start to send data when strobe_in =1 |
if (strobe_in == 1) |
begin |
lcd_data_states <= lcd_data_wr_nibble_high; |
end |
else |
lcd_data_states <= lcd_data_rst; |
end |
|
lcd_data_wr_nibble_high: |
begin |
// First send the high nibble |
lcd_data_data_out <= data_in[7:4]; |
lcd_data_states <= lcd_data_strobe; |
lcd_data_state_next <= lcd_data_wait_1us; |
end |
|
lcd_data_strobe: |
begin |
// We need to wait at least 40ns to stabilize the data before strobing the data... |
counter_wait_stabilize_lcd_data <= counter_wait_stabilize_lcd_data + period_clk_ns; |
if (counter_wait_stabilize_lcd_data >= 40) |
begin |
lcd_data_e_out <= 1; |
|
// After we got a strobe high hold for more 240 ns |
counter_wait_strobe_lcd_data <= counter_wait_strobe_lcd_data + period_clk_ns; |
if (counter_wait_strobe_lcd_data >= 240) |
begin |
lcd_data_states <= lcd_data_state_next; |
counter_wait_stabilize_lcd_data <= 0; |
counter_wait_strobe_lcd_data <= 0; |
lcd_data_e_out <= 0; |
end |
end |
end |
|
// Wait for 1us before sending the low nibble |
lcd_data_wait_1us: |
begin |
counter_wait_lcd_data <= counter_wait_lcd_data + period_clk_ns; |
if (counter_wait_lcd_data >= 1000) |
begin |
lcd_data_states <= lcd_data_wr_nibble_low; |
counter_wait_lcd_data <= 0; |
end |
end |
|
lcd_data_wr_nibble_low: |
begin |
// After send the low nibble |
lcd_data_data_out <= data_in[3:0]; |
lcd_data_states <= lcd_data_strobe; |
lcd_data_state_next <= lcd_data_wait_40us; |
end |
|
// Wait for 40us before sending the next byte |
lcd_data_wait_40us: |
begin |
counter_wait_lcd_data <= counter_wait_lcd_data + period_clk_ns; |
if (counter_wait_lcd_data >= 40000) |
begin |
lcd_data_states <= lcd_data_done; |
counter_wait_lcd_data <= 0; |
end |
end |
|
lcd_data_done: |
begin |
// Signal that we done sending the data |
done <= 1; |
lcd_data_states <= lcd_data_rst; |
end |
|
endcase |
end |
end; |
|
endmodule |
/trunk/hdl/iseProject/testLcd_controller.v
5,6 → 5,7
// Inputs |
reg rst; |
reg clk; |
reg rs_in; |
reg [7:0] data_in; |
reg strobe_in; |
reg [7:0] period_clk_ns; |
21,6 → 22,7
lcd_controller uut ( |
.rst(rst), |
.clk(clk), |
.rs_in(rs_in), |
.data_in(data_in), |
.strobe_in(strobe_in), |
.period_clk_ns(period_clk_ns), |
52,8 → 54,12
#20; |
rst = 0; |
|
// Add stimulus here |
|
// One advantege over of Verilog over VHDL (Access to internal signals...) |
// Like wait until... from Verilog |
@(posedge uut.lcd_init_done); |
data_in = 65; |
#20 strobe_in = 1; #20 strobe_in = 0; |
@(posedge done); |
end |
|
endmodule |
/trunk/hdl/iseProject/iseProject.gise
26,6 → 26,7
<file xil_pn:fileType="FILE_LOG" xil_pn:name="fuse.log"/> |
<file xil_pn:fileType="FILE_DIRECTORY" xil_pn:name="isim"/> |
<file xil_pn:branch="BehavioralSim" xil_pn:fileType="FILE_CMD" xil_pn:name="isim.cmd"/> |
<file xil_pn:branch="BehavioralSim" xil_pn:fileType="FILE_LOG" xil_pn:name="isim.log"/> |
<file xil_pn:fileType="FILE_CMD_LOG" xil_pn:name="lcd_controller.cmd_log"/> |
<file xil_pn:branch="Implementation" xil_pn:fileType="FILE_LSO" xil_pn:name="lcd_controller.lso"/> |
<file xil_pn:branch="Implementation" xil_pn:fileType="FILE_NGC" xil_pn:name="lcd_controller.ngc"/> |
35,6 → 36,7
<file xil_pn:branch="Implementation" xil_pn:fileType="FILE_XST_REPORT" xil_pn:name="lcd_controller.syr"/> |
<file xil_pn:branch="Implementation" xil_pn:fileType="FILE_XST" xil_pn:name="lcd_controller.xst"/> |
<file xil_pn:fileType="FILE_HTML" xil_pn:name="lcd_controller_envsettings.html"/> |
<file xil_pn:branch="BehavioralSim" xil_pn:fileType="FILE_ISIM_EXE" xil_pn:name="lcd_controller_isim_beh.exe"/> |
<file xil_pn:fileType="FILE_HTML" xil_pn:name="lcd_controller_summary.html"/> |
<file xil_pn:fileType="FILE_XRPT" xil_pn:name="lcd_controller_xst.xrpt"/> |
<file xil_pn:fileType="FILE_XST_PROJECT" xil_pn:name="testLcd_controller_beh.prj"/> |
50,18 → 52,22
<status xil_pn:value="SuccessfullyRun"/> |
<status xil_pn:value="ReadyToRun"/> |
</transform> |
<transform xil_pn:end_ts="1337576939" xil_pn:in_ck="-5497409596377948253" xil_pn:name="TRAN_copyAbstractToPostAbstractSimulation" xil_pn:start_ts="1337576939"> |
<transform xil_pn:end_ts="1337622824" xil_pn:in_ck="-5497409596377948253" xil_pn:name="TRAN_copyAbstractToPostAbstractSimulation" xil_pn:start_ts="1337622824"> |
<status xil_pn:value="SuccessfullyRun"/> |
<status xil_pn:value="ReadyToRun"/> |
<status xil_pn:value="OutOfDateForInputs"/> |
<status xil_pn:value="OutOfDateForOutputs"/> |
<status xil_pn:value="InputChanged"/> |
<status xil_pn:value="OutputChanged"/> |
<outfile xil_pn:name="lcd_controller.v"/> |
<outfile xil_pn:name="lcd_wishbone_slave.v"/> |
<outfile xil_pn:name="testLcd_controller.v"/> |
</transform> |
<transform xil_pn:end_ts="1337522725" xil_pn:name="TRAN_xawsToSimhdl" xil_pn:prop_ck="2836371237087295533" xil_pn:start_ts="1337522725"> |
<transform xil_pn:end_ts="1337620875" xil_pn:name="TRAN_xawsToSimhdl" xil_pn:prop_ck="2836371237087295533" xil_pn:start_ts="1337620875"> |
<status xil_pn:value="SuccessfullyRun"/> |
<status xil_pn:value="ReadyToRun"/> |
</transform> |
<transform xil_pn:end_ts="1337522725" xil_pn:name="TRAN_schematicsToHdlSim" xil_pn:prop_ck="-2387588251019774503" xil_pn:start_ts="1337522725"> |
<transform xil_pn:end_ts="1337620875" xil_pn:name="TRAN_schematicsToHdlSim" xil_pn:prop_ck="-2387588251019774503" xil_pn:start_ts="1337620875"> |
<status xil_pn:value="SuccessfullyRun"/> |
<status xil_pn:value="ReadyToRun"/> |
</transform> |
69,28 → 75,41
<status xil_pn:value="SuccessfullyRun"/> |
<status xil_pn:value="ReadyToRun"/> |
</transform> |
<transform xil_pn:end_ts="1337576939" xil_pn:in_ck="-5497409596377948253" xil_pn:name="TRAN_copyPostAbstractToPreSimulation" xil_pn:start_ts="1337576939"> |
<transform xil_pn:end_ts="1337622824" xil_pn:in_ck="-5497409596377948253" xil_pn:name="TRAN_copyPostAbstractToPreSimulation" xil_pn:start_ts="1337622824"> |
<status xil_pn:value="SuccessfullyRun"/> |
<status xil_pn:value="ReadyToRun"/> |
<status xil_pn:value="OutOfDateForInputs"/> |
<status xil_pn:value="OutOfDateForPredecessor"/> |
<status xil_pn:value="OutOfDateForOutputs"/> |
<status xil_pn:value="InputChanged"/> |
<status xil_pn:value="OutputChanged"/> |
<outfile xil_pn:name="lcd_controller.v"/> |
<outfile xil_pn:name="lcd_wishbone_slave.v"/> |
<outfile xil_pn:name="testLcd_controller.v"/> |
</transform> |
<transform xil_pn:end_ts="1337576940" xil_pn:in_ck="-5497409596377948253" xil_pn:name="TRAN_ISimulateBehavioralModelRunFuse" xil_pn:prop_ck="-1659802317889134806" xil_pn:start_ts="1337576939"> |
<transform xil_pn:end_ts="1337622825" xil_pn:in_ck="-5497409596377948253" xil_pn:name="TRAN_ISimulateBehavioralModelRunFuse" xil_pn:prop_ck="-1659802317889134806" xil_pn:start_ts="1337622824"> |
<status xil_pn:value="SuccessfullyRun"/> |
<status xil_pn:value="ReadyToRun"/> |
<status xil_pn:value="OutOfDateForInputs"/> |
<status xil_pn:value="OutOfDateForPredecessor"/> |
<status xil_pn:value="OutOfDateForOutputs"/> |
<status xil_pn:value="InputChanged"/> |
<status xil_pn:value="OutputChanged"/> |
<outfile xil_pn:name="fuse.log"/> |
<outfile xil_pn:name="isim"/> |
<outfile xil_pn:name="isim.log"/> |
<outfile xil_pn:name="testLcd_controller_beh.prj"/> |
<outfile xil_pn:name="testLcd_controller_isim_beh.exe"/> |
<outfile xil_pn:name="xilinxsim.ini"/> |
</transform> |
<transform xil_pn:end_ts="1337576941" xil_pn:in_ck="2483329315479921445" xil_pn:name="TRAN_ISimulateBehavioralModel" xil_pn:prop_ck="2007445876491768972" xil_pn:start_ts="1337576940"> |
<transform xil_pn:end_ts="1337622826" xil_pn:in_ck="8162874102102850794" xil_pn:name="TRAN_ISimulateBehavioralModel" xil_pn:prop_ck="2007445876491768972" xil_pn:start_ts="1337622825"> |
<status xil_pn:value="SuccessfullyRun"/> |
<status xil_pn:value="ReadyToRun"/> |
<status xil_pn:value="OutOfDateForPredecessor"/> |
<status xil_pn:value="OutOfDateForOutputs"/> |
<status xil_pn:value="OutputChanged"/> |
<outfile xil_pn:name="isim.cmd"/> |
<outfile xil_pn:name="isim.log"/> |
<outfile xil_pn:name="testLcd_controller_isim_beh.wdb"/> |
</transform> |
<transform xil_pn:end_ts="1337471657" xil_pn:name="TRAN_copyInitialToXSTAbstractSynthesis" xil_pn:start_ts="1337471656"> |
121,12 → 140,10
<status xil_pn:value="SuccessfullyRun"/> |
<status xil_pn:value="ReadyToRun"/> |
</transform> |
<transform xil_pn:end_ts="1337475492" xil_pn:in_ck="-3373480295076389399" xil_pn:name="TRANEXT_xstsynthesize_virtex6" xil_pn:prop_ck="5624389301805847959" xil_pn:start_ts="1337475474"> |
<transform xil_pn:end_ts="1337646427" xil_pn:in_ck="-3373480295076389399" xil_pn:name="TRANEXT_xstsynthesize_virtex6" xil_pn:prop_ck="5624389301805847959" xil_pn:start_ts="1337646409"> |
<status xil_pn:value="SuccessfullyRun"/> |
<status xil_pn:value="WarningsGenerated"/> |
<status xil_pn:value="ReadyToRun"/> |
<status xil_pn:value="OutOfDateForInputs"/> |
<status xil_pn:value="InputChanged"/> |
<outfile xil_pn:name="_xmsgs/xst.xmsgs"/> |
<outfile xil_pn:name="lcd_controller.lso"/> |
<outfile xil_pn:name="lcd_controller.ngc"/> |