




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
/view/4d8203da6f1aff00bed51e94.html
CISC模型微处理器设计(VHDL实现)\o"收藏到我的网摘中,并分享给我的朋友"收藏转载自马如林的博客--I'mlovin'IT(1)实验题目设计一台CISC模型机,要求具有以下验证程序所要求的功能:输入包含10个整数(无符号数)的数组M,按从小到大的顺序输出这10个数。(A类)(2)嵌入式CISC模型机数据通路框图图1模型机数据通路框图(3)操作控制器的逻辑框图图2操作控制器逻辑框图(4)模型机的指令系统和指令格式1指令系统本系统设计了10条指令:IN1(输入到目的寄存器),MOV(将一个数送入目的寄存器),MOV1(将源寄存器中的数据存储到目的寄存器所指向的地址单元),MOV2(将源寄存器所指向的地址单元中的数送入目的寄存器),OUT1(输出),CMP(将目的寄存器和源寄存器所指向的地址单元中的数据进行比较),DEC(将目的寄存器中的数据自减一),INC(将目的寄存器中的数据自加一),JMP(无条件跳转),JB(小于跳转),下表列出了每条指令的格式、汇编符号和指令功能。
助记符号指令格式功
能IN1
Rd1
0
0
0
×
×Rd(SW)->RdMOV
im
Rd1
0
0
1
×
×Rdim(im)->RdMOV1
Rs
[Rd]1
0
1
0
Rs
Rd(Rs)->[Rd]MOV2
[Rs]
Rd1
0
1
1
Rs
Rd([Rs])->RdOUT1
Rd
1
1
0
0
Rs
×
×(Rs)->LEDCMP
Rs
Rd1
1
0
1
Rs
Rd(Rs)-(Rd),锁存CY和ZIDEC
Rd
1
1
1
0
×
×Rd(Rd)-1->RdINC
Rd
1
1
1
1
×
×Rd(Rd)+1->RdJMP
addr
0
1
1
0××××addraddr->PCJB
addr
0
1
1
1
××××addr若小于,则addr->PC表1指令系统格式表2指令格式下面时系统中采用的10条指令及其格式,其中Rs为源寄存器,Rd为目的寄存器,im为立即数,addr为形式地址。(1)输入指令输入(IN1)指令采用单字节指令,其格式如下:7
6
5
43
21
0操作码×
×Rs(2)MOV指令MOV指令采用双字节指令,其格式如下:7
6
5
43
21
0操作码×
×Rdim(3)MOV1指令
7
6
5
43
21
0操作码RsRd“Rs”为源寄存器,存放的是源操作数
“Rd”为目的寄存器,存放的是目的操作数所在的地址(4)MOV2指令
7
6
5
43
21
0操作码RsRd“Rs”为源寄存器,存放的是源操作数所在的地址
“Rd”为目的寄存器,存放的是目的操作数(5)输出(OUT1)指令7
6
5
43
21
0操作码Rs×
×(6)比较(CMP)指令7
6
5
43
21
0操作码RsRd“Rs”为源寄存器,存放的是源操作数
“Rd”为目的寄存器,存放的是目的操作数(7)自增一(INC)指令7
6
5
43
21
0操作码×
×Rd(8)自减一(DEC)指令7
6
5
43
21
0操作码×
×Rd(9)条件转移转移指令(JB)指令7
6
5
43
21
0操作码×
×
×
×addr“addr”中的值就是要转移的地址值。(10)无条件转移指令(JMP)指令7
6
5
43
21
0操作码×
×
×
×addr“addr”中的值就是要转移的地址值。其中对Rs和Rd的规定如下:Rs
Rd选定的寄存器0
0R00
1R11
0R21
1R33数据格式模型机规定数据的为无符号整数,且字长为8位,其格式如下:7
6
5
4
3
2
1
0数据(5)微程序流程图机器指令的CPU操作流程图是根据模型机的硬件设计、指令系统、所有指令的解释过程和控制信号的时序设计出来的,如图2所示。图中每一个方框执行的时间为一个时钟周期(包含T1-T4共4个节拍脉冲周期),对应一条微指令。框中上面的八进制数表示的是当前微指令在控制存储器中的微地址,框中下面的八进制表示的是当前微指令的后继微地址。图中的菱形框从属于它上面的方框。图2微程序流程图(6)微指令代码表1指令格式本模型机使用的微指令采用全水平型微指令,字长为29位,其中微命令字段为21位,P字段为2位,后继微地址为6位,其格式如图3所示:图3微指令格式2指令代码表表2微指令代码(7)顶层电路图1模型机的顶层电路图图4顶层电路图2模型机微地址寄存器单元aa的内部结构图5地址寄存器单元aa的电路图3模型机微程序控制器的内部结构图6微程序控制器的电路图(8)汇编语言源程序冒泡排序:两两比较待排序记录的关键字,发现两个记录的次序相反时即进行交换,直到没有反序的记录为止。算法思想:1
输入10个数
2
用R0存放最外层的循环次数,R1存放地址,R2和R3存放比较的两个数,从对应的R1的地址读入.R3存放大的数.如果有更大的数,则交换.最后下沉的就为一个最大的数.然后自减R0.进入下次循环.到循环结束.
3
输出结果/**冒泡程序:每次将最大的数下沉。*输入10个数,从小到大输出。*作者:longronglin*时间:2006-5-10
*/
//*输入10个数*/Mov
0AH
R0
//设置循环值10Mov
00H
R1
//设置RAM的初始地址00L1:
In1
R2
//从开关输入任意一个整数到R2Mov1
R2
[R1]
//将R2存入地址为R1的RAM单元中
Inc
R1
//自增R1Cmp
R1,R0
//比较R1,R0的大小,R1<R0跳转L1
JB
L1//*冒泡排序*/Mov
0AH
R0
//设置外循环值为10Mov
00H
R1
//设置RAM的初始地址00L2:
Mov2[R1]
R2
//取地址为R1的RAM内容到R2Inc
R1
//自增R1Cmp
R0
R1
//比较R0,R1的大小,R0<R1跳转L4JB
L4
Mov2
[R1]
R3
//取地址为R1的RAM内容到R3Cmp
R3
R2
//比较R3,R2的大小,R3<R2跳转L3JB
L3JMPL2
//无条件跳转L2//*交换两个数*/L3:
Mov1
R2
[R1]
//将R2存入地址为R1的RAM单元中Dec
R1
//自减R1Mov1
R3
[R1]
//将R3存入地址为R1的RAM单元中Inc
R1
//自增R1JMP
L2
//无条件跳转L2L4:
Dec
R0
//循环值自减1Mov
00H
R1
//设置R1的值为0Cmp
R1R0
//比较R1和R0的大小,R1<R0跳转L2JB
L2//*输出*/Mov0AH
R0
//设置循环值10Mov00H
R1
//设置RAM的初始地址00L5:
Mov2[R1]
R2
//取地址为R1的RAM内容到R2
Inc
R1
//自增R1Out1R2
//输出R2到LEDCmpR1R0
/比较R1和R0的大小,R1<R0跳转L5JBL5L6:
Out1R2
//输出R2到LED
JMPL6
//持续输出(9)机器语言源程序根据指令格式将汇编语言源程序手工汇编成机器代码如下表:
助记符地址(十六进制)机器代码功能
MOV
0AH
R0000110010000000010100AH->R0
MOV
00H
R10203100100010000000000H->R1L1:IN1
R20410000010(SW)->R2
MOV1
R2
[R1]0510101001(R2)->[R1]R2的值存入地址为R1的存储单元中
INC
R10611110001(R1)+1->R1
CMP
R1
RO0711010100([R1])-([R0]),锁存FC和FZ
JB
L108090111000000000100小于,则跳转到L1处执行
MOV
09H
R00A0B100100000000100109H->R0
外循环次数
MOV
00H
R10C0D100100010000000000H->R1L2:MOV2
[R1]R20E10110110([R1])->R2从地址为R1的存储单元里取数到R2
INC
R10F11110001(R1)+1->R1CMP
R0
R11011010001([R0])-([R1]),锁存FC和FZ
JB
L411120111000000011111小于,则跳转到L4处执行
MOV2
[R1]R31310110111([R1])->R3从地址为R1的存储单元里取数到R3CMP
R3
R21411011110([R3])-([R2]),锁存FC和FZ
JB
L315160111000000011001小于,则跳转到L3处执行JMP
L217180110000000001110跳转到L2处执行L3:MOV1
R2
[R1]1910101001(R2)->[R1]R2的值存入地址为R1的存储单元中
DEC
R11A11100001(R1)-1->R1MOV1
R3
[R1]1B10101101(R3)->[R1]R3的值存入地址为R1的存储单元中
INC
R11C11110001(R1)+1->R1JMP
L21D1E0110000000001110跳转到L2处执行L4:DEC
R01F11100000(R0)-1->R0
MOV
00H
R12021100100010000000000H->R1
CMP
R1
R02211010100([R1])-([R0]),锁存FC和FZJB
L223240111000000001110小于,则跳转到L2处执行
MOV
0AH
R0
252610010000000010100AH->R1
MOV
00H
R12728100100010000000000H->R1L5:MOV2[R1]
R22910110110([R1])->R2从地址为R1的存储单元里取数到R2
INC
R12A11110001(R1)+1->R1OUT1
R22B11001000(R2)->LEDCMP
R1
R02C11010100([R1])-([R0]),锁存FC和FZ
JB
L52D2E0111000000101001小于,则跳转到L5处执行L6:OUT1
R2
2F11001000(R2)->LEDJMP
L630310110000000101111跳转到L6处执行表3将汇编语言手工解释的机器代码(10)功能仿真波形图及结果分析以下仿真波形图的测试输入为(34,15,25,92,17,06,83,68,72,87)。1程序开始及输入10个数据.图7中的R0控制循环,R1与用自增,R2用于保存输入的数并送到与R1对应地址的RAM中.图7程序开始及输入2数的比较。如图8,R0存放外循环的比较次数,R1存放内循环的指针。R2存放每次比较的大数,R3存放与R2比较的下一个数。如果R3>R2则跳转到交换,否则顺序执行。图8比较3交换两个数。如图9,由于R3种的数25大于R2中的数15,则进行交换。使R2每次存入最大的值后,R3继续读入R1地址的值继续进行比较。图9交换两个数4结果输出(从小到大),图10中的R0控制循环,R1与用自增,R2用于输出寄存器.结果从QD输出。图中刚好从最小的数06开始输出。图10结果输出其他输入测试1有两个相同的数。输入为(34,15,25,92,83,06,83,68,72,87)输出正确2有零的一组数。输入为(34,00,25,92,83,06,83,68,72,87)输出正确
(11)芯片的引脚分配及操作演示结果分析1引脚分配(12)故障现象和故障分析①
数据和地址发送不正确:问题是微指令写错了。②
写RAM时不能正确写入,在不需要的时候写入了,反而在需要写的时候没有正确输入:问题是控制信号按照书上的写,其实不符合实际情况。才开始以为也是微指令的问题,通过调试,可以看到问题是边沿信号不对。在去掉边沿信号后,变得正常。③
仿真时发现数据出错:汇编语言的问题,发现居然有0BH出现。在设计时就知道是不应该出现的。对着指令执行流程图可以发现是设定的外循环错误。只要9次就可以。到10次就会边沿溢出。而程序却要去读0AH中的数而0AH中并没有数,所以出错,程序就无法继续。④
警告的去除:原来的程序有很多警告,在多添加控制信号后发现可以消除警告。⑤
仿真时到1ms程序停止的问题:由于在开始测试时,为了运行速度,设定的ENDTIME为1ms所致。到1ms后就没有时钟信号了,仿真程序停止运行。而我的程序1ms内并没有运行结束。所以需要延长,而在延长时间后并没有修改时钟信号。同时修改时钟信号后程序正常运行。⑥
在最后验收前突然发现两个数不交换了(原来是正常的):对照波形图,发现跳转时地址出错。查看ROM里的源程序,发现跳转代码少了一句(WHEN"00011000"=>ROMOUT<="00001110";)。修改后正确。可能在制作Word文档拷贝源程序或添加注释时不小心删除了。⑦
验收时添加一条输出结果,不需要重新编译,只需要重新仿真。当时说重新编译是口误,其实在我的操作过程就是正确的。并没有编译也就是重新仿真。编译只有在改动源代码的时候才需要。(13)软件清单1ALU子模块LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_ARITH.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYALUISPORT(
AC,DR:INSTD_LOGIC_VECTOR(7DOWNTO0);
S1,S0:INSTD_LOGIC;
BCDOUT:OUTSTD_LOGIC_VECTOR(7DOWNTO0);
CY,ZI:
OUTSTD_LOGIC
);ENDALU;
ARCHITECTUREAOFALUISSIGNALAA,BB,TEMP:STD_LOGIC_VECTOR(8DOWNTO0);BEGIN
PROCESS(S1,S0)
BEGIN
IF(S1='0'ANDS0='0')THEN
BCDOUT<=AC+DR;
AA<='0'&AC;
BB<='0'&DR;
TEMP<=AA+BB;
CY<=TEMP(8);
IF(TEMP="100000000")THEN
ZI<='1';
ELSE
ZI<='0';
ENDIF;
ELSIF(S1='0'ANDS0='1')THEN
BCDOUT<=AC-DR;
AA<='0'&AC;
BB<='0'&DR;
TEMP<=AA-BB;
CY<=TEMP(8);
IF(TEMP="000000000")THEN
ZI<='1';
ELSE
ZI<='0';
ENDIF;
ELSIF(S1='1'ANDS0='0')THEN
AA<='0'&AC;
TEMP<=AA+1;
BCDOUT<=TEMP(7DOWNTO0);
CY<=TEMP(8);
IF(TEMP="100000000")THEN
ZI<='1';
ELSE
ZI<='0';
ENDIF;
ELSIF(S1='1'ANDS0='1')THEN
AA<='0'&AC;
TEMP<=AA-1;
BCDOUT<=TEMP(7DOWNTO0);
CY<=TEMP(8);
IF(TEMP="000000000")THEN
ZI<='1';
ELSE
ZI<='0';
ENDIF;
ELSE
BCDOUT<="00000000";
CY<='0';
ZI<='0';
ENDIF;
ENDPROCESS;ENDA;2状态条件寄存器子模块LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;
ENTITYLS74ISPORT(
LDFR:INSTD_LOGIC;
CY,ZI:INSTD_LOGIC;
FC,FZ:OUTSTD_LOGIC
);ENDLS74;
ARCHITECTUREAOFLS74ISBEGIN
PROCESS(LDFR)
BEGIN
IF(LDFR'EVENTANDLDFR='1')THEN
FC<=CY;
FZ<=ZI;
ENDIF;
ENDPROCESS;ENDA;3暂存器、通用寄存器、地址寄存器、指令寄存器子模块LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;
ENTITYLS273ISPORT(
D_IN:INSTD_LOGIC_VECTOR(7DOWNTO0);
CLK:INSTD_LOGIC;
D_OUT:OUTSTD_LOGIC_VECTOR(7DOWNTO0)
);ENDLS273;
ARCHITECTUREAOFLS273ISBEGIN
PROCESS(CLK)
BEGIN
IF(CLK'EVENTANDCLK='1')THEN
D_OUT<=D_IN;
ENDIF;
ENDPROCESS;ENDA;4时序产生器子模块LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_ARITH.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYCOUNTERISPORT(
Q,CLR:INSTD_LOGIC;
T2,T3,T4:OUTSTD_LOGIC
);ENDCOUNTER;
ARCHITECTUREAOFCOUNTERISSIGNALX:STD_LOGIC_VECTOR(1DOWNTO0);BEGIN
PROCESS(Q,CLR)
BEGIN
IF(CLR='0')THEN
T2<='0';
T3<='0';
T4<='0';
X<="00";
ELSIF(Q'EVENTANDQ='1')THEN
X<=X+1;
T2<=(NOTX(1))ANDX(0);
T3<=X(1)AND(NOTX(0));
T4<=X(1)ANDX(0);
ENDIF;
ENDPROCESS;ENDA;5程序计数器子模块LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_ARITH.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYPCISPORT(
LOAD,LDPC,CLR:INSTD_LOGIC;
BUS_IN:INSTD_LOGIC_VECTOR(7DOWNTO0);
PCOUT:OUTSTD_LOGIC_VECTOR(7DOWNTO0)
);ENDPC;
ARCHITECTUREAOFPCISSIGNALQOUT:STD_LOGIC_VECTOR(7DOWNTO0);BEGIN
PROCESS(LDPC,CLR,LOAD)
BEGIN
IF(CLR='0')
THEN
QOUT<="00000000";
ELSIF(LDPC'EVENTANDLDPC='1')THEN
IF(LOAD='0')THEN
QOUT<=BUS_IN;
--BUS->PC
ELSE
QOUT<=QOUT+1;
--PC+1
ENDIF;
ENDIF;
ENDPROCESS;
PCOUT<=QOUT;ENDA;6选择从PC或BUS中读入数据到AR的选择器子模块LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;
ENTITYMUX2_1ISPORT(
I_D:INSTD_LOGIC;
PC_IN,BUS_IN:INSTD_LOGIC_VECTOR(7DOWNTO0);
MUX2_1OUT:OUTSTD_LOGIC_VECTOR(7DOWNTO0)
);ENDMUX2_1;
ARCHITECTUREAOFMUX2_1ISBEGIN
PROCESS(I_D,PC_IN,BUS_IN)
BEGIN
IF(I_D='0')THEN
MUX2_1OUT<=BUS_IN;
ELSE
MUX2_1OUT<=PC_IN;
ENDIF;
ENDPROCESS;ENDA;7ROM子模块LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_ARITH.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYROM16ISPORT(
ROMOUT:OUTSTD_LOGIC_VECTOR(7DOWNTO0);
ADDR:INSTD_LOGIC_VECTOR(7DOWNTO0);
RE,CS_I:INSTD_LOGIC);ENDROM16;ARCHITECTUREAOFROM16ISBEGIN
PROCESS(RE,CS_I)
BEGIN
IF(RE='0'ANDCS_I='0')THEN
CASEADDRIS
WHEN"00000000"=>ROMOUT<="10010000";
--MOV
0AH
R0
WHEN"00000001"=>ROMOUT<="00001010";
WHEN"00000010"=>ROMOUT<="10010001";
--MOV
00H
R1
WHEN"00000011"=>ROMOUT<="00000000";
WHEN"00000100"=>ROMOUT<="10000010";
--L1:
IN1
R2
WHEN"00000101"=>ROMOUT<="10101001";
--MOV1
R2
[R1]
WHEN"00000110"=>ROMOUT<="11110001";
--INC
R1
WHEN"00000111"=>ROMOUT<="11010100";
--CMP
R1
RO
WHEN"00001000"=>ROMOUT<="01110000";
--JB
L1
WHEN"00001001"=>ROMOUT<="00000100";
WHEN"00001010"=>ROMOUT<="10010000";
--MOV
09H
R0
WHEN"00001011"=>ROMOUT<="00001001";
WHEN"00001100"=>ROMOUT<="10010001";
--MOV
00H
R1
WHEN"00001101"=>ROMOUT<="00000000";
WHEN"00001110"=>ROMOUT<="10110110";
--L2:
MOV2
[R1]
R2
WHEN"00001111"=>ROMOUT<="11110001";
--INC
R1
WHEN"00010000"=>ROMOUT<="11010001";
--CMP
R0
R1
WHEN"00010001"=>ROMOUT<="01110000";
--JB
L4
WHEN"00010010"=>ROMOUT<="00011111";
WHEN"00010011"=>ROMOUT<="10110111";
--MOV2
[R1]
R3
WHEN"00010100"=>ROMOUT<="11011110";
--CMP
R3
R2
WHEN"00010101"=>ROMOUT<="01110000";
--JB
L3
WHEN"00010110"=>ROMOUT<="00011001";
WHEN"00010111"=>ROMOUT<="01100000";
--JMP
L2
WHEN"00011000"=>ROMOUT<="00001110";
WHEN"00011001"=>ROMOUT<="10101001";
--L3:
MOV1
R2
[R1]
WHEN"00011010"=>ROMOUT<="11100001";
--DEC
R1
WHEN"00011011"=>ROMOUT<="10101101";
--MOV1
R3
[R1]
WHEN"00011100"=>ROMOUT<="11110001";
--INC
R1
WHEN"00011101"=>ROMOUT<="01100000";
--JMP
L2
WHEN"00011110"=>ROMOUT<="00001110";
WHEN"00011111"=>ROMOUT<="11100000";
--L4:DEC
R0
WHEN"00100000"=>ROMOUT<="10010001";
--MOV
00H
R1
WHEN"00100001"=>ROMOUT<="00000000";
WHEN"00100010"=>ROMOUT<="11010100";
--CMP
R1
R0
WHEN"00100011"=>ROMOUT<="01110000";
--JB
L2
WHEN"00100100"=>ROMOUT<="00001110";
WHEN"00100101"=>ROMOUT<="10010000";
--MOV
0AH
R0
WHEN"00100110"=>ROMOUT<="00001010";
WHEN"00100111"=>ROMOUT<="10010001";
--MOV
00H
R1
WHEN"00101000"=>ROMOUT<="00000000";
WHEN"00101001"=>ROMOUT<="10110110";
--L5:
MOV2
[R1]
R2
WHEN"00101010"=>ROMOUT<="11110001";
--INC
R1
WHEN"00101011"=>ROMOUT<="11001000";
--OUT1
R2
WHEN"00101100"=>ROMOUT<="11010100";
--CMP
R1
R0
WHEN"00101101"=>ROMOUT<="01110000";
--JB
L5
WHEN"00101110"=>ROMOUT<="00101001";
WHEN"00101111"=>ROMOUT<="11001000";
--L6:
OUT1
R2
WHEN"00110000"=>ROMOUT<="01100000";
--JMP
L6
WHEN"00110001"=>ROMOUT<="00101111";
WHENOTHERS
=>NULL;
ENDCASE;
ENDIF;
ENDPROCESS;ENDA;8RAM子模块LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_ARITH.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYRAMIS
PORT(
WR,CS:INSTD_LOGIC;
DIN:INSTD_LOGIC_VECTOR(7DOWNTO0);
DOUT:OUTSTD_LOGIC_VECTOR(7DOWNTO0);
ADDR:INSTD_LOGIC_VECTOR(7DOWNTO0)
);ENDRAM;
ARCHITECTUREAOFRAMISTYPEMEMORYISARRAY(0TO31)OFSTD_LOGIC_VECTOR(7DOWNTO0);BEGIN
PROCESS(CS,WR)
VARIABLEMEM:MEMORY;
BEGIN
IF(CS='0')THEN
IF(WR='0')THEN
MEM(CONV_INTEGER(ADDR(4DOWNTO0))):=DIN;
ELSIF(WR='1')THEN
DOUT<=MEM(CONV_INTEGER(ADDR(4DOWNTO0)));
ENDIF;
ENDIF;
ENDPROCESS;ENDA;9选择对ROM或者RAM进行操作的二选一选择器子模块LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;
ENTITYMUX2_2ISPORT(
R_R:INSTD_LOGIC;
ROM_IN,RAM_IN:INSTD_LOGIC_VECTOR(7DOWNTO0);
MUX2_2OUT:OUTSTD_LOGIC_VECTOR(7DOWNTO0)
);ENDMUX2_2;
ARCHITECTUREAOFMUX2_2ISBEGIN
PROCESS(R_R,ROM_IN,RAM_IN)
BEGIN
IF(R_R='0')THEN
MUX2_2OUT<=ROM_IN;
ELSE
MUX2_2OUT<=RAM_IN;
ENDIF;
ENDPROCESS;ENDA;10五选一选择器子模块LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;
ENTITYMUX5ISPORT(
R0_B,R1_B,R2_B,R3_B,ALU_B:INSTD_LOGIC;
R0_IN,R1_IN,R2_IN,R3_IN,ALU_IN:INSTD_LOGIC_VECTOR(7DOWNTO0);
MUX5OUT:OUTSTD_LOGIC_VECTOR(7DOWNTO0)
);ENDMUX5;
ARCHITECTUREAOFMUX5ISBEGIN
PROCESS(ALU_B,R3_B,R2_B,R1_B,R0_B)
BEGIN
IF(ALU_B='1'ANDR3_B='1'ANDR2_B='1'ANDR1_B='1'ANDR0_B='0')THEN
MUX5OUT<=R0_IN;
ELSIF(ALU_B='1'ANDR3_B='1'ANDR2_B='1'ANDR1_B='0'ANDR0_B='1')THEN
MUX5OUT<=R1_IN;
ELSIF(ALU_B='1'ANDR3_B='1'ANDR2_B='0'ANDR1_B='1'ANDR0_B='1')THEN
MUX5OUT<=R2_IN;
ELSIF(ALU_B='1'ANDR3_B='0'ANDR2_B='1'ANDR1_B='1'ANDR0_B='1')THEN
MUX5OUT<=R3_IN;
ELSIF(ALU_B='0'ANDR3_B='1'ANDR2_B='1'ANDR1_B='1'ANDR0_B='1')THEN
MUX5OUT<=ALU_IN;
ELSEMUX5OUT<=ALU_IN;
ENDIF;
ENDPROCESS;ENDA;11一分二分配器子模块源程序LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;
ENTITYFEN2ISPORT(
MUX5_IN:INSTD_LOGIC_VECTOR(7DOWNTO0);
LED_B,WR:INSTD_LOGIC;
OUT_MUX3,OUT_PUT:OUTSTD_LOGIC_VECTOR(7DOWNTO0)
);ENDFEN2;
ARCHITECTUREAOFFEN2ISBEGIN
PROCESS(LED_B)
BEGIN
IF(LED_B='0'ANDWR='0')THEN
OUT_PUT<=MUX5_IN;
OUT_MUX3<="00000000";
ELSE
OUT_MUX3<=MUX5_IN;
ENDIF;
ENDPROCESS;ENDA;
12三选一选择器子模块LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;
ENTITYMUX3ISPORT(
SW_B,CS:INSTD_LOGIC;
FEN2_IN,MUX2_2IN,SW_IN:INSTD_LOGIC_VECTOR(7DOWNTO0);
MUX3OUT:OUTSTD_LOGIC_VECTOR(7DOWNTO0)
);ENDMUX3;
ARCHITECTUREAOFMUX3ISBEGINPROCESS(SW_B,CS)
BEGIN
IF(SW_B='0'ANDCS='1')THEN
MUX3OUT<=SW_IN;
ELSIF(SW_B='1'ANDCS='0')THEN
MUX3OUT<=MUX2_2IN;
ELSIF(SW_B='0'ANDCS='0')THEN
MUX3OUT<=FEN2_IN;
ELSE
MUX3OUT<="11101110";
ENDIF;
ENDPROCESS;ENDA;13CENTER_CONTROL微程序控制单元1
地址转移逻辑电路ADDR源程序LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;
ENTITYADDRISPORT(
I7,I6,I5,I4:INSTD_LOGIC;
FZ,FC,T4,P1,P2:INSTD_LOGIC;
SE6,SE5,SE4,SE3,SE2,SE1:OUTSTD_LOGIC
);ENDADDR;ARCHITECTUREAOFADDRISBEGIN
SE6<='1';
SE5<=NOT((NOTFCORFZ)ANDP2ANDT4);
SE4<=NOT(I7ANDP1ANDT4);
SE3<=NOT(I6ANDP1ANDT4);
SE2<=NOT(I5ANDP1ANDT4);
SE1<=NOT(I4ANDP1ANDT4);ENDA;2
微地址寄存器AA源程序LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;
ENTITYMMMISPORT(
SE:INSTD_LOGIC;
T2:INSTD_LOGIC;
D:INSTD_LOGIC;
CLR:INSTD_LOGIC;
UA:OUTSTD_LOGIC
);ENDMMM;ARCHITECTUREAOFMMMISBEGIN
PROCESS(CLR,SE,T2)
BEGIN
IF(CLR='0')THEN
UA<='0';
ELSIF(SE='0')THEN
UA<='1';
ELSIF(T2'EVENTANDT2='1')THEN
UA<=D;
ENDIF;
ENDPROCESS;ENDA;3
微地址转换器F1源程序LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;
ENTITYF1ISPORT(
UA5,UA4,UA3,UA2,UA1,UA0:INSTD_LOGIC;
D:OUTSTD_LOGIC_VECTOR(5DOWNTO0)
);ENDF1;ARCHITECTUREAOFF1ISBEGIN
D(5)<=UA5;
D(4)<=UA4;
D(3)<=UA3;
D(2)<=UA2;
D(1)<=UA1;
D(0)<=UA0;ENDA;4
控制存储器CONTROM源程序LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.STD_LOGIC_ARITH.ALL;USEIEEE.STD_LOGIC_UNSIGNED.ALL;ENTITYCONTROMISPORT(
ADDR:INSTD_LOGIC_VECTOR(5DOWNTO0);
UA:OUTSTD_LOGIC_VECTOR(5DOWNTO0);
D:OUTSTD_LOGIC_VECTOR(22DOWNTO0)
);ENDCONTROM;ARCHITECTUREAOFCONTROMISSIGNALDATAOUT:STD_LOGIC_VECTOR(28DOWNTO0);BEGIN
PROCESS(ADDR)
BEGIN
CASEADDRIS
WHEN"000000"=>DATAOUT<="11011110011001001111000000010";
WHEN"000010"=>DATAOUT<="00011001011001001011010010000";
WHEN"000011"=>DATAOUT<="11111000010001000001000000000";
WHEN"000100"=>DATAOUT<="11111000111001001011000000000";
WHEN"000101"=>DATAOUT<="11111000001001011001000000110";
WHEN"000110"=>DATAOUT<="11111000011011001111100000000";
WHEN"000111"=>DATAOUT<="11111000111110001001100000000";
WHEN"001000"=>DATAOUT<="11111000111100001001000000000";
WHEN"001001"=>DATAOUT<="00010100011001001011000000000";
WHEN"010000"=>DATAOUT<="00011000111001001011000000000";
WHEN"010110"=>DATAOUT<="11111110011001001111000001001";
WHEN"010111"=>DATAOUT<="11011110011001001111001100000";
WHEN"011000"=>DATAOUT<="11111000111001001101000000000";
WHEN"011001"=>DATAOUT<="11111110011001001111000010000";
WHEN"011010"=>DATAOUT<="11101010001001001001000000011";
WHEN"011011"=>DATAOUT<="11101010010001001001000000100";
WHEN"011100"=>DATAOUT<="11011000010001000110000000000";
WHEN"011101"=>DATAOUT<="11111000010001101001000000101";
WHEN"011110"=>DATAOUT<="11111000001001101001000000111";
WHEN"011111"=>DATAOUT<="11111000001001101001000001000";
WHEN"100000"=>DATAOUT<="00010100011001001011000000000";
WHEN"110000"=>DATAOUT<="11111000011001001111000000000";
WHENOTHERS=>DATAOUT<="11111000011001001111000000000";
ENDCASE;
UA(5DOWNTO0)<=DATAOUT(5DOWNTO0);
D(22DOWNTO0)<=DATAOUT(28DOWNTO6);
ENDPROCESS;ENDA;
5
微命令寄存器MCOMMAND源程序LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USE
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 小手拉大手的班级活动计划
- 提升产出效率的年度目标计划
- 水环境保护管理规划计划
- 跨领域财务合规与税务优化实践
- 跨国知识产权纠纷的庭审策略与挑战
- 跨代财富传承家族理财规划的实践与思考
- 安徽专版2024中考历史复习方案第三部分中国现代史第17课时社会主义制度的建立与社会主义建设的探索提分训练
- 浙江省2024-2025学年高中物理第四章课时训练1曲线运动和平抛运动含解析
- 贵州国企招聘2024贵州茅台酒股份有限公司招聘社会招聘维修工12人笔试参考题库附带答案详解
- 高中语文作文看见看不见
- 社会变革中的民事诉讼读书笔记
- 《创伤失血性休克中国急诊专家共识(2023)》解读课件
- 2024年全国体育单招英语考卷和答案
- 河北省邯郸市磁县2024届中考数学模试卷含解析
- 2024上海市高三英语一模各区《完形填空》分类汇编
- 2020-2024年安徽省初中学业水平考试中考历史试卷(5年真题+答案解析)
- 企业解散清算公告模板
- 2024年江苏农牧科技职业学院单招职业适应性测试题库带答案
- GB/T 43977-2024电子气体八氟环丁烷
- 2024年廊坊市财信投资集团有限公司招聘笔试冲刺题(带答案解析)
- 以案促改整改方案整改目标
评论
0/150
提交评论