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
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
|