网上看的串口自发自收的代码有点疑问,感觉是小问题,帮看下

2019-03-25 10:44发布

(顶层模块):
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
波特率选择寄存器
//----------------------------------------------------------
此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。