flashman911 发表于 2009-10-10 17:11:24

FPGA串口发送模块,掉电重启后无法正常发送,求解答

这个模块可以实现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                Datainbuf,Datainbuf2;        //发送数据缓存
reg                                WR_ctr,TI,txd_reg;
reg                bincnt;                                        //发送数据计数
reg                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;                //从最低位开始发送
                                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

flashman911 发表于 2009-10-10 20:54:46

我尝试了很修改RXD,例如:高阻态、输入
但是每次都是要PC先发数据后,FPGA才能发送数据给PC。
不知道串口空闲时候状态是什么样啊?
页: [1]
查看完整版本: FPGA串口发送模块,掉电重启后无法正常发送,求解答