《VHDL与数字系统课程设计(简单处理器设计)说课讲解.doc》由会员分享,可在线阅读,更多相关《VHDL与数字系统课程设计(简单处理器设计)说课讲解.doc(20页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、如有侵权,请联系网站删除,仅供学习与交流VHDL与数字系统课程设计(简单处理器设计)【精品文档】第 20 页课程设计报告实践课题: VHDL与数字系统课程设计 学 生: XXX 指导老师: XXX、XXX 系 别: 电子信息与电气工程系 专 业: 电子科学与技术 班 级: XXX 学 号: XXX 一、设计任务 用VHDL设计一个简单的处理器,并完成相关的仿真测试。 .设计要求:图1是一个处理器的原理图,它包含了一定数量的寄存器、一个复用器、一个加法/减法器(Addsub),一个计数器和一个控制单元。图1 简单处理器的电路图数据传输实现过程:16位数据从DIN输入到系统中,可以通过复用器分配给
2、R0R7和A,复用器也允许数据从一个寄存器传通过Bus送到另外一个寄存器。加法和减法的实现过程:复用器先将一个数据通过总线放到寄存器A中,然后将另一个数据放到总线上,加法/减法器对这两个数据进行运算,运算结果存入寄存器G中,G中的数据又可根据要求通过复用器转存到其他寄存器中。下表是该处理所支持的指令。操作功能mv Rx, Rymvi Rx, #Dadd Rx, Rysub Rx, RyRx RyRx DataRx Rx + RyRx Rx - Ry1) Rx Ry :将寄存器Ry中的内容复制到Rx;2) Mvi Rx,#D :将立即数存入寄存器Rx中去。 所有指令都按9位编码(取自DIN的高9
3、位)存储在指令存储器IR中,编编码规则为IIIXXXYYY,III表示指令,XXX表示Rx寄存器,YYY表示Ry寄存器。立即数#D是在mvi指令存储到IR中之后,通过16位DIN输入的。 有一些指令,如加法指令和减法指令,需要在总线上多次传输数据,因此需要多个时钟周期才能完成。控制单元使用了一个两位计数器来区分这些指令执行的每一个阶段。当Run信号置位时,处理器开始执行DIN输入指令。当指令执行结束后,Done信号置位,下表列出四个指令在执行过程中每一个时间段置位的控制信号。时间指令T0T1T2T3(mv):I0(mvi):I1(add):I2(sub):I3IRinIRinIRinIRinR
4、Yout,RXin,DoneDINout,RXin,DoneRXout,AinRXout,Ain-RYout,Gin,AddsubRYout,Gin,Addsub-Gout,RXin,DoneGout,RXin,Done二、实现功能说明2.1 mv Rx,Ry实现的功能:将寄存器Rx的值赋给寄存器Ry(以mv R0, R5为例)(1 )计数器为“00”时,指令寄存器的置位控制信号输入端IRin=1有效,将DIN输入的数据的高9位锁存。置位的控制信号如图3加粗黑线所示。图3(2)计数器为“01”时,首先控制单元根据设计器为“00”时输入的指令,向复用器发出选通控制信号,复用器根据该控制信号让R5
5、的值输出到总线上,然后控制单元控制寄存器R0将总线上的值锁存,完成整个寄存器对寄存器的赋值过程。置位的控制信号和数据流如图4加粗黑线所示。图42.2 mvi Rx,#D实现的功能:将的立即数#D赋给寄存器Rx(以mv R0, #D为例)(1)计数器为“00”时,指令寄存器的置位控制信号输入端IRin=1有效,将DIN输入的数据的高9位锁存。置位的控制信号如图5加粗黑线所示。图5(2)计数器为“01”时,首先控制单元根据设计器为“00”时输入的指令,向复用器发出选通控制信号,复用器根据该控制信号让DIN的值输出到总线上,然后控制单元控制寄存器R0将总线上的值锁存,完成整个立即数对寄存器的赋值过程
6、。置位的控制信号和数据流如图6加粗黑线所示。图62.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”时,
7、首先控制单元根据设计器为“00”时输入的指令,向复用器发出选通控制信号,复用器根据该控制信号让R1的值输出到总线上,然后控制单元控制加法/减法器addsub将寄存器A的值和总线上的值相加/相减并输出,接着寄存器G将加法/减法器addsub的计算结果锁存。置位的控制信号和数据流如图9加粗黑线所示。图9(4)计数器为“11”时,首先控制单元向复用器发出选通控制信号,复用器根据该控制信号让寄存器G的值输出到总线上,寄存器R0将总线上的值进行锁存,完成整个寄存器与对寄存器见加减法的运算过程。置位的控制信号和数据流如图10加粗黑线所示。图10三、单元模块设计说明4.1寄存器Registe寄存器R0R7、
8、寄存器A或寄存器G : 用于数据的存储。当时钟输入clk的上升沿到来且rin=1时,将数据输入端rxin15.0的数据锁存到寄存器中并从数据输出端rxout15.0输出;当rin=0时,输出端保持原来的值不变。寄存器Registe的VHDL代码: LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY registe isport( clk:in std_logic; rin:in std_logic; rxin:in std_logic_vector(15 downto 0); rxout:out std_logic_vector(15 downto
9、0);end entity registe;architecture one of registe isbegin process(clk) begin if clkevent 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时,取数据输入端rxin15.0的高9位将其锁存到寄存器中并从数据输出端rxout8.0输出;当rin=0时,输出端保持原来的值不变。指令寄存器IR的
10、VHDL代码:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY IR isport( 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 isbegin process(clk) begin if clkevent and clk=1 then if rin=1 then rxout=rxin(15 d
11、ownto 7); end if; end if; end process;end one;4.3加/减法器addsub加/减法器addsub用于处理两个输入的数据datain215.0 和datain115.0,当控制端Addsub=1时,两个数据输入端datain215.0 和datain115.0相加并从数据输出端dataout15.0输出;当控制端Addsub=0时,数据输入端datain215.0 减去datain115.0,结果从数据输出端dataout15.0输出。 加/减法器addsub的VHDL代码:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.A
12、LL;use ieee.std_logic_unsigned.all;ENTITY addsub isport( 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 issignal a,b:std_logic_vector(15 downto 0);beginprocess(adsub,ain,bi
13、n)beginif adsub=0 then about=ain+bin;elsif adsub=1 then about01101100不断循环;当clear=1时(清零端clear有效),对输出Q1.0同步清零,与时钟有关。 计数器counter的VHDL代码:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity counter isport( clk:in std_logic; clear:in std_logic; count:out std_logic_vector(1 down
14、to 0);end counter;architecture one of counter issignal c:std_logic_vector(1 downto 0);beginprocess(clk,clear)begin if clkevent 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复用器根据控制单元的控制信号将指定的输入数据输出到总线上。来自控制单元的控制信号为R0outR7out、Gout、DIN
15、out,输入数据位来自寄存器R0R7、寄存器A、数据输入端DIN,当控制信号的某一位为1时,将其对应的输入数据输出到总线上。复用器 multiplexers的VHDl代码:library ieee;use ieee.std_logic_1164.all;entity multiplexers isport ( 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
16、 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_vec
17、tor(15 downto 0);end multiplexers;architecture bhv of multiplexers isbegindout=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 000
18、0000000000000;end bhv;4.6控制单元control控制单元根据计数器发出的脉冲和DIN输入的操作指令对整个系统的其他模块进行控制,完成指定的操作。控制单元control的VHDL代码:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity control isport( reset:in std_logic; run:in std_logic; clk:in std_logic_vector(1 downto 0); irin:in std_logic_vector(8
19、 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:o
20、ut std_logic; addsub:out std_logic; gin:out std_logic; done:out std_logic);end control;architecture one of control isbeginprocess(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=
21、0; gin=0; done 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; addsub=0; gin=0; done=0; if run=0 then irout=1; else irout if(irin(8 downto 6)=000)then clear=1; irout=0; gout=0; dinout=0; ain=0; addsub=0; gin=0; doner0in=1;r1in
22、=0;r2in=0;r3in=0;r4in=0;r5in=0;r6in=0;r7inr1in=1;r0in=0;r2in=0;r3in=0;r4in=0;r5in=0;r6in=0;r7inr2in=1;r0in=0;r1in=0;r3in=0;r4in=0;r5in=0;r6in=0;r7inr3in=1;r0in=0;r1in=0;r2in=0;r4in=0;r5in=0;r6in=0;r7inr4in=1;r0in=0;r1in=0;r2in=0;r3in=0;r5in=0;r6in=0;r7inr5in=1;r0in=0;r1in=0;r2in=0;r3in=0;r4in=0;r6in
23、=0;r7inr6in=1;r0in=0;r1in=0;r2in=0;r3in=0;r4in=0;r5in=0;r7inr7in=1;r0in=0;r1in=0;r2in=0;r3in=0;r4in=0;r5in=0;r6innull;end case;case irin(2 downto 0)is when000=routroutroutroutroutroutroutroutnull;end case; elsif(irin(8 downto 6)=001)then clear=1; irout=0; gout=0; dinout=1; rout=00000000; ain=0; adds
24、ub=0; gin=0; doner0in=1;r1in=0;r2in=0;r3in=0;r4in=0;r5in=0;r6in=0;r7inr1in=1;r0in=0;r2in=0;r3in=0;r4in=0;r5in=0;r6in=0;r7inr2in=1;r0in=0;r1in=0;r3in=0;r4in=0;r5in=0;r6in=0;r7inr3in=1;r0in=0;r1in=0;r2in=0;r4in=0;r5in=0;r6in=0;r7inr4in=1;r0in=0;r1in=0;r2in=0;r3in=0;r5in=0;r6in=0;r7inr5in=1;r0in=0;r1in
25、=0;r2in=0;r3in=0;r4in=0;r6in=0;r7inr6in=1;r0in=0;r1in=0;r2in=0;r3in=0;r4in=0;r5in=0;r7inr7in=1;r0in=0;r1in=0;r2in=0;r3in=0;r4in=0;r5in=0;r6innull; 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; r6i
26、n=0; r7in=0; ain=1; addsub=0; gin=0; doneroutroutroutroutroutroutroutroutnull;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 if(irin(8 downto 6)=010)then clear=0; irout=0; gout=0; dinout=0
27、; r0in=0; r1in=0; r2in=0; r3in=0; r4in=0; r5in=0; r6in=0; r7in=0; ain=0; addsub=0; gin=1; doneroutroutroutroutroutroutroutroutnull;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; don
28、eroutroutroutroutroutroutroutroutnull;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 if(irin(8 downto 6)=010 or irin(8 downto 6)=011)then clear=0; irout=0; gout=1; dinout=0; rout=00000000;
29、 ain=0; addsub=0; gin=0; doner0in=1;r1in=0;r2in=0;r3in=0;r4in=0;r5in=0;r6in=0;r7inr1in=1;r0in=0;r2in=0;r3in=0;r4in=0;r5in=0;r6in=0;r7inr2in=1;r0in=0;r1in=0;r3in=0;r4in=0;r5in=0;r6in=0;r7inr3in=1;r0in=0;r1in=0;r2in=0;r4in=0;r5in=0;r6in=0;r7inr4in=1;r0in=0;r1in=0;r2in=0;r3in=0;r5in=0;r6in=0;r7inr5in=1
30、;r0in=0;r1in=0;r2in=0;r3in=0;r4in=0;r6in=0;r7inr6in=1;r0in=0;r1in=0;r2in=0;r3in=0;r4in=0;r5in=0;r7inr7in=1;r0in=0;r1in=0;r2in=0;r3in=0;r4in=0;r5in=0;r6innull; 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; adds
31、ub=0; gin=0; donenull;end case; end if;end process;end one; 4.7 数码管显示led 采集寄存器R0R7的值作为led的输入,将各寄存器值的低四位以19、AF分别显示在8个数码管,从而观察各寄存器值的变化。ledout6.0 为数码管段码输出端,control2.0 为第几个数码管有效的数码管选择端输出。数码管显示led的VHDL代码:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity led isport( 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_ve
限制150内