原创 verilog的UART的发送问题

2011-3-4 09:56 2805 13 13 分类: FPGA/CPLD

经过4~5天的调试,Uart最终还是没有成功,不懂是什么原因。原因大概如下:

1.     usb转串口线没有成功,因为驱动只有xp的,而我的系统是win7旗舰版的,有可能驱动不兼容,但是用串口调试上位机调试时去能发现串口。

2.    就是代码的问题。我自己也编写了几个代码,其中一个只有一个模块的,另一为两个模块(一个为波特率时钟发生模块,一个为接收控制模块)

3.    有可能是fpga的de1开发板子串口的问题,因为我把部分代码在网上论坛上看了,有个版主也是这么说的,经他说后我才意识到有这方面的原因。

 

先贴下我写的第一个程序:

 

module UartTest(Clk50Mhz,RstN,TStart,UartSend);

input Clk50Mhz,RstN,TStart;

//input[7:0] DataIn;

output UartSend;

 

reg UartSend;

reg StartFlag;

reg[0:12] Count=13'd0;

reg[3:0] Num=4'd0;

 

always@(posedge Clk50Mhz or negedge RstN )//or negedge TStart)

begin

if(!RstN)

    StartFlag=1'd0;

else if(!TStart)

    StartFlag=1'd1;

end

 

always@(posedge Clk50Mhz or negedge RstN)

begin

if(!RstN)

begin

    Count<=13'd0;

    Num<=3'd0;

end

else if(StartFlag)

begin

        Count<=Count+1'd1;

        if(13'd5207==Count)

            begin

            Count<=13'd0;

            Num<=Num+1'd1;

            if(3'd11==Num)

                Num<=3'd0;

            end

        case(Num)

            4'd0:UartSend<=1'd1;//idle

            4'd1:UartSend<=1'd0;//send data start

            4'd2:UartSend<=1'd1;//bit1

            4'd3:UartSend<=1'd1;//bit2

            4'd4:UartSend<=1'd0;//...

            4'd5:UartSend<=1'd0;

            4'd6:UartSend<=1'd0;

            4'd7:UartSend<=1'd0;

            4'd8:UartSend<=1'd0;

            4'd9:UartSend<=1'd1;

            4'd10:UartSend<=1'd1;//stop

            default:UartSend<=1'd1;

        endcase    

end

end

endmodule

 

我写的第二个程序:

顶层文件:

module UartSend(Clk50Mhz,Start,RstN,DataIn,UartOut,TxDone);

 

input Clk50Mhz,RstN,Start;

input[7:0]DataIn;

output UartOut,TxDone;

wire w_ClkBps;

 

SpeedSet speedset(.Clk50Mhz(Clk50Mhz),.RstN(RstN),.Start(Start),.ClkBps(w_ClkBps));

UartSendContral uartsendcontral(.Clk50Mhz(Clk50Mhz),.RstN(RstN),.ClkBps(w_ClkBps),

                             .Start(Start),.DataIn(DataIn),

                             .TxDone(TxDone),.UartOut(UartOut));

 

endmodule

波特率时钟控制模块SpeedSet:

module SpeedSet(Clk50Mhz,RstN,Start,ClkBps);

 

input Clk50Mhz,RstN,Start;

output ClkBps;

reg r_ClkBps;

reg [12:0]ClkCount;

 

always@(posedge Clk50Mhz or negedge RstN)

if(!RstN)

ClkCount<=1'd0;

else if(ClkCount==13'd5207)

ClkCount<=13'd0;

else if(Start)

ClkCount<=ClkCount+1'd1;

else ClkCount<=1'd0;

assign ClkBps=(ClkCount==13'd2603)?1'd1:1'd0;//generate the 9600bps signal

 

endmodule

发送控制模块:

module UartSendContral(Clk50Mhz,RstN,ClkBps,DataIn,Start,TxDone,UartOut);

 

input Clk50Mhz,RstN,ClkBps,Start;

input[7:0]DataIn;

output TxDone,UartOut;

reg[3:0]State;

reg r_UartOut;

reg r_TxDone;

 

always@(posedge Clk50Mhz or negedge RstN)

if(!RstN)

begin

State<=4'd0;

r_UartOut<=1'd0;

r_TxDone<=1'd0;

r_UartOut<=1'd1;

end

else if(Start)

case(State)                           //state machine

    4'd0:if(ClkBps)

    begin

        State<=State+1'd1;              //the start of bit

        r_UartOut<=1'd0;

    end

    4'd1,4'd2,4'd3,4'd4,4'd5,4'd6,4'd7,4'd8:if(ClkBps)  //the input data

    begin

        State<=State+1'd1;

        r_UartOut<=DataIn[State-1];

    end

    4'd9,4'd10:if(ClkBps)                   //two stop bit

    begin

        State<=State+1'd1;

        r_UartOut<=1'd1;

    end

    4'd11:if(ClkBps)                  //when it end,it will generate the puls (r_TxDone)

    begin

        State<=State+1'd1;

        r_TxDone<=1'd1;

    end

    4'd12:if(ClkBps)

    begin

        State<=1'd0;

        r_TxDone<=1'd0;

    end

endcase

assign UartOut=r_UartOut;

assign TxDone=r_TxDone;

endmodule

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
13
关闭 站长推荐上一条 /1 下一条