【IC设计项目】基于APB协议的32位递减计数器

这里写自定义目录标题

  • 功能特性
  • 详细设计
    • 模块架构
    • 功能设计
    • APB接口
      • APB写操作
      • APB读操作
    • 递减计数
    • 开启计数控制端
      • 设置计数初始值和重置值
    • 中断产生与清除
    • Component ID,Peripheral ID和ECO寄存器
    • 接口信号与时序
  • 编程方法
    • 初始化流程
    • 中断处理流程

功能特性

Simple Timer是一个32位的减法计数器,支持以下特性:、
FS001:32位计数器
FS002:支持预设一个计数初始值
FS003:支持读取当前计数值
FS004:当计数器计数到0时,产生中断。中断一直保持直到被写清。
FS005:支持外部输入信号EXTIN直接作为计数使能信号,高电平有效。
FS006:支持外部输入信号EXTIN从0到1的跳变作为计数使能信号。
FS007:当计数器计数到0的同时,刚好发生了一次软件的中断写清操作,则软件操作的优先级更高(即此时不产生中断)。
FS008:支持APB寄存器读写逻辑采用独立时钟,当没有读写操作时该时钟处于关闭状态(时钟的关闭控制逻辑在此模块外部处理)
FS009:支持Component ID寄存器和Peripheral ID寄存器。
FS010:支持ECO寄存器。
FS011:支持APB2接口。

详细设计

模块架构

Simple Timer模块在系统中的位置如下图所示:
【IC设计项目】基于APB协议的32位递减计数器_第1张图片
Simple Timer模块的微架构如下图所示:
【IC设计项目】基于APB协议的32位递减计数器_第2张图片

功能设计

APB接口

APB在本次项目中的作用是对寄存器进行读写,读写操作需要满足APB的状态和时序,这一点在testbench 中体现。
【IC设计项目】基于APB协议的32位递减计数器_第3张图片

APB写操作

APB写操作满足时序如图所示。
【IC设计项目】基于APB协议的32位递减计数器_第4张图片
T0-T1阶段:此时APB总线为空闲阶段,此时的PSEL须为低电平,PENABLE须为低电平。
T1-T2阶段:此时为预备阶段,PCLK上升沿触发,传输地址和数据,PSEL需设置为高电平,PWRITE须设置为高电平表示此时为写操作。
T2-T3阶段:此时为传输阶段,PCLK上升沿触发,PENABLE须设置为高电平。
T3-T4阶段:此时为一个传输周期结束后的空闲状态,PSEL与PENABLE须为低电平。

APB读操作

APB读操作满足时序如图所示。
【IC设计项目】基于APB协议的32位递减计数器_第5张图片
T0-T1阶段:此时APB总线为空闲阶段,PENABLE须为低电平。
T1-T2阶段:此时为预备阶段,PCLK上升沿触发,传输地址和数据,PSEL需设置为高电平,PWRITE须设置为低电平表示此时为读操作。
T2-T3阶段:此时为传输阶段,PCLK上升沿触发,PENABLE须设置为高电平。
T3-T4阶段:此时为一个传输周期结束后的空闲状态,PENABLE须为低电平。

递减计数

实现递减计数这个功能,需要满足三个条件。递减计数控制端开启,设置计数初始值,设置计数为零的重置值。
【IC设计项目】基于APB协议的32位递减计数器_第6张图片

开启计数控制端

如上图所示,开启计数控制端最终要使得外部信号EXTIN从0到1跳变的时候dec_ctrl能够开启。
【IC设计项目】基于APB协议的32位递减计数器_第7张图片

通过同步寄存器,当EXTIN信号到达ext_delay时,此时的ext_sync2正在经历上一个时刻的0,通过逻辑表达式获得edge_detect为高电平。因此这种传输方式能够使得EXTIN触发计数器的开启。
在rtl代码中实现的方式为阻塞赋值
【IC设计项目】基于APB协议的32位递减计数器_第8张图片
【IC设计项目】基于APB协议的32位递减计数器_第9张图片

设置计数初始值和重置值

本项目中的计数方式为将初始值赋给nxt_curr_val,PCLK上升沿触发nxt_curr_val阻塞赋值给reg_curr_val,EXTIN触发使得dec_ctrl改变再次触发reg_curr_val将自减的值直接赋给nxt_curr_val。
当检测到reg_curr_val为0时将重置值直接赋给nxt_curr_val。
RTL中的体现为如下。
【IC设计项目】基于APB协议的32位递减计数器_第10张图片
【IC设计项目】基于APB协议的32位递减计数器_第11张图片
【IC设计项目】基于APB协议的32位递减计数器_第12张图片

中断产生与清除

计数中断的产生需要满足条件当reg_curr_val的值为1,同时控制寄存器的中断使能开启。
中断清除的目的是将中断寄存器reg_time_int原本的1变为0,中断写清发生在当计数到0时,同时用APB写操作给写清操作发送1,此时需要优先软件写清将reg_time_int原本的1变为0。
要完成以上的步骤,rtl部分需要完成对reg_curr_val检测,testbench部分需要完成对控制寄存器第四位的写1。
【IC设计项目】基于APB协议的32位递减计数器_第13张图片
【IC设计项目】基于APB协议的32位递减计数器_第14张图片
在这里插入图片描述

Component ID,Peripheral ID和ECO寄存器

为了方便设备驱动软件的管理,以及方便兼容同一外设的不同分支版本,Simper Timer模块支持可读的ID寄存器,分为Component ID和Peripheral ID。软件可以从ID识别出模块类型和版本信息。
本模块还支持4bit的ECOREVNUM信号设计,该信号连接到Peripheral ID,用来指示在芯片开发流程中的ECO版本修改信息。在前端设计中,该信号连接到tie-low的标准单元,在ECO过程中,可通过修改标准单元类型来改变版本号。

接口信号与时序

信号名 IO方向 位宽 时钟域 功能描述
PCLK Input PCLK 总线时钟,同步所有传输,正时钟沿触发所有信号
PRESETn Input PCLK 总线复位信号低有效,复位系统与总线
PSEL Input PCLK 选择信号
PADDR Input [11:2] PCLK 32位系统地址总线
PENABLE Input PCLK 指示APB操作的第二个周期
PWRITE Input PCLK 读写操作:1-写,0-读
PWDATA Input [31:0] PCLK 写操作主传给从的数据总线,推荐最少32位数据总线带宽。
PRDATA Output [31:0] PCLK 读操作返回给主的数据总线,推荐最少32位数据总线带宽。
PREADY Input PCLK 外设用这个信号去扩展APB传输
PSLVERR Output PCLK 这个信号表明一次传输失败
EXTIN Input PCLK 计数使能信号
TIMERINT Output PCLK 写清中断输出信号

编程方法

初始化流程

在使用Timer之前需要先对其进行初始化配置,按照如下步骤:
步骤1:打开控制寄存器
步骤2:给计数初始值赋值
步骤3:给重置值赋值
步骤4:给中断写清操作写1

中断处理流程

流程图如图所示,首先需要开启计数,具体内容在递减计数那一小节,按照设计要求当软件中断来临时,软件的优先级比计数中断优先级高,这种情况下能够改变中断寄存器的值,将之前的1改变为0,直至下一次的单独的计数中断来临将中断寄存器的值重新置为1然后继续保持。

【IC设计项目】基于APB协议的32位递减计数器_第15张图片

你可能感兴趣的:(fpga开发,嵌入式硬件)