| ??? 09/30/07 04:55 Read: times |
#145132 - OP Update 7 of ? Responding to: ???'s previous message |
Here's the "half UART" module for the Morse code decoder. I didn't show the testbench this time; it's very similar to the one for the mark/space timer in the previous update.
-- Russ
/* ////////////////////////////////////////////////////////////////////////////
uat.v
///////////////////////////////////////////////////////////////////////////////
DESCRIPTION: This is the UAT (UART without the R) part of the Morse code
decoder. It's a bare bones thing that does just barely enough
to get characters sent via an RS-232 port.
Its three inputs are a baud clock, an 8-bit data port, and a
strobe. Client modules put the characters they want to send
one at a time on the data port and then pulse the strobe line.
As soon as the strobe is released, the module generates a
10-bit, N-8-1 style frame on its RS-232 output line. The
module also maintains a second output line that is high
whenever it's busy generating a frame and not really interested
in receiving another character.
REVISIONS: 29 Sep 07 - RAC - Genesis
//////////////////////////////////////////////////////////////////////////// */
module UAT (baudClock, dataIn, strobe, rs232out, txBusy);
input baudClock; // Baud clock
input [7 : 0] dataIn; // Client puts input bytes here
input strobe; // Client pulses this line to
// indicate new byte available
output rs232out; // RS-232 output
output txBusy; // High when transmitter busy
reg rs232out; // See above
reg txBusy; // See above
reg [9 : 0] txShifter; // Internal Tx shift register
reg [3 : 0] bitCounter; // Count ten bits here
always @(posedge strobe,
posedge baudClock) begin
if (strobe) begin // Receive new byte from client
txShifter[0] <= 0; // Set up the start bit
txShifter[8 : 1] <= dataIn; // Set up the data
txShifter[9] <= 1; // Set up the stop bit
bitCounter <= 9; // Nine bits are ready to send
txBusy <= 1; // We're busy now
end // End 'receive new byte'
else begin // Time for a new bit
if (bitCounter) begin // Need to send more bits
txShifter[8 : 0] <= // Shift remaining bits one
txShifter[9 : 1]; // position to the right
txShifter[9] <= 0; // Bit 9 needs to be something
bitCounter <= bitCounter - 1; // Count the bit just sent
end // End 'need to send more bits'
rs232out <= txShifter[0]; // Put next bit on output line
txBusy <= (bitCounter != 0);
end // End 'time for a new bit'
end
endmodule // End 'module UAT'
|



