原创 夯实基础——uart调试经历

2010-12-23 20:44 1601 7 7 分类: FPGA/CPLD

        从开始工作到现在,似乎一刻也不得闲。不由得弱弱感叹到,资本家果然都是以榨干工人的剩余价值为目标的。对于我们这些新人来说,大量的项目调试是增加工程经验的好办法,不过适时的停下来进行下理论研究,对提高设计水平还是很有帮助的。


        利用几天没有工作任务的时间,彻底研究了下Uart模块的编写。结合了一些资料和其他Uart描述的例子。以前运用Uart的时候只通过对端口的理解去使用,而这几天已经清楚了Uart的内部逻辑。Uart的内部模块图可以由三部分构成,时钟发生器、发送器、接收器,控制信号贯穿其中。
        本来学习一个模块的方式可以通过模块重写来完成,后来觉得重写之后也无非是参照着原逻辑进行调整或者默写。恰好此时想要学习Verilog语言,干脆用Verilog对VHDL的模块进行重写。一来可以快速熟悉Verilog语法,二来少了对原模块照抄的感觉。经过一段时间(个人感觉时间有点长,一来跟对模块的反复研究有关,二来确实也有效率低下的问题)后,已经完成了新模块的编写,并且做出了testbench仿真。
        新模块与原模块的异同,重写编写的模块与原模块的设计思路相同,相比于某些教科书的例程而言,对通信过程的扫描更加严格,稳定性更好。但也有许多需要改进的地方,如何更加有效的保持稳定性,避免电路的不必要启动等。新模块的描述风格严格按照单进程单变量的风格来写,更加注重用状态机来描述电路,对一些没有意义的信号名称进行的改动,遵循顶层模块只有子模块例化及连线没有任何逻辑的描述风格。因此,新模块分为四个子模块,控制模块、时钟发生器、发送器、接收器。另外,整个模块的时序逻辑电路都是时钟同步的,不采用异步信号。对于reg型变量都赋予初值,在仿真过程中即使开始没有复位也可以使关键信号得到复位时所属的值。逻辑综合后,没有警告的地方。以后在逻辑编写时,标准模块尽量没有警告。不同于在学校时,往往把警告置之不理。
        在逻辑编写时,遇到过几个问题。某次保存后综合出现大量警告。一个是提示有一个或者多个敏感信号不在敏感信号表中。仔细分析过后,错把某些时钟边沿触发的进程写成电平触发,由此进程内的许多用于赋值的信号都变成了敏感信号。还有一个组合逻辑进程没写敏感信号,于是将所有用于赋值即判断信号都添加进信号表中。还有用错了!= "不等于" 符号,用成了!=== 这个符号将会把不确定值(x),高阻(z)等值都加进判断条件中。有一个信号定义了却没有使用,有一个使用了却没有定义。改过了之后警告全部消失,因此对于原模块有一个警告是由于异步电平触发时,没有将一个用于赋值的信号写进信号表造成的。因此,对于异步复位这种设计,是有着组合电路特性的。在仿真时,遇到了一个问题,发送过程不断进行着,没有停止,观察波形后发现,发送状态机停在发送数据这一进程中。分析逻辑后发现用于跳出发送数据进程判断条件的计数变量的初值和位宽搞错了,以至于永远无法达到这一条件。改过之后,仿真结果正确。
        在完成这一模块之后,首先最大的收获是对于Verilog语言的掌握,现在读Verilog的语法已经没有太大问题,在写方面也会使用大量流行的用法,熟练成熟已经越来越好。其次,对于Uart模块本身已经相当了解,以后在运用时更加有底。以后再写逻辑时,坚持通过状态机分析操作步骤,学会通过时序编写逻辑,通过逻辑可以画出时序。


        想想自己已经工作大半年了,才开始真正理解这些基础模块实在是太不应该,对比一下EDN上那些技术大牛们自己是应该爆发一下了。加油!

PARTNER CONTENT

文章评论0条评论)

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