Line 60... |
Line 60... |
//////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////
|
//
|
//
|
// CVS Revision History
|
// CVS Revision History
|
//
|
//
|
// $Log: not supported by cvs2svn $
|
// $Log: not supported by cvs2svn $
|
|
// Revision 1.26 2001/12/03 21:44:29 gorban
|
|
// Updated specification documentation.
|
|
// Added full 32-bit data bus interface, now as default.
|
|
// Address is 5-bit wide in 32-bit data bus mode.
|
|
// Added wb_sel_i input to the core. It's used in the 32-bit mode.
|
|
// Added debug interface with two 32-bit read-only registers in 32-bit mode.
|
|
// Bits 5 and 6 of LSR are now only cleared on TX FIFO write.
|
|
// My small test bench is modified to work with 32-bit mode.
|
|
//
|
// Revision 1.25 2001/11/28 19:36:39 gorban
|
// Revision 1.25 2001/11/28 19:36:39 gorban
|
// Fixed: timeout and break didn't pay attention to current data format when counting time
|
// Fixed: timeout and break didn't pay attention to current data format when counting time
|
//
|
//
|
// Revision 1.24 2001/11/26 21:38:54 gorban
|
// Revision 1.24 2001/11/26 21:38:54 gorban
|
// Lots of fixes:
|
// Lots of fixes:
|
Line 286... |
Line 295... |
// Transmitter Instance
|
// Transmitter Instance
|
uart_transmitter transmitter(clk, wb_rst_i, lcr, tf_push, wb_dat_i, enable, stx_pad_o, tstate, tf_count, tx_reset, lsr_mask);
|
uart_transmitter transmitter(clk, wb_rst_i, lcr, tf_push, wb_dat_i, enable, stx_pad_o, tstate, tf_count, tx_reset, lsr_mask);
|
|
|
// Receiver Instance
|
// Receiver Instance
|
uart_receiver receiver(clk, wb_rst_i, lcr, rf_pop, srx_pad_i, enable, rda_int,
|
uart_receiver receiver(clk, wb_rst_i, lcr, rf_pop, srx_pad_i, enable, rda_int,
|
counter_t, rf_count, rf_data_out, rf_error_bit, rf_overrun, rx_reset, lsr_mask, rstate);
|
counter_t, rf_count, rf_data_out, rf_error_bit, rf_overrun, rx_reset, lsr_mask, rstate, rf_push);
|
|
|
|
|
// Asynchronous reading here because the outputs are sampled in uart_wb.v file
|
// Asynchronous reading here because the outputs are sampled in uart_wb.v file
|
always @(/*AUTOSENSE*/dl or dlab or ier or iir
|
always @(/*AUTOSENSE*/dl or dlab or ier or iir
|
or lcr or lsr or msr or rf_data_out or wb_addr_i or wb_re_i) // asynchrounous reading
|
or lcr or lsr or msr or rf_data_out or wb_addr_i or wb_re_i) // asynchrounous reading
|
Line 362... |
Line 371... |
else
|
else
|
if (msr_read)
|
if (msr_read)
|
msi_reset <= #1 1; // reset bits in Modem Status Register
|
msi_reset <= #1 1; // reset bits in Modem Status Register
|
end
|
end
|
|
|
/*
|
|
// threi_clear signal handling
|
|
always @(posedge clk or posedge wb_rst_i)
|
|
begin
|
|
if (wb_rst_i)
|
|
threi_clear <= #1 0;
|
|
else
|
|
if (!lsr[`UART_LS_TFE] && (tf_count==0)) // reset clear flag when tx fifo clears
|
|
threi_clear <= #1 0;
|
|
else
|
|
if (wb_re_i && wb_addr_i == `UART_REG_II)
|
|
threi_clear <= #1 1;
|
|
end
|
|
*/
|
|
|
|
//
|
//
|
// WRITES AND RESETS //
|
// WRITES AND RESETS //
|
//
|
//
|
// Line Control Register
|
// Line Control Register
|
Line 484... |
Line 479... |
end
|
end
|
|
|
// Line Status Register
|
// Line Status Register
|
|
|
// activation conditions
|
// activation conditions
|
assign lsr0 = (rf_count==0 && fifo_write); // data in receiver fifo available set condition
|
assign lsr0 = (rf_count==0 && rf_push); // data in receiver fifo available set condition
|
assign lsr1 = rf_overrun; // Receiver overrun error
|
assign lsr1 = rf_overrun; // Receiver overrun error
|
assign lsr2 = rf_data_out[1]; // parity error bit
|
assign lsr2 = rf_data_out[1]; // parity error bit
|
assign lsr3 = rf_data_out[0]; // framing error bit
|
assign lsr3 = rf_data_out[0]; // framing error bit
|
assign lsr4 = rf_data_out[2]; // break error in the character
|
assign lsr4 = rf_data_out[2]; // break error in the character
|
assign lsr5 = (tf_count==5'b0); // transmitter fifo is empty
|
assign lsr5 = (tf_count==5'b0); // transmitter fifo is empty
|
Line 551... |
Line 546... |
if (wb_rst_i) lsr4r <= #1 0;
|
if (wb_rst_i) lsr4r <= #1 0;
|
else lsr4r <= #1 lsr_mask ? 0 : lsr4r || (lsr4 && ~lsr4_d);
|
else lsr4r <= #1 lsr_mask ? 0 : lsr4r || (lsr4 && ~lsr4_d);
|
|
|
// lsr bit 5 (transmitter fifo is empty)
|
// lsr bit 5 (transmitter fifo is empty)
|
reg lsr5_d;
|
reg lsr5_d;
|
wire tx_fifo_write;
|
|
assign tx_fifo_write = (wb_we_i && ~dlab && wb_addr_i==`UART_REG_TR);
|
|
|
|
always @(posedge clk or posedge wb_rst_i)
|
always @(posedge clk or posedge wb_rst_i)
|
if (wb_rst_i) lsr5_d <= #1 1;
|
if (wb_rst_i) lsr5_d <= #1 1;
|
else lsr5_d <= #1 lsr5;
|
else lsr5_d <= #1 lsr5;
|
|
|
always @(posedge clk or posedge wb_rst_i)
|
always @(posedge clk or posedge wb_rst_i)
|
if (wb_rst_i) lsr5r <= #1 1;
|
if (wb_rst_i) lsr5r <= #1 1;
|
else lsr5r <= #1 (tx_fifo_write) ? 0 : lsr5r || (lsr5 && ~lsr5_d);
|
else lsr5r <= #1 (fifo_write) ? 0 : lsr5r || (lsr5 && ~lsr5_d);
|
|
|
// lsr bit 6 (transmitter empty indicator)
|
// lsr bit 6 (transmitter empty indicator)
|
reg lsr6_d;
|
reg lsr6_d;
|
|
|
always @(posedge clk or posedge wb_rst_i)
|
always @(posedge clk or posedge wb_rst_i)
|
if (wb_rst_i) lsr6_d <= #1 1;
|
if (wb_rst_i) lsr6_d <= #1 1;
|
else lsr6_d <= #1 lsr6;
|
else lsr6_d <= #1 lsr6;
|
|
|
always @(posedge clk or posedge wb_rst_i)
|
always @(posedge clk or posedge wb_rst_i)
|
if (wb_rst_i) lsr6r <= #1 1;
|
if (wb_rst_i) lsr6r <= #1 1;
|
else lsr6r <= #1 (tx_fifo_write) ? 0 : lsr6r || (lsr6 && ~lsr6_d);
|
else lsr6r <= #1 (fifo_write) ? 0 : lsr6r || (lsr6 && ~lsr6_d);
|
|
|
// lsr bit 7 (error in fifo)
|
// lsr bit 7 (error in fifo)
|
reg lsr7_d;
|
reg lsr7_d;
|
|
|
always @(posedge clk or posedge wb_rst_i)
|
always @(posedge clk or posedge wb_rst_i)
|