UART寄存器介绍

UARTn_BR: UART波特率寄存器
UARTn_BR[15:0]: 由定时器的装入寄存器定时装入相应内容。
                UARTn_CR.Run=0可以装入直到UARTn_CR.Run=1才写入无效
               
UARTn_TxBUFR:UART传输寄存器
UARTn_TxBUFR[8]: 传输数据第八位或者奇偶校验位或者唤醒位或者未定义的位有相应操作模式决定
     1.如果是001模式则此位写0
     2.如果是8+校验111模式则此位由UART自己处理写入 软件操作无效
UARTn_TxBUFR[7]: 传输数据第七位或者奇偶校验位
     1.如果是7+校验011模式同样此位由UART自己处理写入 软件操作无效
UARTn_TxBUFR[6:0]:数据位


UARTn_RxBuffer: UART接收寄存器
RX[9]:桢错误标志1表示此桢有问题
RX[8]:接收数据位8,或者奇偶校验位或者唤醒位
RX[7]:接收数据位7,或者奇偶校验位
RX[6:0]:数据位

UARTn_CR:UART控制寄存器
CR[15-11]保留都是0
CR[10]FifoEnble队列模式0关闭 表示TxFIFO认为是包含了16位数据才是满栈
              1是开启 表示TxFIFO认为当前就是才是满栈直接置TxFULL位
CR[9]SCENBLE 智能卡关闭还是开启不使用则置0
CR[8]RxEnble 接收功能关闭开启 由下降沿来触发RXD脚初始化
CR[7]Run=0波特率无用 =1则有用
CR[6]LoopBack=0标准的接收和发送模式 =1是特殊模式。此位只由UART无效被改变
CR[5]ParityOdd选择奇偶校验=0则为偶校验 =1为奇校验
CR[43]StopBits 00 0.5停止位 01是1个停止位 10是1.5个 11是2个
CR[2:0] MODE 5种模式


UARTn_IER UART的中断允许寄存器
15-9保留位为0
8 RxHalfFullIE 接收存储器超过8位则置
7 TimeoutIdleIE 接收队列无数据切超时记数为0则置
6 TimeNotoutIdleIE 接收队列有数据切超时记数为0则置
5..1

UART_SR UART状态寄存器
9 TXFULL 发送寄存器包含16个位
8 RxHalfFull 接收到超过8个位
7 TimeoutIdle RxFIFO为空并且超时
6 TimeNotoutIdle RxFIFO不为空并且超时
5 OverrunError数据正在接收并且接收缓冲满
4 FramError 当接收队列包含一个接收贞错误标志
3 ParityError 当接收队列里包含一个检验错误
2 TxHalfEmpty 传输队列一半是空
1 TxEmpty 传输队列为空


UART_GTR UART的保护发生时间
7-0 八位时间值给用户来定义程序传输为空的探测时钟延迟

UART_TOR UART超时机制
7-0超时装载计数器


UART_TxRSTR 传输寄存器清除寄存器
UART_RxRSTR 接收寄存器清除寄存器
只写写入后将会清空相应的接收或者传输寄存器RxFIFO or TxFIFO

### UVM UART 寄存器模型实例与实现细节 在通用验证方法学 (Universal Verification Methodology, UVM) 中,创建 UART 寄存器模型涉及定义寄存器及其字段,并将其集成到更广泛的测试平台架构中。下面是一个简化版的 UART 寄存器模型示例。 #### 定义寄存器类 为了表示单个寄存器以及其内部位域,在 SystemVerilog/UVM 下通常会先声明一个继承自 `uvm_reg` 的类来描述特定硬件资源: ```systemverilog class uart_line_control extends uvm_reg; rand uvm_reg_field dlab; // Divisor Latch Access Bit rand uvm_reg_field wlen; // Word Length Select Bits function new(string name = "uart_line_control"); super.new(name, 8, UVM_NO_COVERAGE); endfunction : new virtual function void build(); this.dlab = uvm_reg_field::type_id::create("dlab", null, get_full_name()); this.wlen = uvm_reg_field::type_id::create("wlen", null, get_full_name()); this.dlab.configure(this, 1, 7, "RW", 0, 8'h00, 1, 1, 0); this.wlen.configure(this, 2, 0, "RW", 0, 8'h00, 1, 1, 0); endfunction : build endclass : uart_line_control ``` 此部分展示了如何构建一个名为 `uart_line_control` 的寄存器对象[^1]。 #### 创建顶层寄存器块 随后通过组合多个上述类型的组件形成完整的设备映像视图——即所谓的“寄存器块”。这一步骤同样基于扩展 `uvm_reg_block` 类完成: ```systemverilog class uart_regs extends uvm_reg_block; rand uart_line_control lcr_h; // Line Control Register High Byte function new(string name = "uart_regs"); super.new(name, UVM_NO_COVERAGE); endfunction : new virtual function void build(); default_map = create_map("", 0, 4, UVM_LITTLE_ENDIAN); this.lcr_h = uart_line_control::type_id::create("lcr_h", null, get_full_name()); this.lcr_h.build(); default_map.add_reg(lcr_h, 'h0C, "RW"); // 假设LCR位于偏移量为'C'的位置 lock_model(); endfunction : build endclass : uart_regs ``` 这里说明了怎样组装各个独立寄存器成为统一管理单元的过程[^2]。 #### 实现读写操作 最后要确保能够正确执行针对这些抽象出来的接口的操作命令。一般而言,这是通过调用由框架提供的 API 函数达成目的;例如访问某个具体地址处的数据项可以借助如下方式实现: ```systemverilog // 写入数据至指定寄存器 void'(reg_blk.default_map.write(.addr('h0C), .value(8'h3B))); // 从指定寄存器读取数据 bit[7:0] data_read; if (!reg_blk.default_map.read(.addr('h0C), .value(data_read))) begin $display("Failed to read from address %0h", 'h0C); end else begin $display("Data at address %0h is %0h", 'h0C, data_read); end ``` 这段代码片段解释了基本的寄存器交互逻辑[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值