Because asynchronous serial ports are very common in industrial control, communication, and software debugging, they are also vital in FPGA development.
- the basic principles of asynchronous serial port communication, handshake mechanism, data frame
- Master asynchronous sampling techniques
- Review the frame structure of the data packet
- Learning FIFO
- Joint debugging with common debugging software of PC (SSCOM, teraterm, etc.)
- Design and transmit full-duplex asynchronous communication interface Tx, Rx
- Baud rate of 11520 bps, 8-bit data, 1 start bit, 1 or 2 stop bits
- Receive buffer (Rx FIFO), transmit buffer (Tx FIFO)
- Forming a data packet
- Packet parsing
A USB-B interface and a CP2102 chip are onboard for serial data communication.
The CP2102 features a high level of integration with a USB 2.0 full-speed function controller, USB transceiver, oscillator, EEPROM, and asynchronous serial data bus (UART) to support modem full-featured signals without the need for any external USB devices. See Figure 10.1 for the pyhsical picture.
Figure 10.1 USB-B Interface and CP2102 Chip Physical Picture
Figure 10.2 Schematics of the serial port
The principle of USB serial port conversion is shown in Figure 10.2. The TTL_TX and TTL_RX of the CP2102 are connected to the FPGA to transmit and receive data. After being processed internally by the chip, the D_R_P and D_R_N are connected to the USB interface through a protection chip, and the data is transmitted with the PC to implement serial communication.
The first step: the main program architecture
input [1:0] baud_sel,
input [7:0] tx_data,
output [7:0] rx_byte,
There are a lot of handshake signals here, with the tx prefix for the transmit part of the signal, and the rx prefix is for the receive part of the signal.
Step 2: create a new baud rate generator file
- Input clock 7.3728MHz (64 times 115200). The actual value is 7.377049MHz, which is because the coefficient of the PLL is an integer division, while the error caused by that is not large, and can be adjusted by the stop bit in asynchronous communication. See Figure 10.3.
- Implemented with a two-stage PLL for a finer frequency
- The stop bit is set to be 2 bits, which can effectively eliminate the error.
This experiment will not deal with the precision. The default input frequency is 7.3728 MHz.
Figure 10.3 PLL setting
- Supported baud rates are 115200，57600，38400，19200
- The default baud rate is 115200
- Source file of designing baud rate
|// Send baud rate, clock frequency division selection
wire [8:0] frq_div_tx;
assign frq_div_tx = (baud_sel == 2’b00) ? 9’d63:
(baud_sel == 2’b01) ? 9’d127:
(baud_sel == 2’b10) ? 9’d255:9’d511;
reg [8:0] count_tx=9’d0;
always @ (posedge inclk)
if (rst) begin
count_tx <= 9’d0;
baud_tx <= 1’b0;
if (count_tx == frq_div_tx) begin
count_tx <= 9’d0;
baud_tx <= 1’b1;
count_tx <= count_tx + 1’b1;
baud_tx <= 1’b0;
Four different gear positions are set to select the baud rate, corresponding to the step 2, (1). The baud rate of the receiving part is similar to that of the transmitting part.
Step 3: Design the send buffer file tx_buf
- 8-bit FIFO, depth is 256, read/write clock separation, write full flag, read empty flag
- Interface and handshake
- rst reset signal
- wr_clk write clock
- tx_clk send clock
- 8-bit write data tx_data
- wr_en write enable
- ctrl writes whether the input is a data or a control word
- rdy buffer ready, can accept the next data frame
Transmit buffer instantiation file
- Serial transmission, interface and handshake file design
- Interface design
- tx_rdy, send vacancy, can accept new 8-bit data
- tx_en, send data enable, pass to the sending module 8-bit data enable signal
- tx_data, 8-bit data to be sent
- tx_clk, send clock
- tx_baud, send baud rate
- Write a testbench file to simulate the transmit module. (tb_uart)
- ModelSim simulation waveforms for transmit module. See Figure 10.4.
Figure 10.4 Serial port sending MoselSim simulation waveform
- Extended design (extended content is only reserved for users to think and practice)
- Design the transmitter to support 5, 6, 7, 8-bit PHY (Port physical layer)
- Support parity check
- The settings of the above steps involve FIFO, PLL, etc. (Refer to uart_top project file)
- Design of rx_phy.v
- Design strategies and steps
- Use 8 times sampling: so rx_baud is different from tx_baud, here sampling is rx_band = 8*tx_band
Adopting judgments to the receiving data
Determine whether the data counter is greater than 4 after the sampling value is counted.
- Steps to receive data:
- Synchronization: refers to how to find the start bit from the received 0101 (sync_dtc)
- Receive start bit (start)
- Cyclically receive 8-bit data
- Receive stop bit (determine whether it is one stop bit or two stop bits)
- Determine if the stop bit is correct
- Correct, jump to step B
- Incorrect, jump to step A, resynchronize
- Do not judge, jump directly to B, this design adopts the scheme of no judgment
- Design of rx_buf
- Design strategies and steps
- Add 256 depth, 8-bit fifo
- Read and write clock separation
- Asynchronous clear (internal synchronization)
- Data appears before the rdreq in the read port
- Initialization: fifo, rx_phy
- Wait: FIFO full signal (wrfull) is 0
- Write: Triggered by rx_phy_byte, rx_phy_rdy of rx_phy:
- End of writing
- Back to step b and continue to wait
- rx_buf.v source program (Reference to project files)
- Receive module simulation
Content and steps
- tx, rx loopback test (assign rx_in = tx_out)
- Continue to use the testbench file in the TX section
- Write the testbench of rx
- ModelSim simulation. See Figure 10.5.
- Reflection and development
- Modify the program to complete the 5, 6, 7, 8-bit design
- Completing the design of the resynchronization when the start and stop have errors of the receiving end rx_phy
- Complete the analysis and packaging of the receiving data frame of rx_buf
- Using multi-sampling to design 180° alignment data sampling method, compare FPGA resources, timing and data recovery effects
Figure 10.5 rx_phy wave form
- Hardware interface, FII-PRA040 development board has integrated USB to serial port conversion
- Write a hardware test file
- Test plan: connect development board CON8 to host USB interface
- Using test software such as teraterm, SSCOM3, etc., you can also write a serial communication program (C#, C++, JAVA, Python…)
- PC sends data in a certain format
- The test end uses a counter to generate data in a certain format.
- Write the test program hw_tb_uart and instantiate uart_top in it.
- Set hw_tb_uart to the top level, instantiate the previous program, and then verify it
- Pin assignmnets:
Table 10.1 Serial port experiment pin mapping
|Signal Name||Network Label||FPGA Pin||Port Description|
|rx_in||TTL_RX||E16||Serial data received|
|tx_out||TTL_TX||F15||Serial data transmiteed|
- Observe the experiment result
- Observe the data received by the PC. See in Figure 10.6.
- Observe the data received by the FPGA with SignalTap II
Figure 10.5 Data transmitted displayed on the host computer
- The receiving part has been skipped here. You are encouraged to try it on your own.