计算机组成原理P0-Q2——实现GRF
本系列所有博客,知识讲解、习题以及答案均由北航计算机学院计算机组成原理课程组创作,下面的感悟&解析部分由笔者创作,如有侵权联系删除。
题目描述:
使用logisim搭建一个GRF。
GRF中包含32个32位寄存器,分别对应0~31号寄存器,其中0号寄存器读取的结果恒为0。具体模块端口定义如下:
模块功能定义如下:
- 必须严格按照模块的端口定义
- 0号寄存器读出的数据在任何时刻都为0
- 请使用寄存器部件来实现GRF中的32个寄存器
- 文件内模块名: grf
- 测试电路:(grf为你需要搭建的电路)
- 注意:请保证模块的appearance与下图完全一致,否则有可能造成评测错误
具体实现
注:由于32位寄存器引脚太多,最后选择用主模块装下所有细分模块而不再单独提供输入输出接口。
输入部分:
由于见识了学长极其美观的模块化布局所以现在遇事不决先用tunnel(狗头。同时也要注意三个输入信号朝向是south,这样才能保证与题目要求的模块一致。
坑:注意此题中已经提供时钟信号,故自己的模块中应该给定输入而不是内置时钟!
寄存器模块:
存放32个寄存器,因为只有5位输入需要32位输出,所以需要通过一个译码器转换信号/或者直接把选择信号连接到多路选择器的选择端(因为发现多路选择器的信号选择端最多5位所以我怀疑应该直接接上去)。注意:0号寄存器读出的数据在任何时刻都为0,故考虑设置0号寄存器的enable端为0/reset端为1.
附:寄存器引脚图示:
寄存器模块图示:
输入端的tunnel统一命名为In,表示Input-n;输出端的tunnel统一命名为n(n从0取到31)。这个线连接的时候真的就。。很费眼睛。。
复位模块:
reset信号用tunnel保存并接在每个寄存器的异步清零口,当时钟沿到来且reset信号有效时,每个寄存器的值同时变为0。
数据读模块:
- 直接把对应的输入数据写入到对应寄存器中。
- 输入端:输入数据+地址
- 输出端:无
- 由于不需要考虑开支,故直接用两个MUX读数据。
数据写模块:
WE信号用tunnel接到每个寄存器(除0号)的enable端。
时钟沿到来时,先判断WE信号,若有效,将数据读入到对应寄存器,无输出。
注意!!!这里有一个坑点就是DMX的three state状态需要选上!!!
logisim官方文档中是这样说的:Three-state? Specifies whether the unselected outputs should be floating (Yes) or zero (No).有道翻译是指定未选择的输出应该是浮点的(Yes)还是零(No)。换句人话就是,如果不选择yes,这次更改的a寄存器,下一次时钟沿上升更改b寄存器时,a寄存器中的值会被清零。(wa了4次都是因为这个原因我哭)
综上。
坑点小结
- 此题中已经提供时钟信号,故自己的模块中应该给定输入而不是内置时钟!
- 最后自己搭建电路的appearance应该和题目给的相同(三个输入引脚朝向south)。
- 0号寄存器读出的数据在任何时刻都为0,故考虑设置0号寄存器的enable端为0/reset端为1。
- DMX的three state状态需要选上以保证每次对一个寄存器的输入不会影响到其他寄存器。