You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

113 lines
3.1 KiB

module top (input CLK, output LED1, LED2, LED3, LED4, LED5,
input SCL, inout SDA, output ACK,
input COM_RX, output COM_TX, COM_DCD, COM_DSR, COM_RTS);
reg [7:0] I2C_TX; // TRANSMITTED TO MASTER
initial begin
I2C_TX = 22;
end
wire [7:0] I2C_RX; // RECEIVED FROM MASTER
wire [7:0] RAM_RD;
wire I2C_TRANS, I2C_READ, I2C_ACK, I2C_ACK_MSTR_CTRL, I2C_WR;
wire [9:0] I2C_COUNTER;
i2c_slave I2C (CLK, SCL, SDA, I2C_TRANS, I2C_READ, I2C_ACK, I2C_WR, //I2C_ACK_MSTR_CTRL,
I2C_RX, I2C_TX, I2C_COUNTER);
reg UART_WR, UART_DTR, UART_RTS, UART_DCD;
reg [7:0] UART_TX_DATA;
wire UART_ACTIVE, UART_TX_LINE;
reg [23:0] uart_counter;
initial begin
UART_WR = 0;
UART_TX = 1;
UART_RTS = 1;
UART_DTR = 0;
UART_DCD = 0;
end
uart UART (CLK, UART_WR, UART_TX_DATA, UART_ACTIVE, UART_TX_LINE);
reg wr_old;
reg [7:0] ram_adress;
reg RAM_W;
initial begin
ram_adress = 0;
RAM_W = 0;
end
ram RAM (CLK, RAM_W, ram_adress, I2C_RX, RAM_RD);
always @ (posedge CLK) begin
if ((wr_old == 0) && (I2C_WR == 1) && I2C_READ) begin
//I2C_TX = I2C_TX + 5;
// READ
I2C_TX = RAM_RD; // READ FROM CURRENT ADRESS
//ram_adress <= ram_adress + 1; // AND INCREMENT ADRESS (ASSIGNED IN THE NEXT TACT)
UART_WR = 1;
UART_TX_DATA = I2C_TX;
end
else if ((wr_old == 0) && (I2C_WR == 1) && (I2C_READ == 0)) begin
// RAM MODULE WRITES TO RAM IN THE CURRENT ADRESS
if (I2C_COUNTER == 2)
ram_adress = I2C_RX;
else begin
RAM_W = 1;
//ram_adress <= ram_adress + 1; // ONLY INCREMENT ADRESS IN THE NEXT TACT
end
UART_WR = 1;
UART_TX_DATA = I2C_RX;
end
else if ((wr_old == 1) && (I2C_WR == 0)) begin
RAM_W = 0;
UART_WR = 0;
if ((I2C_COUNTER != 2) || (I2C_READ == 1))
ram_adress <= ram_adress + 1; // ONLY INCREMENT ADRESS IN THE NEXT TACT
end
wr_old = I2C_WR;
/*
uart_counter = uart_counter + 1;
if (uart_counter == 12000000) begin
uart_counter = 0;
UART_TX_DATA = UART_TX_DATA + 1;
UART_WR = 1;
UART_RTS = UART_RTS ^ 1;
if (UART_RTS)
UART_DTR = UART_DTR ^ 1;
if (UART_DTR == 1)
UART_DCD = UART_DCD ^ 1;
end
else if (uart_counter == 5)
UART_WR = 0;*/
end
assign I2C_W = I2C_WR & (I2C_READ ^ 1);
assign LED5 = I2C_TRANS;
//assign LED5 = COM_RX;
assign LED1 = ram_adress[0];//I2C_RX[0];
assign LED2 = ram_adress[1];
assign LED3 = ram_adress[2];
assign LED4 = ram_adress[3];
assign ACK = I2C_READ;//I2C_WR; //I2C_ACK;
assign COM_TX = UART_TX_LINE;//COM_RX;
//assign COM_RTS = I2C_READ;
assign COM_RTS = I2C_READ;//UART_RTS;
assign COM_DSR = I2C_TRANS | UART_ACTIVE;//UART_DTR;
//assign COM_DCD = UART_DCD;
/* reg [24:0] counter;
always @ (posedge CLK) begin
counter = counter + 1;
end
assign LED1 = ~counter[24] & ~counter[23];
assign LED2 = ~counter[24] & counter[23];
assign LED3 = counter[24] & ~counter[23];
assign LED4 = counter[24] & counter[23];
assign LED5 = counter[23];*/
endmodule //top