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

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
波特率选择寄存器
//----------------------------------------------------------
此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
9条回答
cobble1
1楼-- · 2019-03-26 03:46
 精彩回答 2  元偷偷看……
ladeng777
2楼-- · 2019-03-26 05:56
上述代码,可以结合自己的时钟频率修改clk,而bps_para=clk/baud。另外通过示波器可以发现,结束电平为1bit,那么num=12必须都改为10,这样可以解决不能发送字符串的问题!
andyandy
3楼-- · 2019-03-26 11:49
串口程序里有2个时钟,一个是系统时钟,一个是波特率时钟。
按串口协议,下降沿后是一个起始位,为低电平。
在上述程序中,系统时钟远高于波特率时钟。而neg_rx_int 是以系统时钟的节奏变化的,因此检测到下降沿后必然为低,不过那可不是一个主时钟周期,而是很多主时钟周期。
供楼主思考吧。不很清楚你的意图。

一周热门 更多>