首先我要明确,这个RTC是在干什么,通过查阅DS1302芯片手册,我知道了,要想使用这块芯片,我需要用FPGA生成3个信号,然后用DS1302去实现具体功能,需要实现什么功能我先不用关心,现在需要关心的是怎么使用FPGA生成这3条信号
补充: 在读操作的测试文件部分学到了wait、force
的用法
通过观察发现,我需要使用FPGA生成3条信号:复位、串行时钟、输入/输出
注
:当设计很多计数器时,先生成变化快的计数器,即小计数器先生成
SCK时钟信号实际是对系统时钟进行分频,DS1302不需要50M这么快的变化频率,因此,这里需要用一个计数器对SCK的周期进行计数,我假设对系统时钟进行4分频,于是需要设计一个0-3的计数器。计数器要从CE被拉高的瞬间开始计数,通过观察,在cnt_4[0]=1时,SCK进行翻转,至此SCK信号生成完毕
从图上观察知,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
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?