OpenCores
URL https://opencores.org/ocsvn/lpc/lpc/trunk

Subversion Repositories lpc

Compare Revisions

  • This comparison shows the changes necessary to convert path
    /
    from Rev 3 to Rev 4
    Reverse comparison

Rev 3 → Rev 4

/trunk/gpio/rtl/lpc_gpio.v
0,0 → 1,189
/////////////////////////////////////////////////////////////////////
//// ////
//// LPC(Low Pin Count) GPIO(General Purpose Input Output) ////
//// ////
//// ////
//// Author: Junbing Liang ////
//// Junbing.Liang@googlemail.com ////
//// ////
//// ////
//// Downloaded from: http://www.opencores.org/ ////
//// ////
/////////////////////////////////////////////////////////////////////
//// ////
//// Copyright (C) 2007 Junbing Liang ////
//// ////
//// ////
//// This source file may be used and distributed without ////
//// restriction provided that this copyright statement is not ////
//// removed from the file and that any derivative work contains ////
//// the original copyright notice and the associated disclaimer.////
//// ////
//// THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY ////
//// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED ////
//// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS ////
//// FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL THE AUTHOR ////
//// OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, ////
//// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES ////
//// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE ////
//// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR ////
//// BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF ////
//// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ////
//// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT ////
//// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE ////
//// POSSIBILITY OF SUCH DAMAGE. ////
//// ////
/////////////////////////////////////////////////////////////////////
 
 
module lpc_gpio(LAD,LFRAME,LRESET,LCLK, gpio_addr_i,gpio_i,gpio_o);
 
output [7:0] gpio_o;
input [7:0] gpio_i;
input [15:0] gpio_addr_i;
 
//bus interface
inout [3:0] LAD;
input LFRAME; //low active
input LRESET; //low activate
input LCLK; //
 
 
reg [7:0] gpio_out_reg; //output register
reg [7:0] gpio_out_reg1; //use second reg to control the output time
reg [7:0] gpio_in_reg; //input register
reg [3:0] lpc_state;
reg [3:0] lpc_state_next;
reg [15:0] gpio_addr_reg; //address register
 
reg write_flag;
 
 
 
//lpc_state_next
always @(LFRAME or lpc_state or LAD)
begin
if (!LFRAME)
if (LAD == 4'b0000)
lpc_state_next <= 1;
else
lpc_state_next <= 0;
else
begin
//if address is not match, state will be set to 0
if ( ((lpc_state == 2) && (LAD != gpio_addr_i[15:12]) )
|| ((lpc_state == 3) && (LAD != gpio_addr_i[11:8]) )
|| ((lpc_state == 4) && (LAD != gpio_addr_i[7:4]) )
|| ((lpc_state == 5) && (LAD != gpio_addr_i[3:0]) )
|| (lpc_state ==4'hc) //last state
|| (lpc_state ==4'b0000)
)
lpc_state_next <= 0;
else
lpc_state_next <= lpc_state+4'b0001;
end
end
 
//lpc_state
always @(posedge LCLK)
begin
if (!LRESET)
lpc_state <= 0;
else
lpc_state <= lpc_state_next;
end
 
//write_flag
always @(negedge LCLK)
begin
if ( (!LRESET)||(!LFRAME)|| (lpc_state==0) )
write_flag <= 0; //default is read
else
begin
if (lpc_state ==1)
begin
if (LAD==4'b0010)
write_flag <=1;
else
write_flag <=0; //read for all others
end
else
write_flag <= write_flag;
end
end
 
//gpio_addr_reg
always @(negedge LCLK)
begin
if ( (!LRESET)||(!LFRAME) )
gpio_addr_reg <= 0;
else
begin
case (lpc_state)
2: gpio_addr_reg[15:12] <= LAD;
3: gpio_addr_reg[11:8] <= LAD;
4: gpio_addr_reg[7:4] <= LAD;
5: gpio_addr_reg[3:0] <= LAD;
default:
gpio_addr_reg <= gpio_addr_reg;
endcase;
end
end
 
//gpio_out_reg
always @(negedge LCLK)
begin
if (!LRESET)
gpio_out_reg <= 0;
else
begin
if ((write_flag) && (gpio_addr_reg == gpio_addr_i))
case (lpc_state)
6:gpio_out_reg[7:4] <= LAD;
7:gpio_out_reg[3:0] <= LAD;
default:
gpio_out_reg <= gpio_out_reg;
endcase
else
gpio_out_reg <= gpio_out_reg;
end
end
 
 
 
//gpio_out_reg1
//use second output register to control the output time
always @ (posedge LCLK)
begin
if (!LRESET)
gpio_out_reg1 <= 0;
else
if (lpc_state == 4'hc)
gpio_out_reg1 <= gpio_out_reg;
else
gpio_out_reg1 <= gpio_out_reg1;
end
 
 
 
assign gpio_o = LRESET?gpio_out_reg1:8'hzz;
assign LAD[3:0] = //bus read data from gpio input
(!write_flag && lpc_state==8) ? 4'b1111 : //sync
(!write_flag && lpc_state==9) ? gpio_i[7:4] :
(!write_flag && lpc_state==10) ? gpio_i[3:0] :
(!write_flag && lpc_state==11) ? 4'b1111: //first TAR
//bus write to gpio output
(write_flag && lpc_state==10) ? 4'b0000: //sync
(write_flag && lpc_state==11) ? 4'b1111: //first TAR
4'bzzzz;
 
 
 
 
endmodule
/trunk/gpio/rtl/lpc_gpio_top.v
0,0 → 1,183
/////////////////////////////////////////////////////////////////////
//// ////
//// LPC(Low Pin Count) GPIO(General Purpose Input Output) ////
//// ////
//// ////
//// Author: Junbing Liang ////
//// Junbing.Liang@googlemail.com ////
//// ////
//// ////
//// Downloaded from: http://www.opencores.org/ ////
//// ////
/////////////////////////////////////////////////////////////////////
//// ////
//// Copyright (C) 2007 Junbing Liang ////
//// ////
//// ////
//// This source file may be used and distributed without ////
//// restriction provided that this copyright statement is not ////
//// removed from the file and that any derivative work contains ////
//// the original copyright notice and the associated disclaimer.////
//// ////
//// THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY ////
//// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED ////
//// TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS ////
//// FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL THE AUTHOR ////
//// OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, ////
//// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES ////
//// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE ////
//// GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR ////
//// BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF ////
//// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ////
//// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT ////
//// OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE ////
//// POSSIBILITY OF SUCH DAMAGE. ////
//// ////
/////////////////////////////////////////////////////////////////////
 
module lpc_gpio_top;
 
 
reg [3:0] LAD;
reg LFRAME;
reg LRESET;
reg LCLK;
 
wire [7:0] gpio_out;
 
wire [3:0] LAD_w;
 
 
//LCLK
initial
begin
LCLK=1;
end
 
//LRESET
initial
begin
 
//write date to gpio
LRESET = 0;
#50 LRESET = 1;
#10 LFRAME = 0;
LAD = 4'b0000; //1-start
#10 LFRAME = 1;
LAD = 4'b0010; //2- CT-DIR, 0010- IO WRITE
#10 LFRAME = 1;
LAD = 4'b0000; //3- address A15-A12
#10 LFRAME = 1;
LAD = 4'b0100; //4- A11-A8
#10 LFRAME = 1;
LAD = 4'b0010; //5- A7-A4
#10 LFRAME = 1;
LAD = 4'b0001; //6- A3-A0
#10 LFRAME = 1;
LAD = 4'b0101; //7- D3-D0
#10 LFRAME = 1;
LAD = 4'b1010; //8- D7-D4
#10 LFRAME = 1;
LAD = 4'b1111; //9- TAR
#10 LFRAME = 1;
LAD = 4'bzzzz; //10- TAR
#10 LFRAME = 1;
LAD = 4'bzzzz; //11- SYNC
#10 LFRAME = 1;
LAD = 4'bzzzz; //12- TAR
#10 LFRAME = 1;
LAD = 4'bzzzz; //13- TAR
#50 LFRAME = 1;
LAD = 4'bzzzz; //13- TAR
#20 LFRAME = 0;
LAD = 4'b0000; //start
#10 LFRAME = 1;
LAD = 4'b0010; //CT-DIR, 0010- IO WRITE
#10 LFRAME = 1;
LAD = 4'b0000; //address A15-A12
#10 LFRAME = 1;
LAD = 4'b0100; //A11-A8
#10 LFRAME = 1;
LAD = 4'b0010; //A7-A4
#10 LFRAME = 1;
LAD = 4'b0101; //A3-A0
#10 LFRAME = 1;
LAD = 4'b1011; //D3-D0
#10 LFRAME = 1;
LAD = 4'b0010; //D7-D4
#10 LFRAME = 1;
LAD = 4'b1111; //TAR
#10 LFRAME = 1;
LAD = 4'bzzzz; //TAR
#50 LFRAME = 1;
LAD = 4'bzzzz; //SYNC
 
//read data from LPC GPIO
LRESET = 0;
#50 LRESET = 1;
#10 LFRAME = 0;
LAD = 4'b0000; //1-start
#10 LFRAME = 1;
LAD = 4'b0000; //2- CT-DIR, 0000- IO READ
#10 LFRAME = 1;
LAD = 4'b0000; //3- address A15-A12
#10 LFRAME = 1;
LAD = 4'b0100; //4- A11-A8
#10 LFRAME = 1;
LAD = 4'b0010; //5- A7-A4
#10 LFRAME = 1;
LAD = 4'b0001; //6- A3-A0
#10 LFRAME = 1;
LAD = 4'b1111; //7- TAR
#10 LFRAME = 1;
LAD = 4'bzzzz; //8- TAR
#10 LFRAME = 1;
LAD = 4'bzzzz; //9- SYNC
#10 LFRAME = 1;
LAD = 4'bzzzz; //10 D3-D0
#10 LFRAME = 1;
LAD = 4'bzzzz; //11 D7-D4
#10 LFRAME = 1;
LAD = 4'bzzzz; //12- TAR
#100 LFRAME = 1;
LAD = 4'bzzzz; //13- TAR
 
end
 
//LFRAME, LAD
initial
begin
LFRAME = 0;
LAD = 0;
end
 
//LCLK
always
begin
#5 LCLK = !LCLK;
end
 
//hookup the gpip module
lpc_gpio gpio1(
.LAD(LAD_w),
.LFRAME(LFRAME),
.LRESET(LRESET),
.LCLK(LCLK),
.gpio_addr_i(16'h0421),
.gpio_i(8'ha5),
.gpio_o(gpio_out)
);
assign LAD_w = LAD;
 
 
 
 
endmodule

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.