(顶层模块):
module my_uart_top(clk,rst_n,rs232_rx,rs232_tx);
input clk;
// 50MHz主时钟
input rst_n;
//低电平复位信号
input rs232_rx;
// RS232接收数据信号
output rs232_tx;
//
RS232发送数据信号
wire bps_start;
//接收到数据后,波特率时钟启动信号置位
wire clk_bps;
// clk_bps的高电平为接收或者发送数据位的中间采样点
wire[7:0] rx_data;
//接收数据寄存器,保存直至下一个数据来到
wire rx_int;
//接收数据中断信号,接收到数据期间始终为高电平
//----------------------------------------------------
speed_select
speed_select(
.clk(clk),
//波特率选择模块,接收和发送模块复用,不支持全双工通信
.rst_n(rst_n),
.bps_start(bps_start),
.clk_bps(clk_bps)
);
my_uart_rx
my_uart_rx(
.clk(clk),
//接收数据模块
.rst_n(rst_n),
.rs232_rx(rs232_rx),
.clk_bps(clk_bps),
.bps_start(bps_start),
.rx_data(rx_data),
.rx_int(rx_int)
);
my_uart_tx
my_uart_tx(
.clk(clk),
//发送数据模块
.rst_n(rst_n),
.clk_bps(clk_bps),
.rx_data(rx_data),
.rx_int(rx_int),
.rs232_tx(rs232_tx),
.bps_start(bps_start)
);
endmodule
module speed_select(clk,rst_n,bps_start,clk_bps);
input clk;
// 50MHz主时钟
input rst_n;
//低电平复位信号
input bps_start;
//接收到数据后,波特率时钟启动信号置位
output clk_bps;
// clk_bps的高电平为接收或者发送数据位的中间采样点
parameter
bps9600
= 5207,
//波特率为9600bps
bps19200
= 2603,
//波特率为19200bps
bps38400
= 1301,
//波特率为38400bps
bps57600
= 867,
//波特率为57600bps
bps115200
= 433;
//波特率为115200bps
parameter
bps9600_2
= 2603,
bps19200_2
= 1301,
bps38400_2
= 650,
bps57600_2
= 433,
bps115200_2 = 216;
reg[12:0] bps_para;
//分频计数最大值
reg[12:0] bps_para_2;
//分频计数的一半
reg[12:0] cnt;
//分频计数
reg clk_bps_r;
//波特率时钟寄存器
//----------------------------------------------------------
reg[2:0] uart_ctrl;
// uart波特率选择寄存器
//----------------------------------------------------------
此帖出自
小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
一周热门 更多>