嵌入式CISC模型机设计

Posted 子墨言良

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了嵌入式CISC模型机设计相关的知识,希望对你有一定的参考价值。

一、     课程设计的题目和内容

题目:设计一台嵌入式CISC模型计算机

采用定长CPU周期、联合控制方式,并运行能完成一定功能的机器语言源程序进行验证,机器语言源程序功能如下:

任意输入5个整数,输出最小负数的绝对值。

二、     系统的总体设计

2.1 CISC模型机数据通路框图

CISC模型机数据通路框图如图1所示:

图1:CISC模型机数据通路框图

2.2地址转移逻辑电路及其逻辑表达式

地址转移逻辑电路的逻辑表达式如下:

   SE5=1

        SE4=NOT((CF AND NOT ZF )AND P2 AND T4); 

        SE3=NOT(I15 AND P1 AND T4); 

        SE2=NOT(I14 AND P1 AND T4); 

        SE1=NOT(I13 AND P1 AND T4); 

        SE0=NOT(I12 AND P1 AND T4);

三、     指令格式及指令系统

3.1命令格式

下面是系统中采用的9条指令及其格式,其中Rs为源寄存器,存放源操作数;Rd为目的寄存器,存放目的操作数所在的地址;im为立即数,addr为形式地址。

模型机规定数据的为无符号整数,且字长为16位,其格式如下:

(1) 输入指令

输入(IN1)指令采用双字节指令,其格式如下:

15 14 13 12

11 10

9 8

7-----------0

操作码

×  ×

Rd

××××××××

(2) MOV指令

MOV指令采用双字节指令,其格式如下:

15 14 13 12

11 10

9 8

7-----------0

操作码

×  ×

Rd

im

(3) MOVS指令

       存值指令,将Rs的值存入到地址[Rd]中。

15 14 13 12

11 10

9 8

7-----------0

操作码

Rs

Rd

××××××××

(4) 比较(CMP)指令

       根据比较结果(Rs-Rd)的值决定跳转。

15 14 13 12

11 10

9 8

7-----------0

操作码

Rs

Rd

××××××××

(5) 减法(SUB)指令

15 14 13 12

11 10

9 8

7-----------0

操作码

Rs

Rd

××××××××

 (6) 自减(DEC)指令

15 14 13 12

11 10

9 8

7-----------0

操作码

×  ×

Rd

××××××××

(7) 条件转移转移指令(JB,小于跳转) 指令

15 14 13 12

11 10

9 8

7-----------0

操作码

×  ×

Rd

addr

“addr”中的值就是要转移的地址值。

(8) 无条件转移指令(JMP)指令

15 14 13 12

11 10

9 8

7-----------0

操作码

×  ×

Rd

addr

 “addr”中的值就是要转移的地址值。

(9) 输出(OUT1)指令

15 14 13 12

11 10

9 8

7-----------0

操作码

Rs

×  ×

××××××××

(10)Rs和Rd寄存器地址规定如下:

Rs  Rd

选定的寄存器

0    0

R0

0    1

R1

1    0

R2

1    1

R3

3.2指令系统

指令助记符

指令格式

功能

15--12

11 10

9 8

7-----------0

IN Rd

0001

××

Rd

××××××××

输入设备→Rd

MOV Rd, im

0010

××

Rd

im

立即数→Rd

MOVS Rs, [Rd]

0011

Rs

Rd

××××××××

(Rs)->[Rd]

CMP Rs, Rd

0100

Rs

Rd

××××××××

(Rs)-(Rd),锁存标志位

SUB Rs, Rd

0101

Rs

Rd

××××××××

(Rs)-(Rd)→Rd

DEC Rd

0110

××

Rd

××××××××

(Rd)-1->(Rd)

JB addr

0111

××

××

addr

若小于,则addr->PC

JMP addr

1000

××

××

addr

addr->PC

OUT Rs

1001

Rs

××

××××××××

(Rs)→输出设备

四、     汇编语言源程序及机器语言源程序

地址

(十六进制)

汇编语言源程序

机器语言源程序

(二进制)

机器语言源程序

(十六进制)

00

MOV R1,00H

0010 00 01 00000000

2100

01

MOV R2,05H

0010 00 10 00000101

2205

02

MOV R3,00H

0001 00 11 00000000

1300

03

    L1: IN R0

0001 00 00 00000000

1000

04

       DEC R2

0110 00 10 00000000

6200

05

       CMP R2,R3

0100 10 11 00000000

4B00

06

       JB O

0111 00 00 00001110

700E

07

       CMP R3,R0

0100 11 00 00000000

4C00

08

       JB L1

0111 00 00 00000011

7003

09

       CMP R0,R1

0100 00 01 00000000

4100

0A

       JB L2

0111 00 00 00001100

700C

0B

       JMP L1

1000 00 00 00000011

8003

0C

    L2: MOVS R0,R1

0011 00 01 00000000

3100

0D

       JMP L1

1000 00 00 00000011

8003

0E

    O: SUB R3,R1

0101 11 01 00000000

5D00

0F

OUT R1

1001 01 00 00000000

9400

五、     机器指令微程序流程图

 

六、     微指令格式和微指令分配

按照要求,CISC模型机系统使用的微指令采用全水平型微指令,字长为25位,其中微命令字段为17位,P字段为2位,后继微地址为6位。由微指令格式和微指令的程序流程图编写的微指令代码表如下所示,在微指令的代码表中微命令字段从左边到右边代表微指令的信号依次是:LOAD、LDPC、LDAR、LDIR、LDRI、LDPSW、RS_B、S1、S0、ALU_B、SW_B、LED_B、RD_D、CS_D、RAM­_B、CS_I、ADDR_B、P1、P2。

LOAD

LDPC

LDAR

LDIR

LDRI

LD

PSW

RS

_B

S1

S0

ALU_B

SW_B

LED_B

RD_D

CS_D

RAM_B

CS_

I

ADDR_B

P1

P2

uA5

-

uA0

00

1

1

0

1

0

0

1

0

0

1

1

1

1

1

1

0

1

1

0

000000

01

1

0

0

0

1

0

1

0

0

1

0

1

1

1

1

1

1

0

0

000000

02

1

0

0

0

1

0

1

0

0

1

1

1

1

1

1

1

0

0

0

000000

03

1

0

0

0

1

0

0

0

0

1

1

1

1

1

1

1

1

0

0

000000

04

1

0

0

0

0

1

1

0

1

1

1

1

1

1

1

1

1

0

0

000000

05

1

0

0

0

1

1

1

0

0

0

1

1

1

1

1

1

1

0

0

000000

06

1

0

0

0

1

1

1

1

0

0

1

1

1

1

1

1

1

0

0

000000

07

1

0

0

0

0

0

1

0

0

1

1

1

1

1

1

1

1

0

1

000000

08

0

1

0

0

0

0

1

0

0

1

1

1

1

1

1

1

0

0

0

000000

09

1

0

0

0

0

0

0

0

0

1

1

0

1

1

1

1

1

0

0

000000

10

0

1

0

0

0

0

1

0

0

1

1

1

1

1

1

1

0

0

0

000000

七、     顶层电路设计

CISC模型机顶层电路设计如下:

图2 CISC模型机的顶层电路图

 

八、    功能仿真波形图及结果分析

     

       波形图中的INBUS代表输入,在PC为04H时开始输入第一个数;OP为指令的操作码,IR为机器语言源程序编码(十六进制);R0-R3为四个寄存器,R0用作输入缓存,R1用于存放当前最小负数,R2用作计数器,R3用作比较器,值固定为0,可判断循环次数和正负;OUTBUS为输出。     

       从上图可以看到输入数据和输出结果,输入分别为FDH、FBH、10H、FFH和02H,最后的输出结果为5,即FBH的绝对值。

       该图显示了从输入FDH和FBH后程序的执行情况。输入FDH后判定其为负数,将其存入R1中最为当前最小负数。由于该输入既是负数,也是最小负数,所以程序会执行到PC为0EH的地方,然后跳转到PC为03H的地方开始下一次循环。

    根据输入前后值的不同,程序的跳转位置亦会不同,如上图中所示陆续输入FBH、10H和FFH后PC跳转的地址不同。首先,输入FBH后,它为负数且小于第一个输入FDH,所以会存入R1中替换原来的最小负数。输入10H后,由于为正数,在比较完正负后,即PC地址为09H的地方,就会跳转到PC地址为03H的地方进行下一次循环,而不会进入下面是否为最小值得比较。而输入FFH后,由于为负数,则先比较正负之后还要比较大小之后才会跳转,即PC地址为0CH的地方,然后跳转到PC地址为03H的地方进行最后一次循环。

 

 

 

 

 

 

 

 

 

 

 

 

 

如上图所示,在输入FBH之后没有再输入比它小的数,所以R1的内容即最小负数保持为FBH。最后,执行完5此循环之后在PC地址为0FH的地方输出最终结果5,此时指令的操作码和机器地址分别为1001和9400。

九、    问题分析

1、在保存文件时,文件存储路径不能用中文命名,否则会出现错误。在编译或者仿真某文件时,须注意将该文件Set Project to Current File。在编译文件出现错误时,需要耐心检查代码,很可能只是漏下或者多打了个分号。

2、在绘制gdf图时,不能将电路图命名为在图中需要用到的元器件的名称,否则会出现不能导入该元器件的现象。在为仿真图添加节点后,虽然可以重命名该节点,但有时导入错误节点并且重新命名后往往很难排查,画顶层图的时候,得小心谨慎,不然线跟线很容易重合在一起。

3、在校对程序无误时,OUTBUS没有数据输出,很可能是因为ENDTIME设置的时间过短导致程序没运行完而出不来结果。如果发现波形仿真图跟自己设想的不一样,可以通过跟踪PC、ADDR、ALU,按照程序的执行步骤一步一步查看检查,找到错误的原因,可能是逻辑错误、输入时的大意等。也可以找同学互相检查以避免自己的定式思维导致的问题。

4、每进行下一步的时候都得确定上一步准确无误,比如在设计指令格式的时候首先要确保汇编程序无误,或在设计机器语言源程序时之前要确保指令格式正确等等,如果自己不能确定可以找同学互相检查以排查错误。

 

十、           软件清单

(1)    ALU单元

S1

S0

功能

0

0

执行减法(SUB)

0

1

执行比较(CMP)

1

0

执行自减1(DEC)

LIBRARY IEEE;

USEIEEE.STD_LOGIC_1164.ALL;

USEIEEE.STD_LOGIC_ARITH.ALL;

USE IEEE.STD_LOGIC_SIGNED.ALL;

ENTITY ALU IS

PORT(

       A:IN STD_LOGIC_VECTOR(7 DOWNTO 0);

       B:IN STD_LOGIC_VECTOR(7 DOWNTO 0);

       S1,S0:IN STD_LOGIC;

       ALUOUT:OUT STD_LOGIC_VECTOR(7 DOWNTO 0);

       CF,ZF:OUT STD_LOGIC

       );

END ALU;

ARCHITECTURE AOF ALU IS

SIGNAL AA,BB,TEMP:STD_LOGIC_VECTOR(8DOWNTO 0);

BEGIN

       PROCESS

       BEGIN

              IF(S1=\'0\' AND S0=\'0\')THEN    --执行减法运算

                     ALUOUT<=A-B;

                     IF(A<B)THEN

                     CF<=\'1\'; --借位标志

                     ZF<=\'0\'; --零标志

              ELSIF(A=B)THEN

                     CF<=\'0\';

                     ZF<=\'1\';

              ELSE

                     CF<=\'0\';

                     ZF<=\'0\';

              END IF;

              ELSIF(S1=\'0\' AND S0=\'1\')THEN     --执行比较运算

                     ALUOUT<=A-B;

                     IF(A<B)THEN

                     CF<=\'1\';

                     ZF<=\'0\';

              ELSIF(A=B)THEN

                     CF<=\'0\';

                     ZF<=\'1\';

              ELSE

                     CF<=\'0\';

                     ZF<=\'0\';

              END IF;

              ELSIF(S1=\'1\' AND S0=\'0\')THEN  --执行减1运算

                     AA<=\'0\'&B;

                     TEMP<=AA-1;

                     ALUOUT<=TEMP(7 DOWNTO0);

                     CF<=TEMP(8);

                     IF(TEMP="000000000")THEN

                            ZF<=\'1\';

                     ELSE

                            ZF<=\'0\';

                     END IF;

              ELSE

                     ALUOUT<="00000000";

                     --CF<=\'0\';

                     ZF<=\'0\';

              END IF;

       END PROCESS;

END A;

 

(2)    寄存器单元

LIBRARY IEEE;

USEIEEE.STD_LOGIC_1164.ALL;

ENTITY LS273 IS

PORT(

              D:IN STD_LOGIC_VECTOR(7 DOWNTO 0);

              CLK:IN STD_LOGIC;

              O:OUT STD_LOGIC_VECTOR(7 DOWNTO 0)

              );

END LS273;

ARCHITECTURE AOF LS273 IS

BEGIN

              PROCESS(CLK)

              BEGIN

                     IF(CLK\'EVENT ANDCLK=\'1\')THEN

                            O<=D;

                     END IF;

              END PROCESS;

END A;

 

(3)    1:2分配器单元

LIBRARY IEEE;

USEIEEE.STD_LOGIC_1164.ALL;

ENTITY FEN2 IS

PORT(

       LED_B:IN STD_LOGIC;

       DBUS:IN STD_LOGIC_VECTOR(7 DOWNTO 0);

       FENOUT,OUTBUS:OUT STD_LOGIC_VECTOR(7DOWNTO 0)

);

END FEN2;

ARCHITECTURE AOF FEN2 IS

       BEGIN

              PROCESS

              BEGIN

                     IF(LED_B=\'0\')THEN

                            OUTBUS<=DBUS;

                     ELSE

                            FENOUT<=DBUS;

                     END IF;

              END PROCESS;

       END A;

(4)    三选一数据选择单元

LIBRARY IEEE;

USEIEEE.STD_LOGIC_1164.ALL;

ENTITY MUX3_1IS

PORT(

       SW_B,RAM_B:IN STD_LOGIC;

       INBUS,RAMOUT,FEN2OUT:INSTD_LOGIC_VECTOR(7 DOWNTO 0);

       DBUS:OUT STD_LOGIC_VECTOR(7 DOWNTO 0)

       );

END MUX3_1;

ARCHITECTURE AOF MUX3_1 IS

BEGIN

       PROCESS

       BEGIN

              IF(SW_B=\'1\' AND RAM_B=\'0\') THEN

                     DBUS<=RAMOUT;

              ELSIF(SW_B=\'1\' AND RAM_B=\'1\') THEN

                     DBUS<=FEN2OUT;

              ELSE

                     DBUS<=INBUS;

              END IF;

       END PROCESS;

END A;

 

(5)    四选一数据选择单元

 

LIBRARY IEEE;

USEIEEE.STD_LOGIC_1164.ALL;

ENTITY MUX4_1IS

PORT(

       I11,I10:IN STD_LOGIC;

       R0,R1,R2,R3:IN STD_LOGIC_VECTOR(7 DOWNTO0);

       X:OUT STD_LOGIC_VECTOR(7 DOWNTO 0)

);

END MUX4_1;

ARCHITECTURE AOF MUX4_1 IS

BEGIN

       PROCESS

       BEGIN

              IF(I11=\'0\' AND I10=\'0\')THEN

                     X<=R0;

              ELSIF(I11=\'0\' AND I10=\'1\')THEN

                     X<=R1;

              ELSIF(I11=\'1\' AND I10=\'0\')THEN

                     X<=R2;

              ELSE

                     X<=R3;

              END IF;

       END PROCESS;

END A;

 

(6)    程序计数单元PC

LIBRARY IEEE;

USEIEEE.STD_LOGIC_1164.ALL;

USEIEEE.STD_LOGIC_ARITH.ALL;

USEIEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY PC IS

PORT(

       LOAD,LDPC,CLR:IN STD_LOGIC;

       D:IN STD_LOGIC_VECTOR(7 DOWNTO 0);

       O:OUT STD_LOGIC_VECTOR(7 DOWNTO 0)

);

END PC;

ARCHITECTURE AOF PC IS

SIGNALQOUT:STD_LOGIC_VECTOR(7 DOWNTO 0);

BEGIN

       PROCESS(LDPC,CLR,LOAD)

       BEGIN

              IF(CLR=\'0\')THEN

                     QOUT<="00000000";

                     ELSIF(LDPC\'EVENT ANDLDPC=\'1\')THEN

                            IF(LOAD=\'0\')THEN

                                   QOUT<=D;       --BUS->PC

                            ELSE

                                   QOUT<=QOUT+1;  --PC+1

                            END IF;

                     END IF;

              END PROCESS;

              O<=QOUT;

       END A;

 

(7)    主存储单元ROM

LIBRARY IEEE;

USEIEEE.STD_LOGIC_1164.ALL;

USEIEEE.STD_LOGIC_ARITH.ALL;

USEIEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY ROM IS

PORT(

       DOUT:OUT STD_LOGIC_VECTOR(15 DOWNTO 0);

       ADDR:IN STD_LOGIC_VECTOR(7 DOWNTO 0);

       CS:IN STD_LOGIC

       );

END ROM;

ARCHITECTURE AOF ROM IS

BEGIN

       DOUT<="0010000100000000"WHENADDR="00000000"AND CS=\'0\'ELSE

               "0010001000000101"WHENADDR="00000001"AND CS=\'0\'ELSE

               "0001001100000000"WHENADDR="00000010"AND CS=\'0\'ELSE

               "0001000000000000"WHENADDR="00000011"AND CS=\'0\'ELSE

               "0110001000000000"WHENADDR="00000100"AND CS=\'0\'ELSE

               "0100101100000000"WHENADDR="00000101"AND CS=\'0\'ELSE

               "0111000000001110"WHENADDR="00000110"AND CS=\'0\'ELSE

               "0100110000000000"WHENADDR="00000111"AND CS=\'0\'ELSE

               "0111000000000011"WHENADDR="00001000"AND CS=\'0\'ELSE

               "0100000100000000"WHENADDR="00001001"AND CS=\'0\'ELSE

               "0111000000001100"WHENADDR="00001010"AND CS=\'0\'ELSE

               "1000000000000011"WHENADDR="00001011"AND CS=\'0\'ELSE

               "0011000100000000"WHENADDR="00001100"AND CS=\'0\'ELSE

               "1000000000000011"WHENADDR="00001101"AND CS=\'0\'ELSE

               "0101110100000000"WHENADDR="00001110"AND CS=\'0\'ELSE

               "1001010000000000"WHENADDR="00001111"AND CS=\'0\'ELSE

               "00000000";

END A;

 

(8)    时序产生器

LIBRARY IEEE;

USEIEEE.STD_LOGIC_1164.ALL;

USEIEEE.STD_LOGIC_ARITH.ALL;

USEIEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY COUNTERIS

PORT(

       CLK,CLR:IN STD_LOGIC;

       T2,T3,T4:OUT STD_LOGIC

       );

END COUNTER;

ARCHITECTURE AOF COUNTER IS

SIGNALX:STD_LOGIC_VECTOR(1 DOWNTO 0);

BEGIN

       PROCESS(CLK,CLR)

       BEGIN

              IF(CLR=\'0\') THEN

                     T2<=\'0\';

                     T3<=\'0\';

                     T4<=\'0\';

                     X<="00";

              ELSIF(CLK\'EVENT AND CLK=\'1\')THEN

                     X<=X+1;

                     T2<=(NOT X(1)) AND X(0);

                     T3<=X(1) AND (NOT X(0));

                     T4<=X(1) AND X(0);

              END IF;

       END PROCESS;

END A;

 

(9)    RAM

LIBRARY IEEE;

USEIEEE.STD_LOGIC_1164.ALL;

USE IEEE.STD_LOGIC_ARITH.ALL;

USEIEEE.STD_LOGIC_UNSIGNED.ALL;

ENTITY RAM IS

PORT(

       CS_D,RD_D:IN STD_LOGIC;

       DIN:IN STD_LOGIC_VECTOR(7 DOWNTO 0);

       ADDR:IN STD_LOGIC_VECTOR(7 DOWNTO 0);

       DOUT:OUT STD_LOGIC_VECTOR(7 DOWNTO 0)

);

END RAM;

ARCHITECTURE AOF RAM IS

TYPE MEMORY ISARRAY(0 TO 31)OF STD_LOGIC_VECTOR(7 DOWNTO 0);

BEGIN

       PROCESS(CS_D)

       VARIABLE MEM:MEMORY;

       BEGIN

              IF(CS_D\'EVENT AND CS_D=\'0\')THEN

                     IF(RD_D=\'0\')THEN

                            MEM(CONV_INTEGER(ADDR(4DOWNTO 0))):=DIN;

                     ELSE

                            DOUT<=MEM(CONV_INTEGER(ADDR(4DOWNTO 0)));

                     END IF;

              END IF;

       END PROCESS;

END A;

 

(10)    二四译码器

LIBRARY IEEE;

USEIEEE.STD_LOGIC_1164.ALL;

ENTITY DECODERIS

PORT(

       I9,I8:IN STD_LOGIC;

       Y0,Y1,Y2,Y3:OUT STD_LOGIC

       );

END DECODER;

ARCHITECTURE AOF DECODER IS

BEGIN

       PROCESS

       BEGIN

              IF(I9=\'0\' AND I8=\'0\')THEN

                     Y0<=\'1\';

                

以上是关于嵌入式CISC模型机设计的主要内容,如果未能解决你的问题,请参考以下文章

《C嵌入式编程设计模式》

软考-嵌入式系统设计师-笔记:计算机系统基础知识

嵌入式主板的应用领域

嵌入式主板用在何处?

嵌入式设计模式:有限状态自动机的C语言实现

基于ARM的嵌入式