吐血求助啊
难道我真的就没有学FPGA的天分吗?~~~~~~~帮我看下这个超级简单的uart的接收程序
顶层
module uart_test(clk,rst,rx,sig1,qout);
input clk,rst;
input rx;
output sig1; //sig1=1表示正在接收,sig1=0检测起始位
output qout; //输出我直接接lED了
wire clk16;
fredivn u1(.clk(clk),.clkout(clk16));
rxd3 u2(.clk(clk16),.rst(rst),.rx(rx),.sig1(sig1),.q(qout));
endmodule
分频
module fredivn(clk,clkout);
input clk;
output clkout;
reg counter;
reg tmp_clk;
always @(posedge clk) begin
if(counter==17'd5208) //600bps*16波特率60016倍波特率晶50M
begin
tmp_clk=~tmp_clk;
counter=0;
end
else
counter=counter+1;
end
assign clkout = tmp_clk;
endmodule
接收程序
module rxd3(clk,rst,rx,sig1,q);
input clk,rst;
input rx;
output sig1; //用于判断是否正在接收
output q;
reg sig1;
reg sig2; //sig2=8判断起始位0 sig2=16接收数据间隔
reg i;
reg sig3; //接收数据的位数
reg q;
always @(posedge clk) begin
if(rst) begin
sig1=0;
sig2=0;
sig3=0;
q=0;
i=0;
end
else
if(~sig1)
begin
if(sig2==8)
begin
sig2=0;
sig1=1;
end
else
begin
if(~rx)
sig2=sig2+1;
else
sig2=0;
end
end
else //start to receive char
begin
if(sig2==16)
begin
q=q<<1;
q=rx;
sig2=0;
sig3=sig3+1; //received char's counter
if(sig3==8)
begin
sig3=0;
sig1=0; //transmit over
end
end
else
sig2=sig2+1;
end
end
endmodule
为什么下载到板后,用串口调试软件试过没有反应,到底哪里出了问题了,
我要疯了。请大家帮帮忙 点击此处下载 ourdev_546170.zip(文件大小:2.04M) (原文件名:鄙人写得Verilog例程若干.zip) 程序中好像没有对接收数据位的判决做处理吧。
个人觉得在UART的串行通信中,波特率是设置和数据的采样时刻是至关重要的,否则就无法采集到正确的数据。一般而言,在时钟的边缘进行数据位的判决,且最好最好是在每一数据位的中点进行判决和采样。 回复【1楼】tear086 .COM 缺氧
-----------------------------------------------------------------------
谢谢你呀,我认真看看
页:
[1]