1、EDA技术与VHDL,第6章 16位CISC CPU设计,KX康芯科技,6.1 顶层系统设计,6.1.1 16位CPU的组成结构,图6-1 16位CPU结构框图,KX康芯科技,6.1 顶层系统设计,6.1.2指令系统设计,1指令格式,KX康芯科技,图6-1 单字节指令格式,(1)单字指令,6.1 顶层系统设计,KX康芯科技,图6-2 双字指令格式,(2)双字指令,图6-3 双字节指令,6.1 顶层系统设计,2指令操作码,KX康芯科技,表6-1 操作码功能表,6.1 顶层系统设计,KX康芯科技,表6-2 常用指令举例,2指令操作码,6.1 顶层系统设计,KX康芯科技,1. CPU元件的VHDL描
2、述,6.1.3 顶层结构的VHDL设计,【例6-1】 library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_arith.all; package cpu_lib is type t_shift is (shftpass, shl, shr, rotl, rotr); subtype t_alu is unsigned(3 downto 0); constant alupass : unsigned(3 downto 0) := “0000“; constant andOp : unsigned(3 downto 0) :=
3、“0001“; constant orOp : unsigned(3 downto 0) := “0010“; constant notOp : unsigned(3 downto 0) := “0011“; constant xorOp : unsigned(3 downto 0) := “0100“; constant plus : unsigned(3 downto 0) := “0101“;,6.1 顶层系统设计,KX康芯科技,1. CPU元件的VHDL描述,6.1.3 顶层结构的VHDL设计,constant alusub : unsigned(3 downto 0) := “011
4、0“; constant inc : unsigned(3 downto 0) := “0111“; constant dec : unsigned(3 downto 0) := “1000“; constant zero : unsigned(3 downto 0) := “1001“; type t_comp is (eq, neq, gt, gte, lt, lte); subtype t_reg is std_logic_vector(2 downto 0); type state is (reset1, reset2, reset3, reset4, reset5,reset6, e
5、xecute, nop, load, store, move, load2, load3, load4, store2, store3,store4, move2, move3, move4,incPc, incPc2, incPc3, incPc4, incPc5, incPc6, loadPc,loadPc2,loadPc3, loadPc4, bgtI2, bgtI3, bgtI4, bgtI5, bgtI6, bgtI7,bgtI8, bgtI9,bgtI10, braI2, braI3, braI4, braI5, braI6, loadI2,loadI3, loadI4, load
6、I5, loadI6,inc2, inc3, inc4); subtype bit16 is std_logic_vector(15 downto 0); end cpu_lib;,6.1 顶层系统设计,KX康芯科技,1. CPU元件的VHDL描述,6.1.3 顶层结构的VHDL设计,【例6-2】 library IEEE; use IEEE.std_logic_1164.all; use work.cpu_lib.all; entity top is end top; architecture behave of top is component mem port (addr : in bi
7、t16;sel,rw : in std_logic;ready : out std_logic; data : inout bit16); end component; component cpu port(clock, reset, ready : in std_logic;addr : out bit16; rw, vma : out std_logic;data : inout bit16); end component; signal addr, data : bit16 ; signal vma, rw, ready : std_logic; signal clock, reset
8、: std_logic := 0; begin clock = not clock after 50 ns ;reset = 1, 0 after 100 ns; m1 : mem port map (addr, vma, rw, ready, data); u1 : cpu port map(clock, reset, ready, addr, rw, vma,data); end behave;,KX康芯科技,2. 顶层文件的原理图设计,图6-5 CPU顶层结构图(详细内容浏览www.kx-),6.1 顶层系统设计,KX康芯科技,3CPU与LCD显示模块的接口,6.1.3 顶层结构的VHD
9、L设计,图6-6 显示模块dsp的实体结构图,6.1 顶层系统设计,KX康芯科技,3CPU与LCD显示模块的接口,6.1.3 顶层结构的VHDL设计,图6-7 LCD显示屏的数据显示,KX康芯科技,6.1.4 软件设计实例,表6-3 示例程序,6.1 顶层系统设计,KX康芯科技,6.1.4 软件设计实例,表6-4 存储器初始化文件RAM_16.mif的内容,6.1 顶层系统设计,KX康芯科技,6.2.1 运算器ALU,表6-5 运算器ALU的功能,6.2 CPU基本部件设计,KX康芯科技,6.2.1 运算器ALU,图6-8 运算器ALU结构图,6.2 CPU基本部件设计,KX康芯科技,6.2.
10、1 运算器ALU,图6-5 运算器ALU结构图,6.2 CPU基本部件设计,【例6-3】 library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_unsigned.all; use work.cpu_lib.all; entity alu is port( a, b : in bit16; sel : in t_alu; c : out bit16 ); end alu; architecture rtl of alu is begin aluproc: process(a, b, sel) begin case sel is
11、 when alupass= c c c c c c c c c c c= “0000000000000000“ after 1 ns; end case;end process; end rtl;,KX康芯科技,6.2.1 运算器ALU,图6-9 运算器ALU的仿真波形,6.2 CPU基本部件设计,KX康芯科技,6.2.1 运算器ALU,表6-6 ALU运算仿真结果说明,6.2 CPU基本部件设计,KX康芯科技,6.2.2 比较器COMP,表6-7比较器的运算类型,6.2 CPU基本部件设计,KX康芯科技,6.2.2 比较器COMP,6.2 CPU基本部件设计,【例6-4】 library
12、IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_arith.all; use IEEE.std_logic_unsigned.all; use work.cpu_lib.all; entity comp is port( a, b : in bit16;sel : in t_comp;compout : out std_logic); end comp; architecture rtl of comp is begin compproc: process(a, b, sel) begin case sel is when eq =
13、if a = b then compout if a /= b then compout if a b then compout if a = b then compout if a if a = b then compout = 1 after 1 ns ; else compout = 0 after 1 ns ;end if; end case ; end process; end rtl;,KX康芯科技,6.2.2 比较器COMP,图6-10比较器结构图,6.2 CPU基本部件设计,KX康芯科技,6.2.2 比较器COMP,表6-8比较器COMP的仿真波形说明,6.2 CPU基本部件设
14、计,KX康芯科技,6.2.2 比较器COMP,图6-11 比较器COMP的仿真波形图,6.2 CPU基本部件设计,KX康芯科技,6.2.3 控制器CONTROL,图6-12 控制器CONTROL的实体结构图,6.2 CPU基本部件设计,KX康芯科技,6.2 CPU基本部件设计,【例6-5】 library IEEE; use IEEE.std_logic_1164.all; use work.cpu_lib.all; entity control isport( clock,reset ,ready,compout: in std_logic; instrReg : in bit16;prog
15、CntrWr,progCntrRd ,addrRegWr,addrRegRd,outRegWr, outRegRd : out std_logic;shiftSel : out t_shift; aluSel : out t_alu; compSel : out t_comp; opRegRd,opRegWr,instrWr,regRd,regWr ,rw,vma: out std_logic; regSel : out t_reg ); end control; architecture rtl of control is signal current_state, next_state :
16、 state; begin,(接下页),KX康芯科技,6.2 CPU基本部件设计,nxtstateproc: process( current_state, instrReg, compout,ready) begin progCntrWr aluSel aluSel outRegRd outRegRd vma vma=1; rw=0; if ready = 1 then instrWr=1; next_state=execute; else next_state = reset6; end if;,(接下页),KX康芯科技,6.2 CPU基本部件设计,when execute = case
17、instrReg(15 downto 11) is when “00000“ = next_state regSel regSel regSel progcntrRd progcntrRd regSel regSelnext_state = incPc;,(接下页),KX康芯科技,6.2 CPU基本部件设计,end case; when load2 = regSel vma vma regSel regSel regSel regSel outRegRd outRegRd progcntrRd = 1; alusel = inc; shiftsel = shftpass; outregWr =
18、 1; next_state = loadI3;,(接下页),KX康芯科技,6.2 CPU基本部件设计,when loadI3 = outregRd outregRd vma vma progcntrRd outregRd outregRd vma vma regSel = instrReg(5 downto 3); regRd = 1;,(接下页),KX康芯科技,6.2 CPU基本部件设计,opRegWr opRegRd opRegRd progcntrRd progcntrRd outregRd outregRd vma vma = 1; rw = 0; if ready = 1 then
19、 progcntrWr = 1; next_state = loadPc;,(接下页),KX康芯科技,6.2 CPU基本部件设计,else next_state regSel outregRd outregRd progcntrRd progcntrRd vma vma progcntrRd progcntrRd outregRd outregRd=1; progcntrWr=1;,(接下页),KX康芯科技,6.2 CPU基本部件设计,addrregWr vma vma next_state = incPc; end case; end process; controlffProc:proce
20、ss(clock, reset) begin if reset = 1 then current_state = reset1 after 1 ns; elsif clockevent and clock = 1 then current_state = next_state after 1 ns; end if; end process; end rtl;,KX康芯科技,6.2.4 寄存器与寄存器阵列,图6-13 寄存器REG的实体结构和RTL图,6.2 CPU基本部件设计,1寄存器REG,KX康芯科技,6.2.4 寄存器与寄存器阵列,6.2 CPU基本部件设计,1寄存器REG,【例6-6】
21、 library IEEE; use IEEE.std_logic_1164.all; use work.cpu_lib.all; entity reg is port( a : in bit16; clk : in std_logic; q : out bit16); end reg; architecture rtl of reg is begin regproc: process begin wait until clk event and clk = 1; q = a after 1 ns; end process; end rtl;,KX康芯科技,6.2.4 寄存器与寄存器阵列,图6
22、-14 寄存器阵列RegAarray的结构图和RTL图,6.2 CPU基本部件设计,2寄存器阵列RegArray,KX康芯科技,6.2 CPU基本部件设计,【例6-7】regarray.vhd library IEEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_unsigned.all; use work.cpu_lib.all; entity regarray is port( data : in bit16; sel : in t_reg; en,clk : in std_logic; q : out bit16); end rega
23、rray; architecture rtl of regarray is type t_ram is array (0 to 7) of bit16; signal temp_data : bit16; begin process(clk,sel) variable ramdata : t_ram; begin if clkevent and clk = 1 then ramdata(conv_integer(sel) := data; end if; temp_data = ramdata(conv_integer(sel) after 1 ns; end process; process
24、(en, temp_data) begin if en = 1 then q = temp_data after 1 ns; else q =“ZZZZZZZZZZZZZZZZ“ after 1 ns; end if; end process; end rtl;,KX康芯科技,6.2.4 寄存器与寄存器阵列,图6-15 寄存器阵列regarray.VHD的仿真波形,6.2 CPU基本部件设计,2寄存器阵列RegArray,KX康芯科技,6.2.5 移位寄存器SHIFT,6.2 CPU基本部件设计,【例6-8】 library IEEE; use IEEE.std_logic_1164.all;
25、 use IEEE.std_logic_arith.all; use work.cpu_lib.all; entity shift is port ( a : in bit16; sel : in t_shift ; y : out bit16); end shift; architecture rtl of shift is begin shftproc: process(a, sel) begin case sel is when shftpass =y y y y y y = “0000000000000000“ after 1 ns; end case; end process; en
26、d rtl;,KX康芯科技,6.2.5 移位寄存器SHIFT,6.2 CPU基本部件设计,表6-9 SHIFT移位运算类型说明,KX康芯科技,6.2.5 移位寄存器SHIFT,6.2 CPU基本部件设计,图6-16 移位寄存器的结构图,KX康芯科技,6.2.5 移位寄存器SHIFT,6.2 CPU基本部件设计,图6-17 移位寄存器SHIFT的仿真波形图,KX康芯科技,6.2.6 三态寄存器TRIREG,6.2 CPU基本部件设计,图6-18 三态寄存器triReg的结构图和RTL图,KX康芯科技,6.2.6 三态寄存器TRIREG,6.2 CPU基本部件设计,【例6-9】 library I
27、EEE; use IEEE.std_logic_1164.all; use IEEE.std_logic_unsigned.all; use work.cpu_lib.all; entity trireg is port( a : in bit16; en,clk : in std_logic; q : out bit16); end trireg; architecture rtl of trireg is signal val : bit16; begin triregdata: process begin wait until clkevent and clk = 1; val = a;
28、 end process; trireg3st: process(en, val) begin if en = 1 then q = val after 1 ns; elsif en = 0 then q = “ZZZZZZZZZZZZZZZZ“ after 1 ns; else q = “XXXXXXXXXXXXXXXX“ after 1 ns; - exemplar_translate_on end if; end process; end rtl;,KX康芯科技,6.3.1 编辑仿真波形文件,6.3 CPU的时序仿真与实现,1建立仿真波形VWF文件,图6-16 仿真输出波形,KX康芯科技
29、,6.3.1 编辑仿真波形文件,6.3 CPU的时序仿真与实现,1建立仿真波形VWF文件,表6-10 图6-19仿真波形对应的程序,KX康芯科技,6.3.1 编辑仿真波形文件,6.3 CPU的时序仿真与实现,1建立仿真波形VWF文件,图6-20 CPU复位和第1条指令的仿真波形,KX康芯科技,6.3.1 编辑仿真波形文件,6.3 CPU的时序仿真与实现,2CPU的RTL电路结构图,图6-21 STEP时序控制器的RTL电路图,KX康芯科技,图6-22 三态寄存器的RTL电路图,KX康芯科技,6.3.2 16位CPU的调试运行,6.3 CPU的时序仿真与实现,6.3.3 应用嵌入式逻辑分析仪调试
30、CPU,图6-23 信号调入观察窗口,KX康芯科技,6.3 CPU的时序仿真与实现,6.3.3 应用嵌入式逻辑分析仪调试CPU,图6-24 全屏编辑窗,KX康芯科技,6.3 CPU的时序仿真与实现,6.3.3 应用嵌入式逻辑分析仪调试CPU,图6-25 SignalTapII数据窗的实时信号,KX康芯科技,6.3 CPU的时序仿真与实现,6.3.4 对配置器件编程,图6-26 ByteBlasterII接口AS模式编程窗口,KX康芯科技,6.4 应用程序设计实例,6.4.1 乘法算法及其实现,图6-27 乘法算法1的硬件实现,KX康芯科技,6.4 应用程序设计实例,6.4.1 乘法算法及其实现
31、,图6-28 改进后的乘法算法2的硬件实现,KX康芯科技,6.4 应用程序设计实例,6.4.1 乘法算法及其实现,图6-29 乘法算法1的流程图,KX康芯科技,6.4 应用程序设计实例,6.4.1 乘法算法及其实现,图6-30 乘法算法2的流程图,KX康芯科技,6.4 应用程序设计实例,6.4.2 除法算法及其实现,图 6-31 除法算法1的硬件结构,KX康芯科技,6.4 应用程序设计实例,6.4.2 除法算法及其实现,图 6-32 除法算法2的硬件结构,习 题,6-1对CPU进行修改,为其增加一个状态寄存器FLAG,FLAG可以中保存进位标志和零标志。 6-2修改CPU,为其加入一条带进位加
32、法指令ADDC,给出ADDC指令的运算流程,对控制器的控制程序作相应的修改。 6-3说明在16位CPU中,PCPC+1操作是如何执行的? 6-4根据图6-26和图6-27的电路结构和流程图,设计乘法应用程序,进行计算机仿真验证程序功能,并在16位CPU上调试运行。 6-5根据图6-30和图6-31的电路结构和流程图,设计除法应用程序,进行计算机仿真验证程序功能,并在16位CPU上调试运行。 6-6请说明CONTROL.vhd中的两个进程各自的作用,两个进程之间是如何发生联系的? 6-7简要说明16位CPU的复位过程。6-8根据control.vhd中状态机的描述,说明指令MOVE R1,R2
33、的执行过程。,实 验 与 设 计,实验6-1. 16位计算机基本部件实验,实验6-2. 16位CPU设计综合实验,实 验 与 设 计,表6-11 汇编语言指令格式,实 验 与 设 计,图6-33 在QUARTUS II环境下编辑ram_16.mif文件,实 验 与 设 计,图6-34用In-System Memory Content Editor读取的数据,实 验 与 设 计,图6-35 数据搬运完毕后的In-System Memory Content Editor窗,实 验 与 设 计,图6-36 嵌入式逻辑分析仪设置情况图窗,实 验 与 设 计,图6-37 CPU运行时逻辑分析仪显示波形,
34、实 验 与 设 计,图6-38 LCD液晶显示屏,实 验 与 设 计,表6-12 LCD液晶显示屏显示数据说明,实 验 与 设 计,图6-39 CPU_16仿真波形,图6-37 CPU_16仿真波形,实 验 与 设 计,6-1. 用原理图输入法设计8位全加器 (4) 实验内容2:建立一个更高层次的原理图设计,利用以上获得的1位全加器构成8位全加器,并完成编译、综合、适配、仿真和硬件测试。建议选择电路模式1(附录图3);键2、键1输入8位加数;键4、键3输入8位被加数;数码6/5显示加和;D8显示进位cout。 (5) 实验报告:详细叙述8位加法器的设计流程;给出各层次的原理图及其对应的仿真波形
35、图;给出加法器的时序分析情况;最后给出硬件测试流程和结果。,实 验 与 设 计,6-2. 用原理图输入法设计较复杂数字系统 (1) 实验目的:熟悉原理图输入法中74系列等宏功能元件的使用方法,掌握更复杂的原理图层次化设计技术和数字系统设计方法。完成8位十进制频率机的设计。 (2) 原理说明:利用6.2节介绍的2位计数器模块,连接它们的计数进位,用4个计数模块就能完成一个8位有时钟使能的计数器;对于测频控制器的控制信号,在仿真过程中应该注意它们可能的毛刺现象。最后按照6.2节中的设计流程和方法即可完成全部设计。 (3) 实验内容:首先完成2位频率计的设计,然后进行硬件测试,建议选择电路模式2;数码2和1显示输出频率值,待测频率F_IN接clock0;测频控制时钟CLK接clock2,若选择clock2 = 8Hz,门控信号CNT_EN的脉宽恰好为1秒。然后建立一个新的原理图设计层次,在此基础上将其扩展为8位频率计,仿真测试该频率计待测信号的最高频率,并与硬件实测的结果进行比较。 (4) 实验报告:给出各层次的原理图、工作原理、仿真波形图和分析,详述硬件实验过程和实验结果。,