在进行复杂模型机设计时,我有一个一直困扰我的问题,那就是273这个寄存器(乃至其他所有寄存器)的工作原理是什么?他们是怎么寄存的?如果不弄清楚的话,数据寄存器的读写会发生错误,并且我会对数据的产生流程模棱两可,即使编译结果也感觉是碰运气的。
于是我自己在quartusII上导入273寄存器进行波形仿真,根据其引脚特性初始化数据,输入的数据如下:
下面解释一下各个引脚的功能:
clk——输入脉冲,高电平时将D[7..0]数据输入273寄存器;
D[7..0]——8位数据输入端;
Q[7..0]——8位数据输出端。
接着进行波形仿真,结果如下:
我们可以从图中数据得出以下几个结论:
1、clk在上升沿时数据输入到寄存器中,接着寄存器就开始从Q[7..0]输出;
2、寄存器被输入一次数据后会一直从输出端输出,这不像我想的那样输入数据后保存着,等着clk给一个高脉冲时再输出;
3、在第n(n>1)高脉冲时输入端的数据会再输入到寄存器中,也就是覆盖掉原先的内容,接着寄存器开始不断输出新的内容,直到下一次clk高脉冲来临。
由上面的结论,我们可以知道273乃至其他寄存器的工作原理。但是我又有一个疑问:模型机的bus总线一个时间段最多只能通过一个寄存器的数据,如果所有的寄存器都这样不断输出到数据总线中,那总线还怎么工作?
我接着查看了一下模型机的原理图,发现寄存器不会直接连到bus总线上,他们需要经过选择器BUSMUX的处理,在微指令中会有一个总线控制信号来控制总线选择哪个寄存器的数据放到bus总线上。总线控制流程如下图所示:
图一 微控制器(产生微指令M[24..1])
图二 译码器(按照规则将相应的微指令字段转成模型机部件的控制信号,这里取M[12..10]进行译码)
图三 编码器(将总线控制字段的译码(上图内容)转成SEL[2..0]来控制总线输出)
图四 总线选择模块(通过SEL[2..0]来选择d0-d7的寄存器数据输出到bug总线上
读者可以从图二ALU_B这个信号往下推模型机总线控制的流程。
最终,通过以上的推导,我们就可以很清晰地了解模型机寄存器的工作原理了。