Line 65... |
Line 65... |
reg overrun;
|
reg overrun;
|
reg [9:0] cnt; // sample bit rate counter / timeout counter
|
reg [9:0] cnt; // sample bit rate counter / timeout counter
|
reg [10:0] rx_data; // working receive data register
|
reg [10:0] rx_data; // working receive data register
|
reg [9:0] t2; // data minus stop bit(s)
|
reg [9:0] t2; // data minus stop bit(s)
|
reg [7:0] t3,t4; // data minus parity bit and start bit
|
reg [7:0] t3,t4; // data minus parity bit and start bit
|
|
reg [7:0] t5;
|
reg p1;
|
reg p1;
|
reg gerr; // global error status
|
reg gerr; // global error status
|
reg perr; // parity error
|
reg perr; // parity error
|
reg ferr = 1'b0; // framing error
|
reg ferr = 1'b0; // framing error
|
wire bz; // break detected
|
wire bz; // break detected
|
reg state; // state machine
|
reg state; // state machine
|
reg wf; // fifo write
|
reg wf; // fifo write
|
wire empty;
|
wire empty;
|
reg didRd;
|
reg didRd;
|
|
wire [7:0] dout1;
|
|
reg full1;
|
|
wire fifoFull, fifoEmpty;
|
|
|
assign ack = cyc & cs;
|
assign ack = cyc & cs;
|
wire pe_rd;
|
wire pe_rd;
|
edge_det ued1 (.rst(rst), .clk(clk), .ce(1'b1), .i(ack & ~wr), .pe(pe_rd), .ne(), .ee());
|
edge_det ued1 (.rst(rst), .clk(clk), .ce(1'b1), .i(ack & ~wr), .pe(pe_rd), .ne(), .ee());
|
|
|
Line 90... |
Line 94... |
.clk(clk),
|
.clk(clk),
|
.rst(rst|clear|fifoClear),
|
.rst(rst|clear|fifoClear),
|
.wr(wf),
|
.wr(wf),
|
.rd(rdf),
|
.rd(rdf),
|
.din({bz,perr,ferr,t4}),
|
.din({bz,perr,ferr,t4}),
|
.dout({break_o,parityErr,frameErr,dout}),
|
.dout({break_o,parityErr,frameErr,dout1}),
|
.ctr(qcnt),
|
.ctr(qcnt),
|
.full(full),
|
.full(fifoFull),
|
.empty(empty)
|
.empty(fifoEmpty)
|
);
|
);
|
|
|
|
assign dout = fifoEnable ? dout1 : t5;
|
|
assign empty = fifoEnable ? fifoEmpty : ~full1;
|
|
assign full = fifoEnable ? fifoFull : full1;
|
|
|
// compute 1/2 the length of the last bit
|
// compute 1/2 the length of the last bit
|
// needed for framing error detection
|
// needed for framing error detection
|
reg [7:0] halfLastBit;
|
reg [7:0] halfLastBit;
|
always @(stop_bits)
|
always @(stop_bits)
|
if (stop_bits==3'd3) // 1.5 stop bits ?
|
if (stop_bits==3'd3) // 1.5 stop bits ?
|
Line 126... |
Line 134... |
else
|
else
|
t2 <= {rx_data[8:0],1'b0};
|
t2 <= {rx_data[8:0],1'b0};
|
|
|
// grab the parity bit
|
// grab the parity bit
|
always @(t2)
|
always @(t2)
|
p1 <= t2[33];
|
p1 <= t2[9];
|
|
|
// strip off parity and start bit
|
// strip off parity and start bit
|
always @(parityCtrl or t2)
|
always @(parityCtrl or t2)
|
if (parityCtrl[0])
|
if (parityCtrl[0])
|
t3 <= t2[8:1];
|
t3 <= t2[8:1];
|
Line 255... |
Line 263... |
end
|
end
|
end
|
end
|
|
|
always @(posedge clk)
|
always @(posedge clk)
|
if (rst)
|
if (rst)
|
|
t5 <= 1'b0;
|
|
else begin
|
|
if (wf)
|
|
t5 <= t4;
|
|
end
|
|
|
|
always @(posedge clk)
|
|
if (rst)
|
|
full1 <= 1'b0;
|
|
else begin
|
|
if (wf)
|
|
full1 <= 1'b1;
|
|
else if (pe_rd)
|
|
full1 <= 1'b0;
|
|
end
|
|
|
|
always @(posedge clk)
|
|
if (rst)
|
didRd <= 1'b0;
|
didRd <= 1'b0;
|
else begin
|
else begin
|
// set a read flag for later reference
|
// set a read flag for later reference
|
if (pe_rd)
|
if (pe_rd)
|
didRd <= 1'b1;
|
didRd <= 1'b1;
|