• 1. 第4讲 数字系统描述10/25/20181
  • 2. 目录 同步时序电路 同步时序电路设计一般方法 数字系统描述 寄存器传输语言 数据通路/控制器划分 简单CPU 简单CPU的VHDL描述10/25/20182
  • 3. 4.1 同步时序电路 两种类型 Mealy机:输出取决于当前状态和输入x1z1xn…zm………yry1Y1Yl组合电路存储器件时钟10/25/20183
  • 4. Moore机:输出仅取决于当前状态…时钟x1组合电路xnyry1Y1Ylz1zm存储器件组合电路………4.1 同步时序电路10/25/20184
  • 5. 输出逻辑 在高速电路中,希望状态机尽快产生输出。对于Moore机来说,通过对状态进行适当编码,可以省去输出逻辑。4.1 同步时序电路(续)10/25/20185
  • 6. 对于Mealy机,可采用流水线结构加快输出的速度。当前时钟周期内的输出取决于前一个时钟周期内的状态和输入。同时进行4.1 同步时序电路(续)10/25/20186
  • 7. 依据对功能要求的文字描述,构造出原始状态表或状态图; 将状态表或状态图中的状态数目最小化(状态化简,可选); 状态赋值; 将状态变量取值代入原始状态表中得二进制状态表(转移/输出表); 选择一种触发器; 构造激励表,用于获得与每一种状态/输入组合对应的下一个状态; 由激励表推导出激励方程F; 由状态表推导出输出方程G; 画出逻辑电路图。4.2 同步时序电路设计一般方法10/25/20187
  • 8. 例4.1:设计一个具有2个输入A和B,1个输出Z的时钟同步状态机,Z为1的条件是: 在前2个脉冲触发沿上,A的值相同;或者 从上一次第1个条件为真起,B的值一直为1; 否则,输出为0。 附加信息:定时图4.2 同步时序电路设计一般方法(续)10/25/20188
  • 9. 用Moore机来实现4.2 同步时序电路设计一般方法(续)10/25/20189
  • 10. 状态表的继续演进4.2 同步时序电路设计一般方法(续)10/25/201810
  • 11. 附加信息:定时图4.2 同步时序电路设计一般方法(续)10/25/201811
  • 12. 状态数目最少化 下面的右表显示了一个具有更多状态的状态表,它们同样也能完成上例的操作功能。 可以采用形式化方法来最小化状态表中的状态数目; 该表中,状态OK00和OKA0、 OK11和OKA1分别是等效的,可以分别去掉它们中间的任意1个 。4.2 同步时序电路设计一般方法(续)10/25/201812
  • 13. 状态分配 确定要用多少位二进制来表示状态表中的全部状态,并且将一个特定组合赋给每一个状态。状态赋值又称状态编码、状态赋值。 可能的状态分配方案很多 分配方案的好坏与所使用的触发器有关 必须考虑未使用的状态4.2 同步时序电路设计一般方法(续)10/25/201813
  • 14. 初始状态输出输入A每1位代表1个状态 对未用状态的处理 最小冒险法:一旦进入后可以脱离,减少风险;000110111/0x/z0/00/00/01/01/10/01/0 最小成本法:可简化激励函数F(利用无关最小项),降低成本。4.2 同步时序电路设计一般方法(续)10/25/201814
  • 15. 由二进制状态表和选定的触发器求出激励表 激励表:对于每一种状态编码和输入的组合,要使状态机进入所期望的下一状态(次态)所需的触发器激励输入值(描述状态机的特性)。4.2 同步时序电路设计一般方法(续)10/25/201815
  • 16. 假设未用状态转移到000状态的D1、D2、D3激励图(最小冒险法)4.2 同步时序电路设计一般方法(续)10/25/201816
  • 17. 假设未用状态永远不会出现(最小成本法)4.2 同步时序电路设计一般方法(续)10/25/201817
  • 18. 例4.2:设计一个有2个输入X和Y及1个输出Z的时钟同步状态电路。复位后,当X和Y输入1的个数为4的整数倍时,输出为1,否则输出为0。解:用Moore机来实现(要多少个状态?)4.2 同步时序电路设计一般方法(续)10/25/201818
  • 19. 4.2 同步时序电路设计一般方法(续)10/25/201819
  • 20. 现态次态 / 输出输入xyy(n+1)/ZMealy机状态表和状态图yx/zy(n+1)y/zxy(n+1)Z'Moore机状态表和状态图现态次态输入xyy(n+1)输出Z4.2 同步时序电路设计一般方法(续) 传统时序电路设计方法中,数据加工与状态机关联过于紧密!10/25/201820
  • 21. 4.3 数字系统描述 传统时序电路设计的一般方法不适合用来设计复杂电路!是状态机,有触发器可能有触发器保留中间结果 时间图(多相时钟、多时钟域) 用方框图划分数字系统为 数据通路:对输入数据进行加工,通常可使用“重用”技术。 控制器:控制数据加工的过程,具有与实际问题相关的特殊性。10/25/201821
  • 22. 4.3 数字系统描述(续) 算法状态机(ASM)图 软件设计与硬件设计相结合的产物; 一种形式化方法,可精确导出状态表,布尔表达式; 隐含定时信息。例4.3:简单交通灯控制(用FSM来描述有时可能不太明了)10/25/201822
  • 23. 状态框状态名状态值输出 信号4.3 数字系统描述(续) 状态框 3种赋值表示 X=RED:仅本状态周期内为RED; Y:仅本状态周期内为1; Z1:本周期末,即下一周期的开始为1,直到被清零。 1个时钟周期内完成。10/25/201823
  • 24. 判决框4.3 数字系统描述(续) 判决框 紧跟某一状态框并与之相关联; 判决操作与状态框内的动作在同一时钟周期内完成; 判决变量在同一周期的开始必须有效; 可有2个或多个分枝。10/25/201824
  • 25. 有条件输出框4.3 数字系统描述(续) 有条件输出框 紧跟某一判决框; 与状态框的信号在同一时钟周期内完成赋值; 信号可以因为输入发生变化而改变(对应于Mealy型电路)。10/25/201825
  • 26. 4.3 数字系统描述(续) ASM块 由一个状态框和若干个判决框、条件框组成; 表示一个时钟周期内的系统状态; 只有一个入口,可有多个出口。10/25/201826
  • 27. library ieee; use ieee.std_logic_1164.all; entity traffic is port (clock, timed, car: in std_logic; start_timer, major_green, minor_grenn: out std_logic); end entity traffic; architecture asm1 of traffic is begin process (clock, timed, car) is type state_type is (G, R); variable state: state_type; begin start_timer<=‘0’;4.3 数字系统描述(续)10/25/201827
  • 28. case state is when G=> major_green<=‘1’; minor_green<=‘0’; if (car=‘1’) then start_timer<=‘1’; if (rising_edge(clock)) then state:=R; end if; end if; when R=> major_green<=‘0’; minor_green<=‘1’; if (timed=‘1’ and rising_edge(clock)) then state:=G; end if; end case; end process; end architecture asm1;4.3 数字系统描述(续)10/25/201828
  • 29. architecture asm2 of traffic is type state_type is (G, R); signal present_state, next_state: state_type; begin seq: process (clock) is begin if (rising_edge(clock)) then present_state<=next_state; end if; end process seq; com: process(car, timed, present_state) is begin start_timer<=‘0’; case present_state is when G=> major_green<=‘1’;4.3 数字系统描述(续)x1z1xn…zm………yry1Y1Yl组合电路存储器件时钟10/25/201829
  • 30. minor_green<=‘0’; if (car=‘1’) then start_timer<=‘1’; next_state<=R; else next_state<=G; end if; when R=> major_green<=‘0’; minor_green<=‘1’; if (timed=‘1’) then next_state<=G; else next_state<=R; end if; end case; end process com; end architecture asm2;4.3 数字系统描述(续)10/25/201830
  • 31. architecture asm3 of traffic is type state_type is (G, R); signal present_state, next_state: state_type; begin seq: process (clock) is begin if (rising_edge(clock)) then present_state<=next_state; end if; end process seq; ns: process(car, timed, present_state) is begin case present_state is when G=> if (car=‘1’) then next_state<=R;4.3 数字系统描述(续)10/25/201831
  • 32. else next_state<=G; end if; when R=> if (timed=‘1’) then next_state<=G; else next_state<=R end if; end case; end process ns; op: process(car, present_state) is begin start_timer<=‘0’; if (present_state=G) then major_green<=‘1’; minor_green<=‘0’;4.3 数字系统描述(续)10/25/201832
  • 33. if (car=‘1’) then start_timer<=‘1’; end if; else major_green<=‘0’; minor_green<=‘1’; end if; end process op; end architecture asm3;4.3 数字系统描述(续) 一个状态机可用1个或多个进程来描述。但如果要能够被综合,则应该: 用来描述组合模块的进程确实是组合的; 用来描述时序模块的进程只有一条边沿敏感语句。10/25/201833
  • 34. 用来描述数据通路的工作; 以寄存器(不是门和触发器)作为数字系统的基本元件; 寄存器:所有形式的寄存器,如移位寄存器、计数器、存储器; 任何时序电路均可以看成寄存器。4.3 数字系统描述(续)是状态机,有触发器可能有触发器保留中间结果 寄存器传输语言10/25/201834
  • 35. 语句 由控制函数和微操作表构成; 控制函数:确定控制条件和微操作时序,由定时信号组成,受操作结果影响; 微操作表:确定对寄存器中的信息所进行了的基本操作; 常见的微操作:传送、算术运算、逻辑运算、移位。4.3 数字系统描述(续)10/25/201835
  • 36. 4.3 数字系统描述(续) 寄存器传送微操作:对寄存器所存信息的加工和存储。10/25/201836
  • 37. 4.3 数字系统描述(续) 算术运算微操作:有加、减、取反等。10/25/201837
  • 38. 逻辑运算微操作:将寄存器中的每一位当作一个二进制变量来处理,有与、或、非等。逻辑微操作符号说明寄存器A的所有位求反,结果送寄存器F寄存器A和B的相应位相“或”,结果送寄存器F寄存器A和B的相应位相“与”,结果送寄存器F寄存器A和B的相应位相“异或”,结果送寄存器F4.3 数字系统描述(续)10/25/201838
  • 39. 4.3 数字系统描述(续) 移位微操作:对寄存器中的数据进行移位。移位微操作符号说明寄存器A左移一位寄存器A右移一位 条件微操作:有时可能会使用。 P: if(条件)then(微操作)else(微操作)例如: 与下面两个语句等价:10/25/201839
  • 40. 例4.4:用RTL描述串行加法器。4.3 数字系统描述(续)10/25/201840
  • 41. 4.4 数据通路与控制器划分 数据通路: 对输入数据加工,通常可使用“重用”技术; 由寄存器和对寄存器中的数据进行的操作构成。 控制器: 控制数据加工的过程,具有与实际问题相关的特殊性。 寄存器传输操作:寄存器中数据的流动及操作 寄存器 操作 操作序列控制10/25/201841
  • 42. 有很多可用于状态机分解、优化的理论。但工程上常常只要找出那些比较容易从主体设计中分离,并独立实现的结构即可。4.4 数据通路与控制器划分(续) 交通信号灯ASM的两种画法10/25/201842
  • 43. 交通信号灯ASM的两种画法 划分4.4 数据通路与控制器划分(续) 控制通路 数据通路10/25/201843
  • 44. 一个更复杂的例子4.4 数据通路与控制器划分(续)10/25/201844
  • 45. 4.4 数据通路与控制器划分(续) 从ASM到电路图10/25/201845
  • 46. 4.5 简单CPU 数据通路10/25/201846
  • 47. 4.5 简单CPU(续) 控制信号(微操作)10/25/201847
  • 48. 寻址方式 直接 立即 间接 相对4.5 简单CPU(续) 指令 存数 取数 加 减 为零转移简单CPU的ASM(使用RTL描述)取操作数10/25/201848
  • 49. 4.5 简单CPU(续)简单CPU的ASM(使用控制信号描述)10/25/201849
  • 50. 4.5 简单CPU(续) 包含分支指令的简单CPU的ASM取操作数10/25/201850
  • 51. library ieee; use ieee.std_logic_1164.all; package cpu_defs is type opcode is (load, store, add, sub, bne); constant word_w: natural:=8; constant op_w: natural:=3; constant rfill: std_logic_vector(op_w-1 downto 0):=(other=>’0’); function slv2op (slv: in std_logic_vector) return opcode; function op2slv (op: in opcode) return std_logic_vector; end package cpu_defs; 包定义4.6 简单CPU的VHDL描述操作码清010/25/201851
  • 52. package body cpu_defs is type optable is array (opcode) of std_logic_vector(op_w-1 downto 0); constant trans_table: optable:=(“000”, ”001”, ”010”, ”011”, ”100”); function op2slv (op: in opcode) return std_logic_vector is --返回操作码 begin return trans_table (op); end function op2slv; function slv2op (slv: in std_logic_vector) return opcode is --返回操作符 variable transop: opcode; begin for i in opcode loop if slv=trans_table(i) then transop:=i;4.6 简单CPU的VHDL描述(续) 包体描述 end if; end loop; return transop; end function slv2op; end package body cpu_defs;10/25/201852
  • 53. library ieee; use ieee.std_logic_1164.all; use work.cpu_defs.all; entity sequencer is port (clock, reset: in std_logic; op: in opcode; z_flage: in std_logic; ACC_bus, load_ACC, PC_bus, load_PC, load_IR, load_MAR, MDR_bus, load_MDR, ALU_ACC, ALU_add, ALU_sub, INC_PC, Addr_bus, CS, R_NW: out std_logic); end entity sequencer; architecture rtl of sequencer is type state is (s0, s1, s2, s3, s4, s5, s6, s7, s8, s9); signal present_state, next_state: state; 状态机(时序产生器)描述4.6 简单CPU的VHDL描述(续)10/25/201853
  • 54. begin seq: process (clock, reset) is begin if reset=‘1’ then present_state<=s0; elsif rising_edge(clock) then present_state<=next_state; end if; end process seq; com: process (present_state, op, z_flag) is begin ACC_bus<=‘0’; --置全部输出无效 load_ACC <=‘0’; PC_bus <=‘0’; load_PC <=‘0’; load_IR <=‘0’; load_MAR <=‘0’; MDR_bus <=‘0’; load_MDR <=‘0’; ALU_ACC <=‘0’; ALU_add <=‘0’; ALU_sub <=‘0’; INC_PC <=‘0’; Addr_bus <=‘0’; CS <=‘0’; R_NW <=‘0’; case present_state is when s0=> …… when s1=> …… end process com; end architecture rtl;4.6 简单CPU的VHDL描述(续)10/25/201854
  • 55. library ieee; use ieee.std_logic_1164.all, ieee.numeric_std.all; use work.cpu_defs.all; entity ALU is port (clock, reset: in std_logic; ACC_bus, load_ACC, ALU_ACC, ALU_add, ALU_sub: in std_logic; sysbus: inout std_logic_vector(word_w-1 downto 0); z_flage: out std_logic); end entity ALU; architecture rtl of ALU is signal acc: unsigned(word_w-1 downto 0); constant zero: unsigned(word_w-1 downto 0):=(other=>’0’); begin …… 数据通路(ALU和PC,IR,RAM)描述4.6 简单CPU的VHDL描述(续)10/25/201855
  • 56. library ieee; use ieee.std_logic_1164.all; use work.cpu_defs.all; entity CPU is port (clock, reset: in std_logic; sysbus: inout std_logic_vector(word_w-1 downto 0)); end entity CPU; architecutre top of CPU is component sequencer is port (……); end component sequencer; component IR is …… component PC is …… 总体合成(包括状态机和数据通路)描述4.6 简单CPU的VHDL描述(续)10/25/201856
  • 57. component ALU is …… component RAM is …… signal ACC_bus, load_ACC, PC_bus, load_PC, load_IR, load_MAR, MDR_bus, load_MDR, ALU_ACC, ALU_add, ALU_sub, INC_PC, Addr_bus, CS, R_NW, z_flage: std_logic; signal op: opcode; begin s1: sequencer port map (……); i1: IR port map (……); p1: PC port map (……); a1: ALU port map (……); r1: RAM port map (……); end architecture top;4.6 简单CPU的VHDL描述(续)10/25/201857
  • 58. library ieee; use ieee.std_logic_1164.all; use work.cpu_defs.all; entity testcpu is end entity testcpu; architecture tb of testcpu is component CPU is port (clock, reset: in std_logic; sysbus: inout std_logic_vector(word_w-1 downto 0)); end component CPU; signal clock, reset: std_logic:=‘0’; signal sysbus: std_logic_vector(word_w-1 downto 0); begin c1: CPU port map (clock, reset, sysbus); reset<=‘1’ after 1 ns, ‘0’ after 2 ns clock<= not clock after 10 ns; end component tb; 测试描述(程序事先存放在RAM中,不可综合)4.6 简单CPU的VHDL描述(续)10/25/201858
  • 59. Configration mapping of testcpu is for tb for c1: CPU use entity work.cpu(top); for top for s1: sequencer use entity work.sequencer(rtl); end for; for i1: IR use entity work.ir(rtl); end for; …… end for; end configration mapping; 配置描述(此处为保证完整性)4.6 简单CPU的VHDL描述(续)10/25/201859