FPGA设计思路
那rs232举例来说,它采用的是全双工,有两条数据线,rx和tx,每次只能传输1bit,用FPGA设计一个具有uart功能其实不难,只要了解它的功能是什么。
uart功能就是:接收数据时。将串行数据转换成并行数据;在发送数据时,将并行的数据再转换成串行数据。
我们只要在FPGA内部实现这个功能描述就可以了。
一般只要两个模块就能解决,发送模块和接收模块。这两个模块分别诠释了uart的功能。
野火的波形图教学非常好,明白了时序是怎样的,那么代码就游刃有余了,大家可以根据下图的波形,自己编写verilog代码。
下图取之野火FPGA开发指南(接收模块波形图)
上图:绿色表示输入信号,黄色表示内部变量,红色表示输出信号。
可以看出rx接收信号经过了三次打拍操作,这是因为rx是异步信号,所以要处理,打拍是为了减小亚稳态带来的影响,同样作用是检测下降沿,这就意味着起始位出现,因为起始位是低电平,不传输数据时处于高电平。
start_nedge是一帧数据开始标志信号,work_en是8位数据接收有效使能信号。bit_flag信号是采样数据的信号,在一个波特的中间位置数据是稳定的,所以位于5208/2,拉高一个信号,目的就是采样这个数据,提高准确性。
为什么baud_cnt是0~5207,因为这是一个波特的时间,也就是1bit传输所需要的时间,怎么算的呢,因为系统时钟是50MHZ,周期就是20ns,而传输采用的波特率为9600Bps,这是描述数据传输快慢的,9600Bps就是1秒钟传输9600bit,那么每一个bit所需的时间不就是,1/9600s,用系统clk计数就要计数到5208,计算:(1/9600*10^9)ns/20ns =5208。
rx_data采用的是移位拼接,目的就是把接收到1个bit拼接成8bit,因为一个数据是8bit,而且传输过程中是低位到高位。
rx_flag是数据刚好拼接完成的信号
下图取之野火FPGA开发指南(发送模块波形图)
上图是发送过程,这与接收过程差不多,不多介绍了!