基于MicroBlaze的AXI总线实时时钟IP核设计
得到4.096 MHz的时钟信号。分频核心代码如下:
always @(posedge clk_in)
begin
if(clk_div == 4b0011)
clk_div <= 4b0110;
else if(clk_div == 4b0110)
clk_div <= 4b1100;
else if(clk_div == 4b1100)
clk_div <= 4b1001;
else
clk_div <= 4b0011;
end
寄存器控制模块的主要功能是实现对RTC 模块内部各个寄存器的读写控制并为整个IP 模块提供控制信号。提供上层应用代码与IP核代码之间的接口。在这个模块内部包含对每个内部功能寄存器的读写进行控制的子模块和对各个子模块时钟的总体分布控制[3]。本设计中一共定义了16个寄存器,主要有控制寄存器、状态寄存器以及毫秒的读寄存器、毫秒的写寄存器;秒的读寄存器、秒位写寄存器、分位的读寄存器、分位的写寄存器、小时位的读寄存器、小时位的写寄存器、以及年月日的读与写寄存器等。
设置RTC核心代码如下:
always @(posedge Bus2IP_Clk)
begin
if(Bus2IP_CS[0] && Bus2IP_WrCE[0] && (Bus2IP_Addr[9:2] == SETSECOND_Addr))
SetSecondRegister <= Bus2IP_Data[5:0];
……
end
读RTC核心代码如下:
assign IP2Bus_Data[15:0] = (Bus2IP_CS[0] && Bus2IP_RdCE[0] && (Bus2IP_Addr[9:2] == MSECOND_Addr))?{6h00,GetMsecondRegister}:16hzzzz;
……
RTC的核心逻辑模块主要完成的功能就是精确计时。IP核中通过计数器的控制,毫秒逢1000进位,秒、分和小时逢60进位,月逢12进位。设计时要全面考虑实际情况,注意对闰年以及不同月份天数不一样等情况的处理。RTC计时的核心代码如下:
always @(posedge SETTIME or posedge clk_jg)
begin
if(SETTIME)
SecondRegister <= SetSecondRegister;
else if((SecondRegister_B < 59) && Msecond_Carry)
SecondRegister <= SecondRegister + 1;
else if(Msecond_Carry)
SecondRegister <= 6h00;
else
SecondRegister <= SecondRegister;
end
……
当时钟上升沿到来或者应用程序发出设置时间指令后,进行判断:秒位如果小于59并且毫秒位有进位,此时秒位计数器加1;如果秒位计数器大于或等于59时毫秒位有进位则将秒位清零。其他情况秒位计数器保持原来数值。 其他的分、小时、日月年等计数依次类推。
结语
soft_rtc IP核应用时,首先读装置中的硬件RTC芯片时间,获取当前时间后随后写入设计的soft_rtc IP核,这样是soft_rtc时间与硬件RTC时间保持同步。后面装置运行过程中无论是保护事件上传,还是录波事件上传等涉及到时间的读写操作都由soft_rtc IP核完成。避免了对硬件RTC芯片的反复操作,提高的稳定性,节省了系统资源。设计完成后通过串口打印,或者通过通信帧将时间信息上传到装置界面显示等多方面验证,经过长时间运行,时间精确可靠。此soft_rtc IP核方便移植可以推广到后续的产品中。
MicroBlazeAXI总线实时时钟IP 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)