资源描述
前言 1
1、设计任务 2
2、设计说明 3
2.1 处理器原理图及其组成 3
2.2数据传输及加减法的实现 3
2.3处理器所支持的指令及功能说明、指令的编码规则 4
2.4指令执行的时序控制 4
3.处理器指令实现的功能及其具体描述 6
3.1 mv Rx,Ry 6
3.2 mvi Rx,#D 7
3.3 add Rx,Ry和sub Rx,Ry 8
4单元模块设计说明、VHDL代码及其仿真 10
4.1寄存器RX 10
4.2 寄存器A 11
4.3 加/减法器addsub 12
4.4 寄存器G 13
4.5 指令寄存器IR 14
4.6 计数器upcount 15
4.7 复用器multi 16
4.8 控制单元control 18
4.9 控制指令输入转换模块 26
4.10 16*16点阵显示控制模块 27
5 处理器各个模块的连接及处理器功能仿真 29
5.1处理器各个模块的连接 29
5.2处理器功能仿真 29
5.2.1立即数赋给寄存器R0 29
5.2.2立即数赋给寄存器R1 29
5.2.3 寄存器R0的值赋给寄存器R2 29
5.2.4 寄存器R1的值赋给寄存器R3 29
5.2.5立即数赋给寄存器R4 29
5.2.6 寄存器R0加上R4赋给R0 30
5.2.7 寄存器R1加上R4赋给R1 30
5.2.6 寄存器R0加上R4赋给R0 30
5.2.7立即数赋给寄存器R5 30
5.2.8 寄存器R4减去R5赋给R4 30
5.2.9 寄存器R4减去R0赋给R4 30
6 处理器实现的功能与操作说明 31
6.1 处理器实现的功能 31
6.2 处理器相关的操作说明 31
7 课程设计总结 32
8附录……………………………………………………...……………………………………34
前言
VHDL 的英文全名是 Very-High-Speed Integrated Circuit Hardware Description Language,诞生于 1982 年。1987 年底,VHDL被 IEEE 和美国国防部确认为标准硬件描述语言。
VHDL主要用于描述数字系统的结构,行为,功能和接口。除了含有许多具有硬件特征的语句外,VHDL的语言形式和描述风格与句法是十分类似于一般的计算机高级语言。VHDL的程序结构特点是将一项工程设计,或称设计实体(可以是一个元件,一个电路模块或一个系统)分成外部(或称可是部分,及端口)和内部(或称不可视部分),既涉及实体的内部功能和算法完成部分。在对一个设计实体定义了外部界面后,一旦其内部开发完成后,其他的设计就可以直接调用这个实体。这种将设计实体分成内外部分的概念是VHDL系统设计的基本点。
与其他硬件描述语言相比,VHDL具有以下特点:
(1)功能强大、设计灵活
VHDL具有功能强大的语言结构,可以用简洁明确的源代码来描述复杂的逻辑控制。它具有多层次的设计描述功能,层层细化,最后可直接生成电路级描述。VHDL支持同步电路、异步电路和随机电路的设计,这是其他硬件描述语言所不能比拟的。VHDL还支持各种设计方法,既支持自底向上的设计,又支持自顶向下的设计;既支持模块化设计,又支持层次化设计。
(2)支持广泛、易于修改
由于VHDL已经成为IEEE标准所规范的硬件描述语言,目前大多数EDA工具几乎都支持VHDL,这为VHDL的进一步推广和广泛应用奠定了基础。在硬件电路设计过程中,主要的设计文件是用VHDL编写的源代码,因为VHDL易读和结构化,所以易于修改设计。
(3)强大的系统硬件描述能力
VHDL具有多层次的设计描述功能,既可以描述系统级电路,又可以描述门级电路。而描述既可以采用行为描述、寄存器传输描述或结构描述,也可以采用三者混合的混合级描述。另外,VHDL支持惯性延迟和传输延迟,还可以准确地建立硬件电路模型。VHDL支持预定义的和自定义的数据类型,给硬件描述带来较大的自由度,使设计人员能够方便地创建高层次的系统模型。
(4)独立于器件的设计、与工艺无关
设计人员用VHDL进行设计时,不需要首先考虑选择完成设计的器件,就可以集中精力进行设计的优化。当设计描述完成后,可以用多种不同的器件结构来实现其功能。
(5)很强的移植能力
VHDL是一种标准化的硬件描述语言,同一个设计描述可以被不同的工具所支持,使得设计描述的移植成为可能。
(6)易于共享和复用
VHDL采用基于库(Library)的设计方法,可以建立各种可再次利用的模块。这些模块可以预先设计或使用以前设计中的存档模块,将这些模块存放到库中,就可以在以后的设计中进行复用,可以使设计成果在设计人员之间进行交流和共享,减少硬件电路设计。
1、设计任务
用VHDL设计一个简单的处理器,并完成相关的仿真测试。
2、设计说明
2.1 处理器原理图及其组成
图1是一个处理器的原理图,它包含了一定数量的寄存器、一个复用器、一个加法/减法器(Addsub),一个计数器和一个控制单元。
图1 简单处理器的电路图
2.2数据传输及加减法的实现
数据传输实现过程:16位数据从DIN输入到系统中,可以通过复用器分配给R0~R7和A,复用器也允许数据从一个寄存器传通过Bus送到另外一个寄存器。
加法和减法的实现过程:复用器先将一个数据通过总线放到寄存器A中,然后将另一个数据放到总线上,加法/减法器对这两个数据进行运算,运算结果存入寄存器G中,G中的数据又可根据要求通过复用器转存到其他寄存器中。
2.3处理器所支持的指令及功能说明、指令的编码规则
表1是该处理所支持的指令
表1
操作
功能
说明
mv Rx, Ry
Rx ← [Ry]
将 Ry 寄存器的值复制到 Rx 寄存器
mvi Rx, #D
Rx ← Data
将 Data 值 存入 Rx寄存器
add Rx, Ry
Rx ← [Rx] + [Ry]
先将 Rx 和 Ry寄存器的值相加,再把相加的值存入 Rx寄存器
sub Rx, Ry
Rx ← [Rx] - [Ry]
先将 Rx 和 Ry 寄存器的值相减,再把相减的值存入 Rx 寄存器
所有指令都按9位编码(取自DIN的高9位)存储在指令寄存器IR中,编码规则为IIIXXXYYY,III表示指令,XXX表示Rx寄存器,YYY表示Ry寄存器。立即数#D是在mvi指令存储到IR中之后,通过16位DIN输入的。如表2所示
表2
2.4指令执行的时序控制
有一些指令,如加法指令和减法指令,需要在总线上多次传输数据,因此需要多个时钟周期才能完成。控制单元使用了一个两位计数器来区分这些指令执行的每一个阶段。当Run信号置位时,处理器开始执行DIN输入的指令。当指令执行结束后,Done信号置位,表3列出四个指令在执行过程中每一个时间段置位的控制信号。图2列出了处理器的状态转换图
表3:
时间
指令
T0
T1
T2
T3
(mv):I0
(mvi):I1
(add):I2
(sub):I3
IRin
IRin
IRin
IRin
RYout,RXin,Done
DINout,RXin,Done
RXout,Ain
RXout,Ain
----
----
RYout,Gin,Addsub
RYout,Gin,Addsub
----
----
Gout,RXin,Done
Gout,RXin,Done
“00”
IRin
“10”
Add/sub
“01”
mv
“11”
Add/sub
“01”
Add/sub
“01”
mvi
“10”
Add/sub
图2,处理器状态转换图
3.处理器指令实现的功能及其具体描述
3.1 mv Rx,Ry
实现的功能:将寄存器Rx的值赋给寄存器Ry(以mv R0, R5为例)
(1 )计数器为“00”时,指令寄存器的置位控制信号输入端IRin=1有效,将DIN输入的数据的高9位锁存。置位的控制信号如图3加粗黑线所示。
图3
(2)计数器为“01”时,首先控制单元根据设计器为“00”时输入的指令,向复用器发出选通控制信号,复用器根据该控制信号让R5的值输出到总线上,然后控制单元控制寄存器R0将总线上的值锁存,完成整个寄存器对寄存器的赋值过程。置位的控制信号和数据流如图4加粗黑线所示。
图4
3.2 mvi Rx,#D
实现的功能:将的立即数#D赋给寄存器Rx(以mv R0, #D为例)
(1)计数器为“00”时,指令寄存器的置位控制信号输入端IRin=1有效,将DIN输入的数据的高9位锁存。置位的控制信号如图5加粗黑线所示。
图5
(2)计数器为“01”时,首先控制单元根据设计器为“00”时输入的指令,向复用器发出选通控制信号,复用器根据该控制信号让DIN的值输出到总线上,然后控制单元控制寄存器R0将总线上的值锁存,完成整个立即数对寄存器的赋值过程。置位的控制信号和数据流如图6加粗黑线所示。
图6
3.3 add Rx,Ry和sub Rx,Ry
实现的功能:将寄存器Ry的值加上/减去寄存器Rx的值并赋给寄存器Rx(以add/sub R0,R1为例)。
(1)计数器为“00”时,指令寄存器的置位控制信号输入端IRin=1有效,将DIN输入的数据的高9位锁存。置位的控制信号如图7加粗黑线所示。
图7
(2)计数器为“01”时,首先控制单元根据设计器为“00”时输入的指令,向复用器发出选通控制信号,复用器根据该控制信号让R0的值输出到总线上,然后控制单元控制寄存器A将总线上的值锁存。置位的控制信号和数据流如图8加粗黑线所示。
图8
(3)计数器为“10”时,首先控制单元根据设计器为“00”时输入的指令,向复用器发出选通控制信号,复用器根据该控制信号让R1的值输出到总线上,然后控制单元控制加法/减法器addsub将寄存器A的值和总线上的值相加/相减并输出,接着寄存器G将加法/减法器addsub的计算结果锁存。置位的控制信号和数据流如图9加粗黑线所示。
图9
(4)计数器为“11”时,首先控制单元向复用器发出选通控制信号,复用器根据该控制信号让寄存器G的值输出到总线上,寄存器R0将总线上的值进行锁存,完成整个寄存器与对寄存器见加减法的运算过程。置位的控制信号和数据流如图10加粗黑线所示。
图10
4单元模块设计说明、VHDL代码及其仿真
4.1寄存器RX
寄存器R0~R7用于数据的存储。当时钟输入clock的上升沿到来且RXin=1时,将数据输入端datain[15..0]的数据锁存到寄存器中并从数据输出端dataout[15..0]输出;当RXin=0时,输出端保持原来的值不变。
图11
寄存器RX的VHDL代码:
library ieee;
use ieee.std_logic_1164.all;
entity RX is
port(
RXin,clock : in std_logic;
datain :in std_logic_vector(15 downto 0);
dataout:out std_logic_vector(15 downto 0)
);
end RX;
architecture behave of RX is
signal databuffer:std_logic_vector(15 downto 0);
begin
process(clock,RXin,datain,databuffer)
begin
if (clock'event and clock='1') then
if (RXin='1') then databuffer<=datain;
else databuffer<=databuffer;
end if;
else databuffer<=databuffer;
end if;
dataout<=databuffer;
end process;
end behave;
4.2 寄存器A
寄存器A用于数据的存储,当时钟输入clock的上升沿到来且Ain=1时,将数据输入端datain[15..0]的数据锁存到寄存器中并从数据输出端dataout[15..0]输出;当RXin=0时,输出端保持原来的值不变。当处理加减法时,将时间T1时总线送过来的数据暂存,当T2时,将T1时存储在A中的数据与总线传输过来的数据在Addsub中进行加减运算,并将结果并输出到寄存器G中。
图12
寄存器A的VHDL代码:
library ieee;
use ieee.std_logic_1164.all;
entity A is
port(
Ain,clock : in std_logic;
datain :in std_logic_vector(15 downto 0);
dataout:out std_logic_vector(15 downto 0)
);
end A;
architecture behave of A is
signal databuffer:std_logic_vector(15 downto 0);
begin
process(clock,Ain,datain,databuffer)
begin
if (clock'event and clock='1') then
if (Ain='1') then databuffer<=datain;
else databuffer<=databuffer;
end if;
else databuffer<=databuffer;
end if;
dataout<=databuffer;
end process;
end behave;
4.3 加/减法器addsub
加/减法器addsub用于处理两个输入的数据datain2[15..0] 和datain1[15..0],当控制端Addsub=1时,两个数据输入端datain2[15..0] 和datain1[15..0]相加并从数据输出端dataout[15..0]输出;当控制端Addsub=0时,数据输入端datain2[15..0] 减去datain1[15..0],结果从数据输出端dataout[15..0]输出。
图 13
加/减法器addsub的VHDL代码:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
entity addsub is
port(
Addsub : in std_logic;
datain1 :in std_logic_vector(15 downto 0);
datain2 :in std_logic_vector(15 downto 0);
dataout:out std_logic_vector(15 downto 0)
);
end addsub;
architecture behave of addsub is
signal databuffer:std_logic_vector(15 downto 0);
begin
process(Addsub,datain1,datain2,databuffer)
begin
if (Addsub='1') then databuffer<=datain2+datain1;
elsif (Addsub='0') then databuffer<=datain2-datain1;
else databuffer<=databuffer;
end if;
dataout<=databuffer;
end process;
end behave;
4.4 寄存器G
寄存器G用于加减运算结果的存储,当时钟输入clock的上升沿到来且Gin=1时,将数据输入端datain[15..0]的数据锁存到寄存器中并从数据输出端dataout[15..0]输出;当RXin=0时,输出端保持原来的值不变。
图14
寄存器G的VHDL代码:
library ieee;
use ieee.std_logic_1164.all;
entity G is
port(
Gin,clock : in std_logic;
datain :in std_logic_vector(15 downto 0);
dataout:out std_logic_vector(15 downto 0)
);
end G;
architecture behave of G is
signal databuffer:std_logic_vector(15 downto 0);
begin
process(clock,Gin,datain,databuffer)
begin
if (clock'event and clock='1') then
if (Gin='1') then databuffer<=datain;
else databuffer<=databuffer;
end if;
else databuffer<=databuffer;
end if;
dataout<=databuffer;
end process;
end behave;
4.5 指令寄存器IR
指令寄存器IR用于对输入的16为指令进行处理,取其高9位。当时钟输入clock的上升沿到来且IRin=1时,取数据输入端datain[15..0]的高9位将其锁存到寄存器中并从数据输出端dataout[8..0]输出;当RXin=0时,输出端保持原来的值不变。
图15
指令寄存器IR的VHDL代码
library ieee;
use ieee.std_logic_1164.all;
entity IR is
port(
IRin,clock : in std_logic;
datain :in std_logic_vector(15 downto 0);
dataout:out std_logic_vector(8 downto 0)
);
end IR;
architecture behave of IR is
signal databuffer:std_logic_vector(8 downto 0);
begin
process(clock,IRin,datain,databuffer)
begin
if (clock'event and clock='1') then
if (IRin='1') then databuffer<=datain(15 downto 7);
else databuffer<=databuffer;
end if;
else databuffer<=databuffer;
end if;
dataout<=databuffer;
end process;
end behave;
4.6 计数器upcount
计数器upcount用于产生控制单元的输入脉冲,对控制单元的工作时序进行控制。当clear=0时(清零端clear无效),时钟输入clock每来一个上升沿,输出Q[1..0]加1, 所以输出为00——>01——>10——>11——>00不断循环;当clear=1时(清零端clear有效),对输出Q[1..0]异步清零,与时钟无关。
图16
计数器upcount的VHDL代码
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_signed.all;
entity upcount is
port(clear, clock : in std_logic;
Q : out std_logic_vector(1 downto 0));
end upcount;
architecture Behavior of upcount is
signal count : std_logic_vector(1 downto 0);
begin
process (Clock)
begin
if (clock'event and clock='1') then
if clear='1' then --------clear='1' clear is effective
count <= "00";
else count<= count+1;
end if;
end if;
end process;
Q<=count;
end Behavior;
4.7 复用器multi
复用器根据控制单元的控制信号将指定的输入数据输出到总线上。来自控制单元的控制信号为R0out~R7out、Gout、DINout,输入数据位来自寄存器R0~R7、寄存器A、数据输入端DIN,当控制信号的某一位为1时,将其对应的输入数据输出到总线上。
图17
复用器multi的VHDL代码
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
entity multi is
port(
R0in :in std_logic_vector(15 downto 0);
R1in :in std_logic_vector(15 downto 0);
R2in :in std_logic_vector(15 downto 0);
R3in :in std_logic_vector(15 downto 0);
R4in :in std_logic_vector(15 downto 0);
R5in :in std_logic_vector(15 downto 0);
R6in :in std_logic_vector(15 downto 0);
R7in :in std_logic_vector(15 downto 0);
DIN :in std_logic_vector(15 downto 0);
Gin :in std_logic_vector(15 downto 0);
R0out :in std_logic;
R1out :in std_logic;
R2out :in std_logic;
R3out :in std_logic;
R4out :in std_logic;
R5out :in std_logic;
R6out :in std_logic;
R7out :in std_logic;
Gout :in std_logic;
DINout :in std_logic;
buswire:buffer std_logic_vector(15 downto 0)
);
end multi;
architecture behave of multi is
signal select_signal:std_logic_vector(9 downto 0);
signal databuffer:std_logic_vector(15 downto 0);
begin
select_signal<=R7out&R6out&R5out&R4out&R3out&R2out&R1out&R0out&Gout&DINout;
process(databuffer,R0in,R1in,R2in,R3in,R4in,R5in,R6in,R7in,DIN,Gin,R7out,R6out,R5out,R4out,R3out,R2out,R1out,R0out,Gout,DINout)
begin
case select_signal is
when"0000000001"=>databuffer<=DIN;
when"0000000010"=>databuffer<=Gin;
when"0000000100"=>databuffer<=R0in;
when"0000001000"=>databuffer<=R1in;
when"0000010000"=>databuffer<=R2in;
when"0000100000"=>databuffer<=R3in;
when"0001000000"=>databuffer<=R4in;
when"0010000000"=>databuffer<=R5in;
when"0100000000"=>databuffer<=R6in;
when"1000000000"=>databuffer<=R7in;
when others=>null;
end case;
buswire<=databuffer;
end process;
end behave;
4.8 控制单元control
控制单元根据计数器发出的脉冲和DIN输入的操作指令对整个系统的其他模块进行控制,完成指定的操作。
图18
控制单元control的VHDL代码
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
entity control is
port(
Run :in std_logic;
Reset :in std_logic;
DIN_IR_9 :in std_logic_vector(8 downto 0);
count :in std_logic_vector(1 downto 0);
IRin :out std_logic;
Gout :out std_logic;
DINout :out std_logic;
R0in,R1in,R2in,R3in,R4in,R5in,R6in,R7in:out std_logic;
R0out,R1out,R2out,R3out,R4out,R5out,R6out,R7out :out std_logic;
Gin :out std_logic;
Ain :out std_logic;
Addsub :out std_logic;
Done :out std_logic;
clear :out std_logic
);
end control;
architecture behave of control is
--type state is (state0,state1,state2,state3);
--signal current_state,next_state:state;
signal IR_buffer:std_logic_vector (8 downto 0);
--signal temp0:std_logic_vector (2 downto 0);
begin
process(Run,reset,count)
begin
IR_buffer<=DIN_IR_9;
if (Run='1' and reset='0' )then
case count is
when "00"=>
IRin<='0'; Gout<='0';DINout<='0';
R0in<='0';R1in<='0';R2in<='0';R3in<='0';R4in<='0';R5in<='0';R6in<='0';R7in<='0';
R0out<='0';R1out<='0';R2out<='0';R3out<='0';R4out<='0';R5out<='0';R6out<='0';R7out<='0';
Gin<='0';Ain<='0';Addsub<='0';Done<='0';clear<='0';
IRin<='1';
-----------------------------------------------------------
---------state1----------------------------------
when "01"=>
---------ttttttttttttttttttttttttttttttttttttttttt
if(IR_buffer(8 downto 6)="000") then --------------- mv Rx,Ry state1
IRin<='0'; Gout<='0';DINout<='0';
R0in<='0';R1in<='0';R2in<='0';R3in<='0';R4in<='0';R5in<='0';R6in<='0';R7in<='0';
R0out<='0';R1out<='0';R2out<='0';R3out<='0';R4out<='0';R5out<='0';R6out<='0';R7out<='0';
Gin<='0';Ain<='0';Addsub<='0';Done<='0';clear<='0';
case IR_buffer(2 downto 0) is
when"000"=> R0out<='1';
-- test1_signal<='1';
case IR_buffer(5 downto 3) is
when "000"=>R0in<='1';
when "001"=>R1in<='1';
when "010"=>R2in<='1';
when "011"=>R3in<='1';
when "100"=>R4in<='1';
when "101"=>R5in<='1';
when "110"=>R6in<='1';
when "111"=>R7in<='1';
when others=> null;
end case;
when"001"=> R1out<='1';
case IR_buffer(5 downto 3) is
when "000"=>R0in<='1';
when "001"=>R1in<='1';
when "010"=>R2in<='1';
when "011"=>R3in<='1';
when "100"=>R4in<='1';
when "101"=>R5in<='1';
when "110"=>R6in<='1';
when "111"=>R7in<='1';
when others=> null;
end case;
when"010"=> R2out<='1';
case IR_buffer(5 downto 3) is
when "000"=>R0in<='1';
when "001"=>R1in<='1';
when "010"=>R2in<='1';
when "011"=>R3in<='1';
when "100"=>R4in<='1';
when "101"=>R5in<='1';
when "110"=>R6in<='1';
when "111"=>R7in<='1';
when others=> null;
end case;
when"011"=> R3out<='1';
case IR_buffer(5 downto 3) is
when "000"=>R0in<='1';
when "001"=>R1in<='1';
when "010"=>R2in<='1';
when "011"=>R3in<='1';
when "100"=>R4in<='1';
when "101"=>R5in<='1';
when "110"=>R6in<='1';
when "111"=>R7in<='1';
when others=> null;
end case;
展开阅读全文