大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。
Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺
废话不多说,先上源代码链接和testbench的链接,推荐使用UE查看源代码,UE中的VHDL语法、Verilog语法和SystemVerilog语法高亮文件的下载链接在这里。上篇的最后给出了本篇所附代码的uart通信模型的工作过程。本篇的主要内容在源代码里,因此文章内容略显简单。
一、寄存器描述
本篇所写的uart接口的内部寄存器的定义如下表:
寄存器名 | 地址 | 属性 | 说明 |
复位寄存器 | 0x00 | w/r | 低3位才有意义,第0位用于对发送电路进行复位,第1位用于对接收电路进行复位,第2位用于对控制电路进行复位,都是高电平有效。复位时先写入1,再写入0。 |
分频控制寄存器 | 0x01 | w/r | 用于对内部分频计数器进行读写操作,以使uart满足不同的波特率。 |
发送寄存器 | 0x02 | w | 用于将需要发送的数据锁存到这个寄存器中。 |
命令寄存器 | 0x03 | w | 低1位有意义,写这个寄存器会产生一个时钟宽度的控制信号,这个控制信号用于通知发送电路可以发送数据了。 |
接收寄存器 | 0x04 | r | 只读,用于存储当前接收到的完整数据。 |
接收状态寄存器 | 0x05 | rc | 读清0,低2位有意义,第0位表示接收到的数据奇偶校验是否有错,为0表示没有错,第1位表示接收中断,为1表示CPU可以读取接收寄存器了。 |
发送状态寄存器 | 0x06 | rc | 读清0,低1位有意义,第0位表示发送中断,为1表示当前发送寄存器中的数据已经发送完成。 |
二、源代码组成分析
链接中给出的源代码由4个.v文件组成,其中uart_xmt.v是发送控制器,uart_rcv.v是接收控制器,uart_ctl.v是控制电路。uart_xmt.v和uart_rcv.v中各有一个状态机,uart_ctl.v中有两个状态机,这里不给出过多的解释,代码中我都给出了详细注释。核心设计思想就是设置一个采样脉冲,这个采样脉冲的频率是和波特率相关的(在本设计中就等于波特率),由此来控制发送数据和接收数据,奇偶校验使用的策略是按位异或。
三、对于本篇testbench的说明
所附testbench中的时钟为25MHZ,时钟计数器为16,这样子传输波特率很高,这是为了仿真方便。实际情况下波特率可能没有这么高,对于115200波特率的串口,在25MHZ时钟下,只需要设置时钟计数器的值为25000000/115200=217,就可以了,这里不需要特别精确,这就是异步串口通信的好处。当然,如果需要比较低的波特率,8位时钟计数器分频已经不够了,则需要将25MHZ时钟再次分频后输入uart串口中。
本篇的testbench较之于我以前文章中描述的简单的testbench在复杂程度上有所上升,主要体现在随机化激励和自动比对上。
所附testbench的代码中将UART的输入和输出相连形成回环测试,先用CPU控制UART输出一个随机数据,然后回环到UART的输入,再用CPU读出来,将输出数据和读出的数据进行自动比对。代码中的CPU的读写操作和自动比对操作都必须定义成任务,不能定义成函数,因为任务是要花费仿真时间的。
这样子的testbench在实际工程中很常用,因为无论什么通信接口,回环测试是很有必要的,在回环测试时,如果对着仿真波形一个一个比对接收和发送数据,很浪费时间,必须要学会编写自动比对任务,此外,testbench中用到的随机激励也是测试bug的好方法。
下一篇文章中我将介绍Xilinx自带的uart接口的IP,这是一个用户端满足AXI总线协议的UART接口。
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/193977.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...