用verilog语言怎么编写一个8253的定时计数器
8254的Verilog实现和FPGA验证
8254是一种广泛用于处理器系统的通用可编程定时/计数器,它通常作为一个子模块,用于产生激励波形或定时中断。若直接用标准8254芯片来搭建系统,则至少存在两个弊端:首先,标准8254最大工作频率为10MHz,如果系统频率高于此,则无法正常工作;其次会使PCB板面积、功耗以及信号干扰增大。
FPGA验证作为一种ASIC原型验证,可以缩短产品的开发周期。但在工程实践中,通常需要整个系统设计编码完毕才能做FPGA验证,而对单个模块,即使它先被设计好也不能进行FPGA验证,因为其他给它施加激励的部件还没完成。若等到系统FPGA调试时才发现单模块的设计错误,无形中延长了开发周期。
基于上述两点,本文首先用verilog代码实现了8254的IP软核,然后通过一种rom施加激励法克服了上述单模块FPGA验证的问题,结合本文的8254定时器,给出了详细的验证步骤。
1、8254基本功能和结构
8254的主要特点有:
●三个独立计数通道
●每个计数器都可以有两种计数方式
●每个通道有6种工作方式,可编程设定
●支持三种读命令:简单读、锁存读、读回读
其管脚和内部结构图如下:
图1 8254结构图
2、8254的设计和实现
2.1 8254的模块划分
观察8254的结构图,它由六块组成,分别是数据总线缓冲器、读写逻辑、控制字寄存器、计数器0、1和2。这样便可以把系统分成六个模块,但有两个模块比较特殊:首先,8254为了节省管脚,对8位数据端口进行了复用,所以数据总线缓冲器模块涉及到双向信号,需在顶层处理;其次,三个定时/计数器行为完全相同,所以只要编写一个,在上一层实例化三个便可。根据自顶向下的设计思想,系统可划分成读写译码控制模块、控制寄存器译码模块以及定时/计数器0、1、2模块五个模块,如图2所示。
图2 8254模块划分
2.2 8254的Verilog实现
根据以上的划分,读写定时器译码模块和控制寄存器译码模块很容易设计编码,分别根据表1和图3译出三个计数器读写使能、锁存命令和控制寄存器便可,都是组合逻辑。
表1 读写定时器操作译码
图3 控制字译码
相对复杂的是定时器模块,它涉及到8254最核心的功能。分析8254的工作过程:首先写控制字控制某个计数通道的工作方式,接着写计数初值,然后开始计数,这时如果需要读取某个计数通道的计数值或状态,则发读回或锁存命令,然后读相应锁存器即可。据此工作过程,可以知道通道内的寄存器有:初始值寄存器,计数器寄存器和计数值锁存寄存器,每个都是16位,再加上读写控制逻辑,一个通道的定时/计数器的RTL原理图如图3所示。
图4 定时/计数器RTL原理图
3、8254的验证
本设计采用了两种方法来验证,一种是传统的编写testbench文件,通过软件仿真来验证;另外一种是作者提出的外挂rom模型,在FPGA上验证的方法。下面分别详细介绍。
3.1 基于testbench的仿真验证
8254有三个计数通道、六种工作方式,每次工作又可以有不同的流程,如果简单地顺序测试这些组合,则效率低下,为了减少代码的重复编写,提高代码覆盖率,本文把对一个定时/计数器的一种工作过程的激励封装成一个任务test_timer,这样只要改变这些任务的参数就可以实现多种情况测试。如testbench中的任务调用test_timer(2’b00,3’b010,1’b0,16’h0012),表示对定时器0的工作方式2,二进制计数,初值为12的工作过程方式测试。这种方式提高了代码的可复用性和可读性。图5为此任务调用的仿真执行波形。
图5 仿真波形
3.2 外挂rom模型的FPGA验证
上面的方法只能用工具进行仿真,在实际中由于建立保持时间不满足或者竞争冒险和时钟偏移等因素可能会导致芯片性能低下或者无法工作,为了减少流片的风险、缩短开发周期,常常需要进行FPGA验证。
一般如果把一个模块植入一个系统可以很方便地对其验证,但是对于单模块,缺少外部激励,而testbench又不可综合。基于此问题,作者提出了一种外挂ROM激励的单模块FPGA验证方法。其思想是把测试激励记录在一个只读存储器中,然后只要在FPGA工程里生成一个ROM的IP 核,编写顶层文件,再将该ROM模型、被测模块实例化,再加上观测模块便可以进行验证。对于该8254模型,作者使用Altera公司的EP1S80开发板验证,其具体做法流程如下。
首先利用上面的仿真工程,在testbench文件里加入$fdisplay调用,把激励信号输出到一个rom.txt文件里,然后在quartus II里面新建一个只读存储器初始化文件rom.mif,把rom.txt文件复制其中保存便可。然后使用quartus II里的Mega Wizard生成一个ROM模块rom.v,初始化时用上一步的rom.mif。
为了能够观测8254是否运行正确,需要把其计数值输出到led上,EP1S80有两个数码管可用,所以需要添加一个显示模块led.v。 在以上基础上构造测试的顶层文件top.v,其结构如图6所示。
图6 Quartus 工程结构
最后在Quartus II中建立工程,加入上述设计文件,综合、布局布线、观察现象。
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
与电子爱好者谈读图二被打赏50分 | |
【FRDM-MCXN947评测】Core1适配运行FreeRtos被打赏50分 | |
【FRDM-MCXN947评测】双核调试被打赏50分 | |
【CPKCORRA8D1B评测】---移植CoreMark被打赏50分 | |
【CPKCORRA8D1B评测】---打开硬件定时器被打赏50分 | |
【FRDM-MCXA156评测】4、CAN loopback模式测试被打赏50分 | |
【CPKcorRA8D1评测】--搭建初始环境被打赏50分 | |
【FRDM-MCXA156评测】3、使用FlexIO模拟UART被打赏50分 | |
【FRDM-MCXA156评测】2、rt-thread MCXA156 BSP制作被打赏50分 | |
【FRDM-MCXN947评测】核间通信MUTEX被打赏50分 |