uart.v
module uart #(
parameter clk_freq = 50000000,
parameter baud = 9600
) (
input sys_clk,
input sys_rst,
output rx_irq,
output tx_irq,
input uart_rx,
output uart_tx
);
wire [7:0] rx_data;
reg [7:0] tx_data;
reg tx_wr;
always @(posedge sys_clk)
begin
if (rx_irq)
begin
tx_data <= rx_data;
tx_wr <= 1'b1;
end
else
begin
tx_wr <= 1'b0;
end
end
uart_transceiver transceiver(
.sys_clk(sys_clk),
.sys_rst(sys_rst),
.uart_rx(uart_rx),
.uart_tx(uart_tx),
.divisor(clk_freq/baud/16),
.rx_data(rx_data),
.rx_done(rx_irq),
.tx_data(tx_data),
.tx_wr(tx_wr),
.tx_done(tx_irq)
);
endmodule
uart_transceiver.v
/*
* Milkymist VJ SoC
* Copyright (C) 2007, 2008, 2009, 2010 Sebastien Bourdeauducq
* Copyright (C) 2007 Das Labor
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, version 3 of the License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
module uart_transceiver(
input sys_rst,
input sys_clk,
input uart_rx,
output reg uart_tx,
input [15:0] divisor,
output reg [7:0] rx_data,
output reg rx_done,
input [7:0] tx_data,
input tx_wr,
output reg tx_done
);
//-----------------------------------------------------------------
// enable16 generator
//-----------------------------------------------------------------
reg [15:0] enable16_counter;
wire enable16;
assign enable16 = (enable16_counter == 16'd0);
always @(posedge sys_clk) begin
if(sys_rst)
enable16_counter <= divisor - 16'b1;
else begin
enable16_counter <= enable16_counter - 16'd1;
if(enable16)
enable16_counter <= divisor - 16'b1;
end
end
//-----------------------------------------------------------------
// Synchronize uart_rx
//-----------------------------------------------------------------
reg uart_rx1;
reg uart_rx2;
always @(posedge sys_clk) begin
uart_rx1 <= uart_rx;
uart_rx2 <= uart_rx1;
end
//-----------------------------------------------------------------
// UART RX Logic
//-----------------------------------------------------------------
reg rx_busy;
reg [3:0] rx_count16;
reg [3:0] rx_bitcount;
reg [7:0] rx_reg;
always @(posedge sys_clk) begin
if(sys_rst) begin
rx_done <= 1'b0;
rx_busy <= 1'b0;
rx_count16 <= 4'd0;
rx_bitcount <= 4'd0;
end else begin
rx_done <= 1'b0;
if(enable16) begin
if(~rx_busy) begin // look for start bit
if(~uart_rx2) begin // start bit found
rx_busy <= 1'b1;
rx_count16 <= 4'd7;
rx_bitcount <= 4'd0;
end
end else begin
rx_count16 <= rx_count16 + 4'd1;
if(rx_count16 == 4'd0) begin // sample
rx_bitcount <= rx_bitcount + 4'd1;
if(rx_bitcount == 4'd0) begin // verify startbit
if(uart_rx2)
rx_busy <= 1'b0;
end else if(rx_bitcount == 4'd9) begin
rx_busy <= 1'b0;
if(uart_rx2) begin // stop bit ok
rx_data <= rx_reg;
rx_done <= 1'b1;
end // ignore RX error
end else
rx_reg <= {uart_rx2, rx_reg[7:1]};
end
end
end
end
end
//-----------------------------------------------------------------
// UART TX Logic
//-----------------------------------------------------------------
reg tx_busy;
reg [3:0] tx_bitcount;
reg [3:0] tx_count16;
reg [7:0] tx_reg;
always @(posedge sys_clk) begin
if(sys_rst) begin
tx_done <= 1'b0;
tx_busy <= 1'b0;
uart_tx <= 1'b1;
end else begin
tx_done <= 1'b0;
if(tx_wr) begin
tx_reg <= tx_data;
tx_bitcount <= 4'd0;
tx_count16 <= 4'd1;
tx_busy <= 1'b1;
uart_tx <= 1'b0;
`ifdef SIMULATION
$display("UART:Â %c", tx_data);
`endif
end else if(enable16 && tx_busy) begin
tx_count16 <= tx_count16 + 4'd1;
if(tx_count16 == 4'd0) begin
tx_bitcount <= tx_bitcount + 4'd1;
if(tx_bitcount == 4'd8) begin
uart_tx <= 1'b1;
end else if(tx_bitcount == 4'd9) begin
uart_tx <= 1'b1;
tx_busy <= 1'b0;
tx_done <= 1'b1;
end else begin
uart_tx <= tx_reg[0];
tx_reg <= {1'b0, tx_reg[7:1]};
end
end
end
end
end
endmodule
分享到:
相关推荐
对 UARTLoopback 的代码进行了改进
UART loopback测试实例,接收PC端发送的UART数 据,原数据返回给PC端,即loopback功能
UART环回 该示例演示了通过UART进行的基本数据读取和写入操作。 该应用程序创建一个环回接口,该接口立即将从接收(RX)缓冲区读取的任何数据回显到发送(TX)缓冲区。 屏幕截图 先决条件 带有可用UART端口的...
实现zynq与电脑上位机串口终端的数据换回
Verilog/FPGA串口详细带注释源码工程,收发回环模块亲测可用。非常适合初学者学习使用,资源来自正点原子,感谢他们的辛苦分享。
JZ2440->UART: loopback mode
串口助手发送数据给单片机,单片机原样返回
串口收发,工程实现,亲测可用,适合新手入门、
SCI功能开发例程,串口通讯调试,UART测试使用。
DE0-Nano 上的 UART 该项目的目标是创建一个可以轻松添加到 DE0-Nano 上的任何项目的 UART/串行黑匣子。 唯一需要的额外硬件是串行接口。 我正在使用 CP2102 USB 到 UART 桥接器( ),但任何东西都应该可以工作。...
摘要:本文基于嵌入式linux下串口应用编程进行了研究,详细... UART的操作主要可分为以下几个部分:数据发送、数据接收、产生中断、设置波特率、Loopback模式、红外模式以及硬软流控模式。 在linux中,所有的设备
12_uart_loopback_top 12_uart_top_rs232 13_rs485_uart_top 14_lcd_rgb_colorbar 15_lcd_rgb_char 16_top_hdmi_colorbar 17_hdmi_block_move_top 18_top_remote_rcv 19_top_cymometer 1_flow_led 20_e2prom_top 21_...
An internal loopback capability allows onboard diagnostics. The 864 is available in the 100- pin QFP package. The XR16C864 offers faster channel status access by providing separate outputs for TXRDY ...
internal loopback capability allows system diagnostics. Additional enhanced features includes a programmable fractional baud rate generator and 8X and 4X sampling rate that allows for a maximum baud ...
Console Debug System Service using UART Console Debug System Service using USB FAT filesystem using NVM Media FAT filesystem using SDSPI Media FAT filesystem using SPI driver with SDSPI Media FreeRTOS...
msp430x21x2_uscia0_irda_01.c USCI_A0 IrDA External Loopback Test, 8MHz SMCLK msp430x21x2_uscia0_irda_02.c USCI_A0 IrDA Monitor, 8MHz SMCLK msp430x21x2_uscia0_irda_03.c USCI_A0 IrDA Physical Layer Comm...
如果您更喜欢使用 SoftDevice V6,只需使用分支如何 git clone https://github.com/Seeed-Studio/mbed_ble.gitcd mbed_ble/demos/ble_uart_loopback # or mbed_ble/demos/beaconmake要合并软设备 hex 文件和应用...
USCI_A0 IrDA External Loopback Test, 8MHz SMCLK USCI_A0, SPI 3-Wire Master Incremented Data USCI_A0, SPI 3-Wire Slave Data Echo UUSCI_A0, 115200 UART Echo ISR, DCO SMCLK USCI_A0, Ultra-Low Pwr UART ...
包括串口UART与PC通信实验、I2C接口实验、网口TESC Loopback实验、PCI Agent与Host连接实验等共9个基础实验。 第三章介绍了一些综合性应用试验。包括U-boot在PowerPC 中的使用、Embeded Linux 编译与移植、网络设备...
ANDROID 的串口调试工具 apk 能接收 能发送 loopback!ANDROID 的串口调试工具 apk 能接收 能发送 loopback!