学 生:指导老师:系 别:专 业:班 级:学 号:
课程设计报告
VHDL与数字系统课程设计 XXX XXX、XXX
电子信息与电气工程系 电子科学与技术 XXX XXX
实践课题:
一、设计任务
用VHDL设计一个简单的处理器,并完成相关的仿真测试。
.设计要求:
图1是一个处理器的原理图,它包含了一定数量的寄存器、一个复用器、一个加法/减法器(Addsub),一个计数器和一个控制单元。
图1 简单处理器的电路图
数据传输实现过程:16位数据从DIN输入到系统中,可以通过复用器分配给R0~R7和A,复用器也允许数据从一个寄存器传通过Bus送到另外一个寄存器。
加法和减法的实现过程:复用器先将一个数据通过总线放到寄存器A中,然后将另一个数据放到总线上,加法/减法器对这两个数据进行运算,运算结果存入寄存器G中,G中的数据又可根据要求通过复用器转存到其他寄存器中。
下表是该处理所支持的指令。
操作 mv Rx, Ry mvi Rx, #D add Rx, Ry sub Rx, Ry 功能 Rx ← [Ry] Rx ← Data Rx ← [Rx] + [Ry] Rx ← [Rx] - [Ry] 1) Rx ← [Ry] :将寄存器Ry中的内容复制到Rx;
2) Mvi Rx,#D :将立即数存入寄存器Rx中去。
所有指令都按9位编码(取自DIN的高9位)存储在指令存储器IR中,编编码规则为IIIXXXYYY,III表示指令,XXX表示Rx寄存器,YYY表示Ry寄存器。立即数#D是在mvi指令存储到IR中之后,通过16位DIN输入的。
有一些指令,如加法指令和减法指令,需要在总线上多次传输数据,因此需要多个时钟周期才能完成。控制单元使用了一个两位计数器来区分这些指令执行的每一个阶段。当Run信号置位时,处理器开始执行DIN输入指令。当指令执行结束后,Done信号置位,下表列出四个指令在执行过程中每一个时间段置位的控制信号。
时间 指令 (mv):I0 (mvi):I1 (add):I2 (sub):I3
T0 IRin IRin IRin IRin T1 RYout,RXin,Done DINout,RXin,Done RXout,Ain RXout,Ain T2 ---- ---- RYout,Gin,Addsub RYout,Gin,Addsub T3 ---- ---- Gout,RXin,Done Gout,RXin,Done 二、实现功能说明 2.1 mv Rx,Ry
实现的功能:将寄存器Rx的值赋给寄存器Ry(以mv R0, R5为例)
(1 )计数器为“00”时,指令寄存器的置位控制信号输入端IRin=1有效,将DIN输入的数据的高9位锁存。置位的控制信号如图3加粗黑线所示。
图3
(2)计数器为“01”时,首先控制单元根据设计器为“00”时输入的指令,向复用器发出选通控制信号,复用器根据该控制信号让R5的值输出到总线上,然后控制单元控制寄存器R0将总线上的值锁存,完成整个寄存器对寄存器的赋值过程。置位的控制信号和数据流如图4加粗黑线所示。
图4
2.2 mvi Rx,#D
实现的功能:将的立即数#D赋给寄存器Rx(以mv R0, #D为例)
(1)计数器为“00”时,指令寄存器的置位控制信号输入端IRin=1有效,将DIN输入的数据的高9位锁存。置位的控制信号如图5加粗黑线所示。
图5
(2)计数器为“01”时,首先控制单元根据设计器为“00”时输入的指令,向复用器发出选通控制信号,复用器根据该控制信号让DIN的值输出到总线上,然后控制单元控制寄存器R0将总线上的值锁存,完成整个立即数对寄存器的赋值过程。置位的控制信号和数据流如图6加粗黑线所示。
图6
2.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.1寄存器Registe
寄存器R0~R7、寄存器A或寄存器G : 用于数据的存储。当时钟输入clk的上升沿到来且rin=1时,将数据输入端rxin[15..0]的数据锁存到寄存器中并从数据输出端rxout[15..0]输出;当rin=0时,输出端保持原来的值不变。
registeclkrinrxin[15..0]inst1rxout[15..0] 寄存器Registe的VHDL代码:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL; ENTITY registe is port(
clk:in std_logic; rin:in std_logic;
rxin:in std_logic_vector(15 downto 0); rxout:out std_logic_vector(15 downto 0)); end entity registe;
architecture one of registe is
begin process(clk) begin
if clk'event and clk='1' then if rin='1' then rxout<=rxin; end if; end if; end process; end one;
4.2指令寄存器IR
指令寄存器IR用于对输入的16为指令进行处理,取其高9位。当时钟输入clk的上升沿到来且rin=1时,取数据输入端rxin[15..0]的高9位将其锁存到寄存器中并从数据输出端rxout[8..0]输出;当rin=0时,输出端保持原来的值不变。
IRclkrinrxin[15..0]inst4rxout[8..0] 指令寄存器IR的VHDL代码:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL; ENTITY IR is port(
clk:in std_logic; rin:in std_logic;
rxin:in std_logic_vector(15 downto 0); rxout:out std_logic_vector(8 downto 0)); end entity IR;
architecture one of IR is begin process(clk) begin
if clk'event and clk='1' then
if rin='1' then rxout<=rxin(15 downto 7);
end if; end if; end process; end one;
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]输出。
addsubain[15..0]bin[15..0]adsubaddsubabout[15..0] 加/减法器addsub的VHDL代码:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL; use ieee.std_logic_unsigned.all; ENTITY addsub is
port( ain:in std_logic_vector(15 downto 0); bin:in std_logic_vector(15 downto 0); adsub:in bit;
about:out std_logic_vector(15 downto 0)); end entity addsub;
architecture one of addsub is
signal a,b:std_logic_vector(15 downto 0); begin
process(adsub,ain,bin) begin
if adsub='0' then about<=ain+bin; elsif adsub='1' then about<=ain-bin; end if; end process; end one;
4.4 计数器 counter
计数器counter用于产生控制单元的输入脉冲,对控制单元的工作时序进行控制。当clear=0时(清零端clear无效),时钟输入clk每来一个上升沿,输出count[1..0]加1, 所以输出为00——>01——>10——>11——>00不断循环;当clear=1时(清零端clear有效),对输出Q[1..0]同步清零,与时钟有关。
counterclkclearcount[1..0]counter
计数器counter的VHDL代码:
library ieee;
use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity counter is port(
clk:in std_logic; clear:in std_logic;
count:out std_logic_vector(1 downto 0)); end counter;
architecture one of counter is signal c:std_logic_vector(1 downto 0); begin
process(clk,clear) begin
if clk'event and clk='1' then if(clear='1')then c<=\"00\"; else c<=c+1;end if; end if; end process; count<=c; end one;
4.5 复用器 multiplexers
复用器根据控制单元的控制信号将指定的输入数据输出到总线上。来自控制单元的控制信号为R0out~R7out、Gout、DINout,输入数据位来自寄存器R0~R7、寄存器A、数据输入端DIN,当控制信号的某一位为1时,将其对应的输入数据输出到总线上。
multiplexersdin[15..0]gin[15..0]r0[15..0]r1[15..0]r2[15..0]r3[15..0]r4[15..0]r5[15..0]r6[15..0]r7[15..0]ren[7..0]gendineninst3dout[15..0]
复用器 multiplexers的VHDl代码:
library ieee;
use ieee.std_logic_1164.all; entity multiplexers is
port ( din:in std_logic_vector(15 downto 0); gin:in std_logic_vector(15 downto 0); r0:in std_logic_vector(15 downto 0);
r1:in std_logic_vector(15 downto 0); r2:in std_logic_vector(15 downto 0); r3:in std_logic_vector(15 downto 0); r4:in std_logic_vector(15 downto 0); r5:in std_logic_vector(15 downto 0); r6:in std_logic_vector(15 downto 0); r7:in std_logic_vector(15 downto 0);
ren:in bit_vector(7 downto 0); gen:in bit; dinen:in bit;
dout:out std_logic_vector(15 downto 0)); end multiplexers;
architecture bhv of multiplexers is begin
dout<=gin when gen='1' else r0 when ren(0)='1' else r1 when ren(1)='1' else r2 when ren(2)='1' else
r3 when ren(3)='1' else r4 when ren(4)='1' else r5 when ren(5)='1' else r6 when ren(6)='1' else r7 when ren(7)='1' else din when dinen='1' else \"0000000000000000\"; end bhv;
4.6控制单元control
控制单元根据计数器发出的脉冲和DIN输入的操作指令对整个系统的其他模块进行控制,完成指定的操作。
instdoneginaddsubainr7inr6inr5inr4inr3inr2inr1inr0inrout[7..0]dinoutgoutiroutclearirin[8..0]clk[1..0]runresetcontrol
控制单元control的VHDL代码:
library ieee;
use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity control is port( reset:in std_logic; run:in std_logic;
clk:in std_logic_vector(1 downto 0); irin:in std_logic_vector(8 downto 0); clear:out std_logic; irout:out std_logic;
gout:out std_logic; dinout:out std_logic;
rout:out std_logic_vector(7 downto 0); r0in:out std_logic; r1in:out std_logic; r2in:out std_logic; r3in:out std_logic; r4in:out std_logic; r5in:out std_logic;
r6in:out std_logic; r7in:out std_logic; ain:out std_logic;
addsub:out std_logic;
gin:out std_logic; done:out std_logic);
end control;
architecture one of control is begin
process(clk,run,reset,irin) begin
if(reset='0')then clear<='1'; irout<='0'; gout<='0'; dinout<='0'; rout<=\"00000000\"; r0in<='0'; r1in<='0'; r2in<='0'; r3in<='0'; r4in<='0'; r5in<='0';
r6in<='0'; r7in<='0'; ain<='0';
addsub<='0'; else case clk is when\"00\"=> clear<='0'; irout<='1'; gout<='0'; dinout<='1'; rout<=\"00000000\"; r0in<='0'; r1in<='0'; r2in<='0'; r3in<='0'; r4in<='0'; r5in<='0';
r6in<='0'; r7in<='0'; ain<='0'; gin<='0'; done<='0';
addsub<='0';
gin<='0'; done<='0';
if run='0' then irout<='1'; else irout<='0';end if; when\"01\"=>
if(irin(8 downto 6)=\"000\")then clear<='1'; irout<='0'; gout<='0'; dinout<='0';
ain<='0';
addsub<='0';
gin<='0'; done<='1';
case irin(5 downto 3) is
when\"000\"=>r0in<='1';r1in<='0';r2in<='0';r3in<='0';r4in<='0';r5in<='0';r6in<='0';r7in<='0'; when\"001\"=>r1in<='1';r0in<='0';r2in<='0';r3in<='0';r4in<='0';r5in<='0';r6in<='0';r7in<='0'; when\"010\"=>r2in<='1';r0in<='0';r1in<='0';r3in<='0';r4in<='0';r5in<='0';r6in<='0';r7in<='0'; when\"011\"=>r3in<='1';r0in<='0';r1in<='0';r2in<='0';r4in<='0';r5in<='0';r6in<='0';r7in<='0'; when\"100\"=>r4in<='1';r0in<='0';r1in<='0';r2in<='0';r3in<='0';r5in<='0';r6in<='0';r7in<='0'; when\"101\"=>r5in<='1';r0in<='0';r1in<='0';r2in<='0';r3in<='0';r4in<='0';r6in<='0';r7in<='0'; when\"110\"=>r6in<='1';r0in<='0';r1in<='0';r2in<='0';r3in<='0';r4in<='0';r5in<='0';r7in<='0'; when\"111\"=>r7in<='1';r0in<='0';r1in<='0';r2in<='0';r3in<='0';r4in<='0';r5in<='0';r6in<='0'; when others=>null;
end case;
case irin(2 downto 0)is
when\"000\"=>rout<=\"00000001\"; when\"001\"=>rout<=\"00000010\"; when\"010\"=>rout<=\"00000100\"; when\"011\"=>rout<=\"00001000\"; when\"100\"=>rout<=\"00010000\"; when\"101\"=>rout<=\"00100000\"; when\"110\"=>rout<=\"01000000\"; when\"111\"=>rout<=\"10000000\";
when others=>null;
end case;
elsif(irin(8 downto 6)=\"001\")then clear<='1'; irout<='0'; gout<='0'; dinout<='1'; rout<=\"00000000\";
ain<='0';
addsub<='0';
gin<='0'; done<='1';
case irin(5 downto 3) is
when\"000\"=>r0in<='1';r1in<='0';r2in<='0';r3in<='0';r4in<='0';r5in<='0';r6in<='0';r7in<='0'; when\"001\"=>r1in<='1';r0in<='0';r2in<='0';r3in<='0';r4in<='0';r5in<='0';r6in<='0';r7in<='0'; when\"010\"=>r2in<='1';r0in<='0';r1in<='0';r3in<='0';r4in<='0';r5in<='0';r6in<='0';r7in<='0'; when\"011\"=>r3in<='1';r0in<='0';r1in<='0';r2in<='0';r4in<='0';r5in<='0';r6in<='0';r7in<='0';
when\"100\"=>r4in<='1';r0in<='0';r1in<='0';r2in<='0';r3in<='0';r5in<='0';r6in<='0';r7in<='0'; when\"101\"=>r5in<='1';r0in<='0';r1in<='0';r2in<='0';r3in<='0';r4in<='0';r6in<='0';r7in<='0'; when\"110\"=>r6in<='1';r0in<='0';r1in<='0';r2in<='0';r3in<='0';r4in<='0';r5in<='0';r7in<='0'; when\"111\"=>r7in<='1';r0in<='0';r1in<='0';r2in<='0';r3in<='0';r4in<='0';r5in<='0';r6in<='0'; when others=>null; end case;
elsif(irin(8 downto 6)=\"010\" or irin(8 downto 6)=\"011\")then clear<='0'; irout<='0'; gout<='0'; dinout<='0'; r0in<='0'; r1in<='0'; r2in<='0'; r3in<='0'; r4in<='0'; r5in<='0';
r6in<='0'; r7in<='0'; ain<='1';
addsub<='0';
gin<='0'; done<='0';
case irin(5 downto 3)is
when\"000\"=>rout<=\"00000001\"; when\"001\"=>rout<=\"00000010\"; when\"010\"=>rout<=\"00000100\"; when\"011\"=>rout<=\"00001000\"; when\"100\"=>rout<=\"00010000\"; when\"101\"=>rout<=\"00100000\"; when\"110\"=>rout<=\"01000000\"; when\"111\"=>rout<=\"10000000\";
when others=>null;
end case;
else
clear<='1';
irout<='0'; gout<='0'; dinout<='0'; rout<=\"00000000\"; r0in<='0'; r1in<='0'; r2in<='0'; r3in<='0'; r4in<='0'; r5in<='0';
r6in<='0'; r7in<='0'; ain<='0';
addsub<='0';
gin<='0'; done<='0';
end if; when\"10\"=>
if(irin(8 downto 6)=\"010\")then clear<='0'; irout<='0'; gout<='0'; dinout<='0'; r0in<='0'; r1in<='0'; r2in<='0'; r3in<='0'; r4in<='0'; r5in<='0';
r6in<='0'; r7in<='0'; ain<='0';
addsub<='0';
gin<='1'; done<='0';
case irin(2 downto 0)is
when\"000\"=>rout<=\"00000001\"; when\"001\"=>rout<=\"00000010\"; when\"010\"=>rout<=\"00000100\"; when\"011\"=>rout<=\"00001000\"; when\"100\"=>rout<=\"00010000\"; when\"101\"=>rout<=\"00100000\"; when\"110\"=>rout<=\"01000000\"; when\"111\"=>rout<=\"10000000\";
when others=>null;
end case;
elsif(irin(8 downto 6)=\"011\")then clear<='0'; irout<='0'; gout<='0'; dinout<='0'; r0in<='0'; r1in<='0'; r2in<='0'; r3in<='0'; r4in<='0'; r5in<='0';
r6in<='0'; r7in<='0'; ain<='0';
addsub<='1';
gin<='1'; done<='0';
case irin(2 downto 0)is
when\"000\"=>rout<=\"00000001\"; when\"001\"=>rout<=\"00000010\"; when\"010\"=>rout<=\"00000100\"; when\"011\"=>rout<=\"00001000\"; when\"100\"=>rout<=\"00010000\"; when\"101\"=>rout<=\"00100000\"; when\"110\"=>rout<=\"01000000\"; when\"111\"=>rout<=\"10000000\";
when others=>null;
end case;
else
clear<='1'; irout<='0'; gout<='0'; dinout<='0'; rout<=\"00000000\"; r0in<='0'; r1in<='0'; r2in<='0'; r3in<='0'; r4in<='0'; r5in<='0';
r6in<='0'; r7in<='0'; ain<='0';
addsub<='0';
gin<='0'; done<='0';
end if; when\"11\"=>
if(irin(8 downto 6)=\"010\" or irin(8 downto 6)=\"011\")then clear<='0'; irout<='0'; gout<='1'; dinout<='0'; rout<=\"00000000\";
ain<='0';
addsub<='0';
gin<='0'; done<='1';
case irin(5 downto 3) is
when\"000\"=>r0in<='1';r1in<='0';r2in<='0';r3in<='0';r4in<='0';r5in<='0';r6in<='0';r7in<='0'; when\"001\"=>r1in<='1';r0in<='0';r2in<='0';r3in<='0';r4in<='0';r5in<='0';r6in<='0';r7in<='0'; when\"010\"=>r2in<='1';r0in<='0';r1in<='0';r3in<='0';r4in<='0';r5in<='0';r6in<='0';r7in<='0';
when\"011\"=>r3in<='1';r0in<='0';r1in<='0';r2in<='0';r4in<='0';r5in<='0';r6in<='0';r7in<='0'; when\"100\"=>r4in<='1';r0in<='0';r1in<='0';r2in<='0';r3in<='0';r5in<='0';r6in<='0';r7in<='0'; when\"101\"=>r5in<='1';r0in<='0';r1in<='0';r2in<='0';r3in<='0';r4in<='0';r6in<='0';r7in<='0'; when\"110\"=>r6in<='1';r0in<='0';r1in<='0';r2in<='0';r3in<='0';r4in<='0';r5in<='0';r7in<='0'; when\"111\"=>r7in<='1';r0in<='0';r1in<='0';r2in<='0';r3in<='0';r4in<='0';r5in<='0';r6in<='0'; when others=>null; end case; else clear<='0'; irout<='0'; gout<='0'; dinout<='0'; rout<=\"00000000\"; r0in<='0'; r1in<='0'; r2in<='0'; r3in<='0'; r4in<='0'; r5in<='0';
r6in<='0'; r7in<='0'; ain<='0';
addsub<='0';
gin<='0'; done<='0';
end if;
when others=>null; end case; end if; end process; end one;
4.7 数码管显示led
采集寄存器R0~R7的值作为led的输入,将各寄存器值的低四位以1~9、A~F分别显示在8个数码管,从而观察各寄存器值的变化。ledout[6..0] 为数码管段码输出端,control[2..0] 为第几个数码管有效的数码管选择端输出。
ledclkreg_0[15..0]reg_1[15..0]reg_2[15..0]reg_3[15..0]reg_4[15..0]reg_5[15..0]reg_6[15..0]reg_7[15..0]inst2ledout[6..0]control[2..0] 数码管显示led的VHDL代码:
library ieee;
use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity led is port(
clk:in std_logic;
reg_0:in std_logic_vector(15 downto 0); reg_1:in std_logic_vector(15 downto 0); reg_2:in std_logic_vector(15 downto 0); reg_3:in std_logic_vector(15 downto 0); reg_4:in std_logic_vector(15 downto 0); reg_5:in std_logic_vector(15 downto 0); reg_6:in std_logic_vector(15 downto 0); reg_7:in std_logic_vector(15 downto 0); ledout:out std_logic_vector(6 downto 0); control:out std_logic_vector(2 downto 0)); end led;
architecture one of led is
signal controls:std_logic_vector(2 downto 0);
signal led0,led1,led2,led3,led4,led5,led6,led7,outer:std_logic_vector(3 downto 0); begin
led0<=reg_0(3 downto 0); led1<=reg_1(3 downto 0); led2<=reg_2(3 downto 0);
led3<=reg_3(3 downto 0); led4<=reg_4(3 downto 0); led5<=reg_5(3 downto 0); led6<=reg_6(3 downto 0); led7<=reg_7(3 downto 0); process(clk) begin
if clk'event and clk='1' then
if controls=\"111\" then controls<=\"000\"; else controls<=controls+1; end if; end if;
control<=controls; end process; process(controls) begin case controls is
when\"000\"=>outer<=led0; when\"001\"=>outer<=led1; when\"010\"=>outer<=led2; when\"011\"=>outer<=led3; when\"100\"=>outer<=led4; when\"101\"=>outer<=led5; when\"110\"=>outer<=led6; when\"111\"=>outer<=led7; when others=>outer<=\"XXXX\"; end case; case outer is
when\"0000\" => ledout<=\"0111111\"; when\"0001\" => ledout<=\"0000110\"; when\"0010\" => ledout<=\"1011011\"; when\"0011\" => ledout<=\"1001111\"; when\"0100\" => ledout<=\"1100110\"; when\"0101\" => ledout<=\"1101101\"; when\"0110\" => ledout<=\"1111101\"; when\"0111\" => ledout<=\"0000111\";
when\"1000\" => ledout<=\"1111111\"; when\"1001\" => ledout<=\"1101111\"; when\"1010\" => ledout<=\"1110111\"; when\"1011\" => ledout<=\"1111100\"; when\"1100\" => ledout<=\"0111001\"; when\"1101\" => ledout<=\"1011110\"; when\"1110\" => ledout<=\"1111001\"; when\"1111\" => ledout<=\"1110001\"; when others=> ledout<=\"XXXXXXX\"; end case; end process; end one;
四、处理器各个模块的连接
采用原理图连接的方法进行各个模块间的连接,连接后的原理图见附录1。
五、操作说明及功能、时序仿真效果 5.1 功能仿真
将R0 <-- 6 , R0→R1 , R0 – R1 R0 , R0 + R1 R0 . 仿真结果如下:
5.2 时序仿真
1)、按设计说明书的仿真图中的数据进行设置,仿真结果如下:
2)、将R3 <-- 1 , R5 <-- 6 , R5 – R3 R2 , R5 + R3 R5 . 仿真结果如下:
5.3 操作说明
Clock 接的是数字时钟 1KHz,DIN[15..0]管脚分配到开关K1~K12、按键S5~S8,Resetn管脚分配到按键S1,Run管脚分配到S2,R0~R7的低四位值分别显示在led1~led8数码管中。将Run改为低电平有效(因为按键按下为低电平,如此更好操作)。Busout[15..0]高12位管脚分配到二极管L1~L12。 1)、mvi R0,#D (D=5) 先将DIN置为“0010 0000 0000 FFFF”(只与高六位有关)即K3向上拨(为高电平),其余开关向下拨(为低电平),按键都不按,
再按一下S2(Run)键,此时指令已被读到,再将要置的数置入,5=“0000 0000 0000 0101”即所有开关向下拨并按下S5、S7两键,再按一下S2(Run)键,即可看到了led1(R0)显示5,其余显示0。 2)、mv R1,R0
先将DIN置为“0000 0100 0000 FFFF”(只与高9位有关)同上方法操作开关、按键,再按一下S2(Run)
键,即可看到led1、led2(R1)都显示5,其余显示0。 3)、add R1,R0
先将DIN置为“0100 0100 0000 FFFF”(只与高9位有关)同上方法操作开关、按键,再按一下S2(Run)键,即可看到led1显示5,led2(R1)显示A,其余显示0。 4)、sub R1,R0
先将DIN置为“0110 0100 0000 FFFF”(只与高9位有关)同上方法操作开关、按键,再按一下S2(Run)键,即可看到led1显示5,led2(R1)也显示5,其余显示0。 其余操作以此类推!
六、实验箱下载及实现功能
下载后能从数码管观察到指令mvi Rx,#D和mv Rx,Ry运行结果且是正确的,但是指令add Rx,Ry与sub Rx,Ry时数码管是闪烁的显示。
原因:由于Run按一下之后,指令就被存在IR寄存器中,并且由于在此处Run只是指令寄存器的使能端,这样Run之后就一直重复执行这条指令,这样加、减法指令就成为累加、累减操作了,故数码管值随指令周期一直在变,即数码管是闪烁的。
改进:将Run改为整个处理器的使能端。
七、实验总结
(1 )总线输入端的命名:比如位宽为8位的DIN输入端,端口名后面跟着中括号[ ],中括号中用 X..0 说明位宽位X。
图22
(2 )本次课程设计要求使用时寄存器传输级RTL(Register Transfer Level)设计,按照给出的框架完成简单处理器的功能。RTL寄存器传输级的基本功能模块是寄存器、计数器、多路复用器和算术逻辑单元(ALU)。RTL设计方法的基本流程如图23所示。
图23
(3 )把总线分开连接到到独立的信号线的方法:模块输入的是一个4位总线data[3..0],现在想把总线的每一位分别与输出的单一的信号线连接起来,给对应要相连接的信号线命同样的名即可,如图24所示。
图24
(4 )对产生的图形文件进行外形编辑,改变某些端口的位置以方便连线。右键单击要编辑的图形文件,选择Edit Selected Symbol,进入图形文件编辑模式,此时可以根据连线的方便对图形文件中的端口位置进行移动,也可以改变图形文件的形状,编辑完成后点击保存,回到原理图输入模式,右键单击编辑过的图形文件,选择update symbol or block 更新图形文件。图25左边为编辑前的图形文件,右边为编辑后的图形文件。
图25
八、参考文献
EDA技术实用教材---科学出版社---潘松、黄继业编著---2010年6月
九、附录
OUTPUTr_0[15..0]ledout[6..0]registeClockINPUTVCCregisteledclkrinrxin[15..0]rxout[15..0]clkrinrxin[15..0]rxout[15..0]r_0[15..0]r_1[15..0]r_2[15..0]r_3[15..0]r_4[15..0]r_5[15..0]r_6[15..0]r_7[15..0]clkreg_0[15..0]reg_1[15..0]reg_2[15..0]reg_3[15..0]reg_4[15..0]reg_5[15..0]reg_6[15..0]reg_7[15..0]inst2OUTPUTledout[6..0]control[2..0]PIN_L2R0PIN_G6PIN_G7PIN_H3PIN_H4PIN_H5PIN_H6PIN_J4registeclkrinrxin[15..0]rxout[15..0]r_1[15..0]Aaddsubain[15..0]bin[15..0]adsubaddsubabout[15..0]buscontrol[2..0]registeclkrinrxin[15..0]rxout[15..0]r_2[15..0]R1PIN_G5PIN_G3PIN_F4register_3[15..0]OUTPUTbusout[15..0]R2registeclkrinrxin[15..0]R3DIN[15..0]rxout[15..0]clkrinrxin[15..0]Grxout[15..0]OUTPUTDoneinstmultiplexersdin[15..0]gin[15..0]r0[15..0]r1[15..0]r_5[15..0]register_4[15..0]INPUTVCCdonegindout[15..0]addsubainr7inr6inr5inr4inr3inr2inr1inr0inrout[7..0]dinoutgoutiroutclearirin[8..0]clk[1..0]runresetcontrolVCCINPUTVCCINPUTPIN_B18PIN_F15PIN_B17PIN_F12PIN_A18PIN_H7PIN_A17PIN_F14PIN_F13PIN_A16PIN_F11PIN_A15PIN_B15PIN_F9PIN_B14PIN_E15clkrinrxin[15..0]R4registeclkrinrxin[15..0]rxout[15..0]PIN_B20PIN_M7PIN_A19PIN_M8PIN_B19PIN_L7PIN_A13PIN_E14PIN_B13PIN_E11PIN_A11PIN_E9r2[15..0]r3[15..0]r4[15..0]r5[15..0]r6[15..0]r7[15..0]ren[7..0]gendineninst3rxout[15..0]registeclkrinrxin[15..0]rxout[15..0]r_6[15..0]R5RunPIN_A14Resetnr_7[15..0]R6registeclkrinrxin[15..0]R7rxout[15..0]IRclkrinrxin[15..0]IRrxout[8..0]counterclkclearcount[1..0]PIN_F8counter
因篇幅问题不能全部显示,请点此查看更多更全内容