.
//module uart(read,send,cs,ks,reset,state,clk,dat_in,dat_out); input read,clk,reset,state;
//read为串行输入,clk为时钟输入50MHZ,reset为重启键 input[7:0] dat_in;//并行数据输入 output send,cs,ks;
//send为串行输出,cs为通知cpu接收数据位,ks为发送准备位 output[7:0] dat_out;//并行数据输出
wire clear,clk_enable,read_enable,clear3,send_enable,clear4,t1; wire[7:0] counters,dat_in;*/ rxd u1 (
.dat_out (dat_out) , .cs (cs) , .read (read) , .reset (reset) ,
.clk_enable3 (clk_enable3) , .clk (clk) ,
.read_enable (read_enable) , .clear3 (clear3) , .counters (counters) ); //接收数据module
.dat_in (dat_in), .ks (ks), .send (send), .reset (reset),
.clk_enable4 (clk_enable4), .clk (clk),
.send_enable (send_enable), .clear4 (clear4), .counters( counters)
txd u2 (
.
.
);//发送数据module
clk_bau u3 (
.clk(clk) , .t1 (t1),
.clk_enable (clk_enable) ); //时钟计数器模块 ctrl u4(
.read_enable (read_enable) , .send_enable (send_enable), .clk (clk), .state (state), .t1 (t1), .read (read ), .counters (counters), .reset (reset ), .clear (clear) );
check_cle u5 (
.state (state), .clear3 (clear3), .clear4 (clear4), .clear (clear),
.clk_enable3 (clk_enable3), .clk_enable4 (clk_enable4), .clk_enable (clk_enable) );
endmodule///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
.
.
3.3UART发送模块
3.3.1UART的数据发送服务
发送器实现的功能是将输入的8位并行数据变为串行数据,同时在数据头部加起始位,在数据位尾部加奇偶校验位和停止位。数据发送服务如表3.1
.
.
计数器 操作 0 发送低电平 1~~~8 偶校验 9 结果 10 发送数据和奇发送奇偶校验发送高电平 表3.1数据发送
其基 本 特 点是:
① 在 信 号线上共有两种状态,可分别用逻辑1和逻辑。来区分。在发送器空闲时,数据线应该保持在逻辑高电平状态。
②发送 起 始 位:该位是一个逻辑0,总是加在每一帧的头部,提示接受器数据传输即将开始,在接收数据位过程中又被分离出去,占据一个数据位的时间。 ③发送 数 据 位:在起始位之后就是数据位,一般为8位一个字节的数据,低位在前,高位在后。如字母C在ASCII表中是十进制67,二进制01000011,那么传输的将是110000100。并在数据发送过程当中,进行数据位奇偶校验。 ④ 发送校 验 位:该位一般用来判断接收的数据位有无错误,常用的校验方法是奇偶校验法。将3过程当中奇偶校验的结果输入到数据线,并占一个数据位时钟。 ⑤ 停止位 :停止位总在每一帧的末尾,为逻辑1,用于标志一个字符传送的结束,占据一个数据位的时间。
⑥ 帧:从起始位到停止位之间的一组数据称为一帧。
3.3.2UART的数据发送操作 如图3-4
图3-4数据发送操作
.
拉低电平 空闲检测 Cpu发送位检测 自检测 接cpu传入数据 拉高电平 发送等待 数据发送和奇偶校验 奇偶结果发送 .
解释:采用9600波特率发送
从cpu传入数据:是指将data_in端口的数据存入寄存器中 Cpu发送为检测:是指将ks寄存器置位,即数据发送完毕
3.3.3UART的数据发送模块程序
module rxd(dat_out,cs,read,reset,
clk_enable3,clk,read_enable,clear3,counters); //接收数据module input read_enable;
input read,reset,clk;//read为串行输入,read_control为时钟控制,reset为重启键
input[7:0] counters;
output cs,clear3,clk_enable3;//cs为通知cpu读取数据位 output[7:0] dat_out;//wire clear3; reg cs,cs1,clk_enable3;
reg[7:0] data_out;//移位寄存器
reg
parity_check_result,parity_result,clear3,clear1;/////////////////
.