经过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
文章评论(0条评论)
登录后参与讨论