您当前的位置: 首页 > 

刘颜儿

暂无认证

  • 3浏览

    0关注

    99博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

FPGA:时钟模块设计-RTC实时时钟芯片DS1302

刘颜儿 发布时间:2022-06-27 10:16:22 ,浏览量:3

前言

首先我要明确,这个RTC是在干什么,通过查阅DS1302芯片手册,我知道了,要想使用这块芯片,我需要用FPGA生成3个信号,然后用DS1302去实现具体功能,需要实现什么功能我先不用关心,现在需要关心的是怎么使用FPGA生成这3条信号

补充: 在读操作的测试文件部分学到了wait、force的用法

正文 一、写操作

在这里插入图片描述 通过观察发现,我需要使用FPGA生成3条信号:复位、串行时钟、输入/输出 :当设计很多计数器时,先生成变化快的计数器,即小计数器先生成

1.1 SCK信号

SCK时钟信号实际是对系统时钟进行分频,DS1302不需要50M这么快的变化频率,因此,这里需要用一个计数器对SCK的周期进行计数,我假设对系统时钟进行4分频,于是需要设计一个0-3的计数器。计数器要从CE被拉高的瞬间开始计数,通过观察,在cnt_4[0]=1时,SCK进行翻转,至此SCK信号生成完毕 在这里插入图片描述

1.2 I/O信号

在这里插入图片描述 从图上观察知,IO信号在CE被拉高瞬间就开始传输数据了,并且在SCK的下降沿更新数据,此时我们已经有了一个cnt_4计数器,需要借助这个计数器生成一个cnt_16计数器,用来记录已经传输的数据位数,由于IO信号的数据是在SCK的下降沿进行更新的,于是就在SCK下降沿对cnt_16进行+1操作,即当cnt_4=3时,对cnt_16+1,表示传完一个数据,但这个cnt_16只有一个功能:用来记录传输数据是否传完,如果16位传完了,状态就跳转到IDLE,就停止传输数据,对于IO信号本身的采样和更新,到目前为止还没有考虑

接下来就考虑如何得到IO信号:

1.由于在写操作中,两个字节都是进行写操作,不涉及IO转换,于是将2个字节看成一个状态:DRR,

2.设计状态机:

当外部有按键输入,就开始传输数据;当数据位数计数器cnt_16=15,且时钟计数器cnt_4=3就代表16位数据传输完成,可以进入空闲状态了 在这里插入图片描述 3.接下来就是IO信号的设计难点了,图中显示,在CE拉高瞬间数据就已经开始传输了

那这个时候有两种思路:

  • 使用CE上升沿检测,当检测到CE上升沿,立马更新IO信号
  • 使用状态机,当前状态=IDLE并且下一个状态=DRR

此处选用状态机方法: 在这里插入图片描述 上面使用状态机,只是判断IO信号第一个数据的传输,但是后面的数据位就没有状态机上面的判断条件

于是有了下面这个写法,

注:这个写法是一个大佬告诉我的,不得不说,真的很巧妙

always @(posedge clk or negedge rst_n)begin
if(rst_n == 1'b0)
    data             
关注
打赏
1659364566
查看更多评论
0.0480s