5 . 各模块详细设计
1)波特率发生器模块:假定系统时钟为50M,波特率为115200,则传输每一位所需的时间为8.6805us,而将其分频至波特率的16倍则需计数则在系统时钟下当计数值为27时则将Baud16Tick置为1,其他时间都为0。要得到波特率脉冲时则在Baud16Tick节拍下计数至16时将BaudTick置为1,其他值时为0。程序如下:
always @(posedge clk )
begin
if (rst)
begin
OverSampleCnt <=8'b0;
Baud16Tick <= 1'b0;
end
elseif(OverSampleCnt== OverSampleCntnum)
OverSampleCnt <= 1'b0;
else
OverSampleCnt <=OverSampleCnt+1;
case(OverSampleCnt== OverSampleCntnum/2)
OverSampleCntnum/2:Baud16Tick <= 1'b1;
default:Baud16Tick <= 1'b0;
endcase
End
always @(posedge clk or negedge rst)
begin
if (rst)
begin
BaudTick <= 1'b0;
BaudTickCnt <= 4'b0000 ;
end
else if (Baud16Tick&&BaudTick_EN)
BaudTickCnt = BaudTickCnt +1 ;
elseif((BaudTickCnt== 4’b1111)
BaudTickCnt <= 4'b0000 ;
case(BaudTickCnt)
4'b1000:BaudTick <= 1'b1;
default:BaudTick <= 1'b0;
endcase
end
2)数据发送器模块:在Baud16Tick的节拍下捕捉TXD_start的下降沿,之后将din8的数据存入缓冲器tbr中,再启动BaudTick脉冲并计数,在计数为4’b0000时发送停止位0,在4’b0001至4’b1000时发送数据位,并在之后两位发送奇偶校验位和停止位。没有发送是则发送空闲位1。校验每发一位就将parity进行异或数据位得到其值并发送。当发送停止位后,即将发送完成标志位TXD_done置1.程序如下:
always@(posedge clk)
begin
if(rst)
begin
{TxD_start0,TxD_start1} <= {
1'b0,1'b0};
end
else
TxD_start0 <= TxD_start;
TxD_start1 <= TxD_start0;
end
assign start = TxD_start1&!TxD_start0;
always@(posedge clk or posedge rst)