2019年3月21日
题目:时序电路实验
解释:时序电路的实现相对来讲较为简单,并没有什么特别的东西,唯一需要新学的就是如果用quartus画一张状态机图,并产生相应的vhdl文件。如图所示:
生成的vhdl文件如图所示:
题目:微程序控制器实验1
解释:
首先通过模拟器进行操作,模拟器的文件下载下来后如图所示:
其中HexEdit可执行程序是用来对user_prog文件进行查看后修改,查看之后的文件如图所示:
之后运行simple cpu emulator.exe可执行文件进行运行
start上面是我们的文件,start后开始运行,现在是初始状态,其中pc是计数器,op是指令代码,addr是当前微指令地址,nxt是下一微指令地址,ar是地址寄存器,dr1是暂存器1,dr2是暂存器2,r5是寄存器
初始状态 | |
---|---|
执行pc->ar,pc+1 | |
执行ram->ir进行译码 | |
执行pc->ar,pc+1 | |
执行ram->ar | |
执行ram->r5 | |
执行pc->ar,pc+1 | |
执行ram->ir | |
执行pc->ar,pc+1 | |
执行ram->ar | |
执行ram->dr2 | |
执行r5->dr1 | |
执行alu->r5 | |
执行pc->ar,pc+1 | |
执行ram->ir | |
执行pc->ar,pc+ | |
执行ram->ar | |
执行r5->ram | |
执行pc->ar,pc+1 | |
执行ram->ir | |
执行pc->ar,pc+1 | |
执行ram->ar |
下略
流程图为:
最终结果为:
到此为止结束,结果存放在ram地址为10的位置中
题目:微程序控制器实验2
解释:
下面是rom的excel表格实现:
LIBRARY ieee;
USE ieee.std_logic_1164.all;
ENTITY rom IS
PORT
(
address : IN STD_LOGIC_VECTOR (4 DOWNTO 0);
q : OUT STD_LOGIC_VECTOR (27 DOWNTO 0));
END rom;
ARCHITECTURE SYN OF rom IS
SIGNAL sub_wire0 : STD_LOGIC_VECTOR (27 DOWNTO 0);
BEGIN
sub_wire0<=
"1010111100000000000000000001" WHEN address= "00000" ELSE
"1111111000001000000000000010" WHEN address= "00001" ELSE
"1001111100000100000001001000" WHEN address= "00010" ELSE
"1001111100000100000001100000" WHEN address= "01000" ELSE
"1011111000001000000000010101" WHEN address= "01001" ELSE
"1011111000001000000000010111" WHEN address= "01010" ELSE
"1011111000001000000000011001" WHEN address= "01011" ELSE
"1001101100010000000000011011" WHEN address= "01100" ELSE
"1011111000001000000000011100" WHEN address= "01101" ELSE
"1011111000001000000000000011" WHEN address= "01110" ELSE
"1011111000001000000000011101" WHEN address= "01111" ELSE
"1001111100001000000001010110" WHEN address= "10101" ELSE
"1001111110000000000001000001" WHEN address= "10110" ELSE
"1001111100001000000001011000" WHEN address= "10111" ELSE
"1001101100000000000010000001" WHEN address= "11000" ELSE
"1001111100001000000001011010" WHEN address= "11001" ELSE
"1000111100000000000010000001" WHEN address= "11010" ELSE
"1001110110000000000000000001" WHEN address= "11011" ELSE
"1011111100000000000001000001" WHEN address= "11100" ELSE
"1001111100000100000001000100" WHEN address= "00011" ELSE
"1001111100100000000001000101" WHEN address= "00100" ELSE
"1001101100010000000000000110" WHEN address= "00101" ELSE
"1001110110000000000000000001" WHEN address= "00110" ELSE
"1001111100001000000001011110" WHEN address= "11101" ELSE
"1001111100100000000001011111" WHEN address= "11110" ELSE
"1001101100010000000000000111" WHEN address= "11111" ELSE
"1001110110000000000000000001" WHEN address= "00111" ELSE
"1010111100000000000000010001" WHEN address= "10000" ELSE
"1111111000001000000000010010" WHEN address= "10001" ELSE
"1111111000001000000000010100" WHEN address= "10011" ELSE
"1000111100000000000010010001" WHEN address= "10010" ELSE
"1000111100000000000001010011" ;
q <= sub_wire0(27 DOWNTO 0);
END SYN;
这是rom的vhdl语言
其中address表示的是当前输入的五位地址,而之前的一个长字符串表示的就是二十八位输出信号,其中包括控制信号,下址信号等等,用来控制当前电路和为下一个时钟周期提供指令的地址。
可以看出是对输入的五位控制信号进行一个判断,根据不同的信号组合产生不同的28位信号输出
以下是电路图截图:
其中第一张表示的是ROM的输出以上部分,包含ROM的输出,其中主要有ROM,用来产生28位输出信号,以及三组八位寄存器用来存储当前输出的信号
其中第二张表示的是ROM的输出以下部分,包含ROM的输入,其中主要有一个八位的寄存器,但我们只用了其中的三位用来存储外部给予的ir三位控制信号以及三组二位D触发器,用来存储输入的五位指令信号,还有一个节拍器,通过外部给予时钟信号,产生四个节拍,使整个控制器有序工作。
现以指令add为例进行分析
add是一条双字节指令,在t1时进行给出当前微地址的微指令,然后在t2时给出下址,放入到7474地址寄存器组中,在t3时取出指令,从IR7…5进行输入,将结果输入到74244寄存器中进行存储,在t4时通过给rom进行译码操作给出相应的下址重新返回给7474地址寄存器组。具体操作如下:
比方说add指令的前地址为0FH
进入之后先执行pc->ar和pc+1操作,用来从RAM中取出完整的ADD指令,此时的下址为03H
然后执行RAM->AR操作,将RAM中的数据取出放入AR中,此时的下址为04H
然后再执行RAM->DR2操作,将RAM中的数据取出放入DR2暂存器,用来进行计算,此时的下址为05H
再进行R5->DR1操作,将R5寄存器中的数据取出放入DR1暂存器,用来后续进行计算,此时的下址为06H
再进行ALU->R5操作,将DR1和DR2两个暂存器中的数据进行相加操作后将结果放入R5寄存器中,此时的下址为01H
此时再进行跳转,整个指令执行结束。
以下为仿真文件以及仿真结果:
以下为下载结果:
来源:CSDN
作者:HNU君陌
链接:https://blog.csdn.net/qq_40851744/article/details/104820716