赞
踩
FPGA到PC的UART tx的程序设计
顶层设计
module top
(
CLK,RSTn,
TX_Pin_Out
);
input CLK;
input RSTn;
output TX_Pin_Out;
wire[7:0] TX_Data;
wire TX_EN_Sig;
control_module m1(.CLK(CLK),.RSTn(RSTn),.TX_Done_Sig(TX_Done_Sig),.TX_En_Sig(TX_En_Sig),.TX_Data(TX_Data));
UART_Tx m2(.CLK(CLK),.RSTn(RSTn),.TX_Data(TX_Data),.TX_En_Sig(TX_En_Sig),.TX_Pin_Out(TX_Pin_Out),.TX_Done_Sig(TX_Done_Sig));
endmodule
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
数据传输:传输00~FF的数据
module control_module
(
CLK,RSTn,
TX_Done_Sig,
TX_En_Sig,TX_Data
);
input CLK;
input RSTn;
input TX_Done_Sig;
output TX_En_Sig;
output[7:0] TX_Data;
parameter N1=50000;
reg[24:0] count;
reg isEn;
reg[7:0] rData;
wire TX_En_Sig;
wire[7:0] TX_Data;
always@(posedge CLK or negedge RSTn)
begin
if( !RSTn)
count <= 24'd0;
else if(count == N1)
count <= 24'd0;
else
count<=count+1'b1;
end
always@(posedge CLK or negedge RSTn)
begin
if(!RSTn)
begin
isEn <= 1'b0;
rData <= 8'h00;
end
else if( TX_Done_Sig)
begin
rData <= rData + 1'b1;
isEn <= 1'b0;
end
else if(count == N1)
isEn <= 1'b1;
end
assign TX_Data = rData;
assign TX_En_Sig = isEn;
endmodule
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
UART——tx封装
module UART_Tx
(
CLK,RSTn,
TX_Data,TX_En_Sig,
TX_Pin_Out,TX_Done_Sig
);
input CLK;
input RSTn;
input[7:0] TX_Data;
input TX_En_Sig;
output TX_Pin_Out;
output TX_Done_Sig;
tx_control_module U1(.clk2(CLK), .rst2(RSTn),.TX_En_Sig(TX_En_Sig), .TX_Data(TX_Data),
.BPS_CLK(BPS_CLK), .TX_Done_Sig(TX_Done_Sig), .TX_Pin_Out(TX_Pin_Out));
tx_bps_module U2(.clk1(CLK), .rst1(RSTn),.Count_Sig(TX_En_Sig), .BPS_CLK(BPS_CLK));
endmodule
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
波特率:9600
module tx_bps_module//数据位中心定位模块
(
clk1, rst1,
Count_Sig,
BPS_CLK
);
input clk1;
input rst1; //复位信号 RSTn,当RSTn=0,系统复位
input Count_Sig; //串口数据帧开始确认信号:Count_Sig,当 Count_Sig=1,表示串口输入帧开始时刻,持续一个系统时钟周期
output BPS_CLK; //BPS_CLK,当计数至每一位的中间位置,BPS_CLK=1,提示信号采集时间到,否则不进行信号采集
reg[12:0] Count_BPS;
always @ ( posedge clk1 or negedge rst1 )
if( !rst1 )
Count_BPS <= 13'd0;
else if( Count_BPS == 13'd5207 )
Count_BPS <= 13'd0;
else if( Count_Sig )
Count_BPS <= Count_BPS + 1'b1;
else
Count_BPS <= 13'd0;
assign BPS_CLK = ( Count_BPS == 12'd2604 ) ? 1'b1 : 1'b0;
endmodule
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
UART_tx数据传输模块
module tx_control_module
(
clk2, rst2,
TX_En_Sig, TX_Data, BPS_CLK,
TX_Done_Sig, TX_Pin_Out
);
input clk2;
input rst2;
input TX_En_Sig;
input[7:0] TX_Data;
input BPS_CLK;
output TX_Done_Sig;
output TX_Pin_Out;
reg[3:0] i;
reg rTX;
reg isDone;
always @ ( posedge clk2 or negedge rst2 )
if( !rst2 )
begin
i <= 4'd0;
rTX <= 1'b1;
isDone <= 1'b0;
end
else if( TX_En_Sig )
case ( i )
4'd0 :
if( BPS_CLK )
begin
i <= i + 1'b1; rTX <= 1'b0;
end
4'd1, 4'd2, 4'd3, 4'd4, 4'd5, 4'd6, 4'd7, 4'd8 :
if( BPS_CLK )
begin
i <= i + 1'b1;
rTX <= TX_Data[ i - 1 ];
end
4'd9 :
if( BPS_CLK )
begin
i <= i + 1'b1;
rTX <= 1'b1;
end
4'd10 :
if( BPS_CLK )
begin
i <= i + 1'b1;
rTX <= 1'b1;
end
4'd11 :
if( BPS_CLK )
begin
i <= i + 1'b1;
isDone <= 1'b1;
end
4'd12 :
begin
i <= 4'd0;
isDone <= 1'b0;
end
endcase
assign TX_Pin_Out = rTX;
assign TX_Done_Sig = isDone;
endmodule
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。