搜索
bottom↓
回复: 1

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

[复制链接]

出0入0汤圆

发表于 2009-10-10 17:11:24 | 显示全部楼层 |阅读模式
这个模块可以实现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

出0入0汤圆

 楼主| 发表于 2009-10-10 20:54:46 | 显示全部楼层
我尝试了很修改RXD,例如:高阻态、输入
但是每次都是要PC先发数据后,FPGA才能发送数据给PC。
不知道串口空闲时候状态是什么样啊?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-2 18:03

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表