end
8'd40: //接收第1位数据 begin
idle <= 1'b1;
dataout[1] <= rx; presult <= presult^rx; cnt <= cnt + 8'd1; rdsig <= 1'b0; end
8'd56: //接收第2位数据 begin
idle <= 1'b1;
dataout[2] <= rx;
presult <= presult^rx; cnt <= cnt + 8'd1; rdsig <= 1'b0;
end
8'd72: //接收第3位数据 begin idle <= 1'b1; dataout[3] <= rx; presult <= presult^rx; cnt <= cnt + 8'd1; rdsig <= 1'b0; end
8'd88: //接收第4位数据 begin
idle <= 1'b1;
dataout[4] <= rx;
presult <= presult^rx; cnt <= cnt + 8'd1; rdsig <= 1'b0;
end
8'd104: //接收第5位数据 begin
idle <= 1'b1; dataout[5] <= rx; presult <= presult^rx; cnt <= cnt + 8'd1; rdsig <= 1'b0;
end
8'd120: //接收第6位数据 begin
idle <= 1'b1;
dataout[6] <= rx;
presult <= presult^rx; cnt <= cnt + 8'd1; rdsig <= 1'b0; end
8'd136: //接收第7位数据 begin
idle <= 1'b1;
dataout[7] <= rx; presult <= presult^rx; cnt <= cnt + 8'd1; rdsig <= 1'b1;
end
8'd152: //接收奇偶校验位 begin
idle <= 1'b1;
if(presult == rx) dataerror <= 1'b0; else
dataerror <= 1'b1; //如果奇偶校验位不对,表示数据出错 cnt <= cnt + 8'd1; rdsig <= 1'b1; end 8'd168: begin
idle <= 1'b1; if(1'b1 == rx)
frameerror <= 1'b0; else
frameerror <= 1'b1; //如果没有接收到停止位,表示帧出错 cnt <= cnt + 8'd1; rdsig <= 1'b1; end default:
begin
cnt <= cnt + 8'd1; end endcase end else begin
cnt <= 8'd0; idle <= 1'b0; rdsig <= 1'b0;
end end
endmodule
为接收模块生成原理图模块。并和前面的模块构成接收模块。连接图如下图6:
对其进行UART数据接收的波形仿真,波形仿真报告如图下图所示。
波形仿真报告说明:
对图分析看出,UART接收模块接收到的数据与UART发送模块发送的数据相一至,每接收到一个数据都有一个读取数据指示rdisg,UART接收模块得到正确验证。
4.4 UART的硬件测试
为了测试UART与PC通信的正确性,本例测试方法是,PC将数据发送到FPGA,FPGA接收到数据再发送给PC。FPGA与PC通信模块连接原理图如图8所示。
连接硬件电路图,配置硬件管脚,进行硬件烧录,完成后借助串口助手进行调试通讯。
5 课程设计总结
刚开始做课程设计的时候,看到这个设计题目根本无从着手,只能从最基本的开始,开始查找什么是全双工UART电路,再去研究UART的原理和它的结构设计,慢慢的开始有了设计的整体思路,在开始编写顶层文件程序时,遇到了不少问题,特别是各个元件之间的连接,以及信号的定义,总是有错误,在和同学不断的讨论和请教老师,终于找到了错误和警告。在波形仿真的时候也是遇到了一些困难,想要的结果不能在波形上得到正确的显示,在多次的调试之后,才发现是因为输入的时钟信号对于器件的演示时间来说太短了。在连接各个模块的时候一定要注意各个输入、输出的线宽,因为每个线宽是不一样的,只要让各个线宽相互匹配,才能得到正确的结果,否则,出现很小的误差就会导致整个文件系统的编译出现错误提示。通过这次课程设计使我懂得了理论与实践结合的重要性,只有理论知识是远远不够的,只有把所学的理论知识和实践相结合,才能真正为社会服务,从而提高自己的动手能力和独立思考能力。