|
这个模块可以实现FPGA对PC的串口发送,但是,当连接着串口线的时候,对FPGA进行掉电重启后,FPGA就无法发送数据。这时,需要PC对FPGA发送任意数据,这样FPGA才能再次开始发送数据。
奇怪的是,FPGA可以发送数据后,我拔掉串口线,对FPGA掉电重启,然后再连接串口线,这时FPGA就可以直接发送数据。这让我听费解的。
在这之前,我的发送模块没有RXD引脚,总是需要PC对FPGA发送任意数据,这样FPGA才能再次开始发送数据。后来,我添加了RXD,这个问题就解决了。
此模块的RXD直接接入了而已。
硬件平台:赵亮的FPGA开发板
程序如下:
/*****************串口发送模块***********************/
/** AS烧写后,如果带着串口线掉电重启 **/
/** 则仍需要PC发送数据激活才能发送数据; **/
/** 如果拔掉串口线,重启后再连接,可直接发送 **/
module send(clk,clkout,TXD,TI,WR,RXD,LED);
input WR,RXD;
input clk;
output clkout;
output TXD,TI; //串行数据,发送中断
output LED;
reg[9:0] Datainbuf,Datainbuf2; //发送数据缓存
reg WR_ctr,TI,txd_reg;
reg[3:0] bincnt; //发送数据计数
reg[15:0] cnt;
wire clk_equ;
parameter cout=5208; //晶振为50MHz
reg temp,LED;
/*****************波特率发生进程********************/
always@(posedge clk)
begin
if(clk_equ)
cnt=16'd0;
else
cnt=cnt+1'b1;
end
assign clk_equ=(cnt==cout);
assign clkout=clk_equ;
/***************读数据到缓存进程********************/
always@(posedge clk)
begin
if(!WR)
begin
Datainbuf={1'b1,8'b00111000,1'b0}; //读入数据,并把缓存组成一帧数据,10位
WR_ctr=1'b1; //主程序进程
end
else if(TI==0)
WR_ctr=1'b0;
end
/*********************主程序进程***********************/
always@(posedge clk)
begin
if(clk_equ)
begin
if(WR_ctr==1||bincnt<4'd10) //从发送条件判断,保证发送数据的完整性
begin
if(bincnt<4'd10)
begin
txd_reg=Datainbuf2[0]; //从最低位开始发送
Datainbuf2=Datainbuf>>bincnt; //移位输出
bincnt=bincnt+4'd1; //发送数据位计算
TI=1'b0;
end
else
bincnt=4'd0;
end
else
begin //发送完毕或者处于等待状态时,TXD和TI为高
txd_reg=1'b1;
TI=1'b1;
end
end
end
assign TXD=txd_reg; //TXD连续输出
////////////////////////检测RXD是否为高
always@(posedge clk)
begin
temp<=RXD;
if(temp==1'b1)
LED<=1'b1;
end
endmodule |
|