文档详情

第4章基本数字逻辑单元的设计

工****
实名认证
店铺
PPT
320KB
约62页
文档ID:576462051
第4章基本数字逻辑单元的设计_第1页
1/62

第四章基本数字逻辑单元的设计基本数字逻辑单元的设计 4.1 组合逻辑设计组合逻辑设计4.1.2 三态缓冲器和总线缓冲器三态缓冲器和总线缓冲器 8bit单向总线缓冲器单向总线缓冲器 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY tri_buf8 IS PORT (din::IN STD_LOGIC_VECTOR (7 DOWN TO 0); dout::OUT STD_LOGIC_VECTOR (7 DOWN TO 0); en::IN STD_LOGIC); END tri_buf8; ARCHITECTURE data_flow OF tri_buf8 IS PROCESS (en, din) BEGIN IF (en='1') THEN dout <= din; ELSE dout <= "ZZZZZZZZ"; END IF; END PROCESS; END data_flow ;Endin(0)din(1)din(2)din(3)din(4)din(5)din(6)din(7)dout(0)dout(1)dout(2)dout(3)dout(4)dout(5)dout(6)dout(7) 双向总线缓冲器双向总线缓冲器 用用VHDL语言描述的双向总线缓冲器。

语言描述的双向总线缓冲器 en dir 功能功能 1 X 高阻态高阻态 0 0 a<=b 0 1 b<=aadirenb LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; ENTITY dobl_tri_buf8 IS PORT (a, b::INOUT STD_LOGIC_VECTOR (7 DOWN TO 0); dir, en::IN STD_LOGIC); END dobl_tri_buf8;; ARCHITECTURE rtl OF dobl_ tri_buf8 IS SIGNAL aout, bout::STD_LOGIC_VECTOR (7 DOWN TO 0 ); BEGIN P1: PROCESS (a, dir, en) BEGIN IF ((en='0') AND (dir='1')) THEN bout <= a; ELSE bout <="ZZZZZZZZ"; END IF; b <= bout; END PROCESS P1; P2: PROCESS (b, dir, en) BEGIN IF ((en='0') AND (dir='0')) THEN aout <= b; ELSE aout <= "ZZZZZZZZ"; END IF a <= aout; END PROCESS P2; END rtl; BCD码码—段选码译码器。

段选码译码器 BCD码输入与码输入与LED显示器字段的对应关系显示器字段的对应关系 BCD码码 数字数字 显显 示示 段段 h g f e d c b a 0000 0 1 1 0 0 0 0 0 0 0001 1 1 1 1 1 1 0 0 1 0010 2 1 0 1 0 0 1 0 0 0011 3 1 0 1 1 0 0 0 0 0100 4 1 0 0 1 1 0 0 1 0101 5 1 0 0 1 0 0 1 0 0110 6 1 0 0 0 0 0 1 0 0111 7 1 0 1 0 0 1 1 1 1000 8 1 0 0 0 0 0 0 0 1001 9 1 0 0 1 0 0 0 0 其其 它它 1 1 1 1 1 1 1 1BCD-段选码译码器段选码译码器d0 d1 d2 d3abc.hgdefVcc LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;;ENTITY seg_del IS PORT (d::IN STD_LOGIC VECTOR (3 DOWN TO 0 ); q::OUT BIT_VECTOR (7 DOWN TO 0)); END seg_del;ARCHITECTURE seg_rtl OF seg_del IS BEGIN CASE d IS WHEN "0000" => q <= "11000000"; WHEN "0001" => q <= "11111001"; WHEN "0010" => q <= "10100100"; WHEN "0011" => q <= "10110000"; WHEN "0100" => q <= "10011001"; WHEN "0101" => q <= "10010010"; WHEN "0110" => q <= "10000010"; WHEN "0111" => q <= "11011000"; WHEN "1000" => q <= "10000000"; WHEN "1001" => q <= "10010000"; WHEN OTHERS => q <="11111111"; END CASE;END seg_rtl; 4.1.4 运算器的设计运算器的设计 一位全加器的设计一位全加器的设计. LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;;ENTITY full_adder ISPORT (a, b, ci:: IN STD_LOGIC; sum, cout:: OUT STD_LOGIC);END full_adder; ARCHITECTURE rtl OF full_adder IS BEGIN sum <= a XOR b XOR ci;; cout <= (a AND b) OR (a AND ci ) OR ( b AND ci);; END rtl;a sumb ci cout 4 4位串行进位加法器位串行进位加法器 ci a bsum coci a bsum coci a bsum coci a bsum co S0 S1 S2 S3 CO CI A0 B0 A1 B1 A2 B2 A3 B3 SUM CI A BSUM CI A BSUM CI A BSUM CI A B CI0 A0 B0 CI1 A1 B1 CI2 A2 B2 CIn-1 An-1 Bn-1 进位产生逻辑进位产生逻辑S0S1S3Sn-1coutCI A[0: n-1] B[0: n-1]N位超位超前进位前进位加法器加法器 超前进位加法器超前进位加法器 各位加法器产生进位的逻辑表达式为:各位加法器产生进位的逻辑表达式为:定义定义 为进位生成函数为进位生成函数,定义定义 为进位传递函数为进位传递函数, 则则全加器的各位和为:全加器的各位和为: 4位超前进位加法器位超前进位加法器LIBRARY IEEE;USE IEEE STD_LOGIC_1164.ALL;ENTITY adder4 IS PORT (a, b::IN STD_LOGIC_VECTOR (3DOWN TO 0 ) ci::IN STD_LOGIC; sum::OUT STD_LOGIC_VECTOR (3 DOWN TO 0 ); cout::OUT STD_LOGIC);END adde4r;;ARCHITECTURE rtl_adder4 OF adder4 IS SIGNAL g, p, c::STD_LOGIC_VECTOR (3 DOWN TO 0 );; BEGIN p(0) <= a(0) OR b(0); p(1) <= a(1) OR b(1); p(2) <= a(2) OR b(2); g(0) <= a(0) AND b(0);a[3:0]b[3:0]ciSum[3:0]cout g(1) <= a(1) AND b(1); g(2) <= a(2) AND b(2); g(3) <= a(3) AND b(3); c(0) <= g(0) OR (p(0) AND ci ); c(1) <= g(1) OR (p(1) AND g(0)) OR (p(1) AND p(0) AND ci); c(2) <= g(2) OR (p(2) AND g(1)) OR (p(2) AND p(1) AND g(0)) OR (p(2) AND p(1) AND p(0) AND ci); c(3) <= g(3) OR (p(3) AND g(2)) OR (p(3) AND p(2) AND g(1)) OR (p(3) AND p(2) AND p(1) AND g(0)) OR (p(3) AND p(2) AND p(1) AND p(0) AND ci); cout = c(3); sum(0) <= a(0) XOR b(0) XOR ci; sum(1) <= a(1) XOR b(1) XOR c(0); sum(2) <= a(2) XOR b(2) XOR c(1); sum(3) <= a(3) XOR b(3) XOR c(2); END rtl_adder4; 2.移位器移位器 8 8bitbit移位器移位器。

D7 D6 D5 D4 D3 D2 D1 D0 d7 d6 d5 d4 d3 d2 d1 d0右移右移d0左移左移d7 d6 d5 d4 d3 d2 d1 d0d7 d6 d5 d4 d3 d2 d1 d0 d7Ir sr sl dataa_out data_in il 8 8bitbit移位器的移位器的VHDLVHDL程序程序 LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY shifter IS PROT (data_in::IN STD_LOGIC_VECTOR (7 DOWN TO 0); sr, sl, ir, il::IN STD_LOGIC; data_out::OUT STD_LOGIC_VECTOR (7 DOWN TO 0); END shifter; ARCHITECTURE Alg OF shifter IS BEGIN PROCESS (sr, sl, data_in, ir, il) VARIABLE con::STD_LOGIC_VECTOR (0 TO 1); BEGIN con: = sr & sl; CASE con IS WHEN "00" => data_out <= data_in; WHEN "01" => data_out <= data_in (6 DOWN TO 0) & il; --左移左移 WHEN “10” => data_out <= ir & data_in (7 DOWN TO 1); --右移右移 WHEN "11" => data_out <= data_in; END CASE; END PROCESS; END Alg; 3. 求补器求补器 LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY complement IS PORT (a::IN STD_LOGIC_VECTOR (7 DOWN TO 0); b::UT STD_LOGIC_VECTOR (7 DOWN TO 0)); END complement; ARCHITECTURE rtl OF complement IS BEGIN b <= NOT a +”00000001”;; END rtl; 4. 乘法器。

乘法器 部分积右移部分积右移8bit乘法器的设计乘法器的设计LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY mult IS PORT (ai, bi::IN STD_LOGIC_VECTOR (7 DOWN TO 0); Product::OUT STD_LOGIC_VECTOR (15 DOWN TO 0); done::OUT STD_LOGIC); END mult; ARCHITECTURE shift_mult OF mult ISBEGIN PROCESS (ai, bi) VARIABLE a, b, m::STD_LOGIC_VECTOR (8 DOWN TO 0); VARIABLE count::INTEGER; BEGIN a: = '0' & ai; b: ='0' & bi; count: = 0; m: = "00000000"; done <= '0'; WHILE count < 8 LOOP IF a(0) = '1' THEN m: = m+bi; END IF; a: = m(0) & a(7 DOWN TO 1); m: = '0' & m(7 DOWN TO 1); count: = count+1; END LOOP; product <= m(7 DOWN TO 0) & a(8 DOWN TO 1); done <= '1'; END PROCESS; END shift_mult; 4.1.5 算术逻辑运算单元算术逻辑运算单元 本例是一个本例是一个8bit的的ALU,,能够完成能够完成8种运算,即加种运算,即加(add),,带进位加带进位加(addc),,减减sub,,带借位减法带借位减法(subc),,逻辑非、与、或和逻辑异或。

逻辑非、与、或和逻辑异或alucoder程序包定义指令码程序包定义指令码LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;PACKAGE alucoder ISCONSTANT add::STD_LOGIC_VECTOR (2 DOWNTO 0): = "000";CONSTANT addc::STD_LOGIC_VECTOR (2 DOWN TO 0): = "001";CONSTANT sub::STD_LOGIC_VECTOR (2 DOWN TO 0): = "010"; CONSTANT subc::STD_LOGIC_VECTOR (2 DOWN TO 0): = "011";CONSTANT not::STD_LOGIC_VECTOR (2 DOWN TO 0): = "100";CONSTANT and::STD_LOGIC_ VECTOR (2 DOWNTO 0): = "101"; CONSTANT or::STD_ LOGIC_VECTOR (2 DOWN TO 0): = "110"; CONSTANT xor::STD_LOGIC_VECTOR (2 DOWN TO 0): = "111" END alucoder; ALU运算模块设计。

运算模块设计 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL;; USE IEEE_NUMERIC_STD.ALL;; USE IEEE.STD_LOGIC_ARITH.ALL;; USE IEEE.STD_LOGIC_UNSICNED.ALL;; USE WORK.alucoder.ALL;;ALU salu_comand cyAcc cout over ENTITY alu IS PORT (s::IN STD_LOGIC_VECTOR (7 DOWN TO 0); cy::IN STD_ LOGIC; alu_comand::IN STD_LOGIC_VECTOR (2 DOWN TO 0); Acc:: INOUT STD_LOGIC_VECTOR (7 DOWN TO 0); cout, over::BUFFER STD_LOGIC); END alu;; ARCHITECTURE alg OF alu IS SIGNAL r1, s1, f1::STD_LOGIC_VECTOR (8 DOWN TO 0); BEGIN r1 <= '0' & Acc; s1 <= '0' & s; PROCESS (r1, s1, cy, alu_comand) BEGIN CASE alu_comand IS WHEN add => f1 <= r1+s1;; WHEN addc => IF cy = '0' THEN f1 <= r1+s1;; ELSE f1 <= r1+s1+1;; END IF; WHEN sub => f1 <= r1+NOT (s1)+1;; WHEN subc => IF cy = '0' THEN f1 <= r1+NOT (s1)+1;; ELSE f1 <= r1+NOT (s1);; END IF;; WHEN not => f1 <= NOT (r1);; WHEN and => f1 <= r1 AND s1;; WHEN or => f1 <= r1 OR s1;; WHEN XOR => f1 <= r1 XOR s1;; WHEN OTHERS => f1 <= "-";; END CASE;; END PROCESS;; Acc <= f1 (7 DOWN TO 0 );; cout <= f1 (8 );; over <= f1(8) XOR f1(7); END alu; 4.2时序逻辑电路设计时序逻辑电路设计 4.2.1 触发器触发器 1. D触发器触发器 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL;; ENTITY dff IS PORT (d, clk::IN STD_LOGIC;; q::OUT STD_LOGIC );; END dff;; ARCHITECTURE rtl_if OF dff IS BEGIN PROCESS (clk) BEGIN IF (clk 'EVENT' AND clk = 1) THEN q <= d;; END IF;; END PROCESS;; END rtl_if;; 结构体的另一种描述如下:结构体的另一种描述如下: ARCHITECTURE rtl_wait OF dff IS BEGIN PROCESS BEGIN WAIT UNTIL clk 'EVENT AND clk = 1;; q <= d;; END PROCESS; END rtl_wait;; 4.2.3 寄存器寄存器 D0~D7: 8位并行数据输入端。

位并行数据输入端SI: 串行数据输入端串行数据输入端Q7: 串行数据输出端串行数据输出端Q0~Q6: 内部寄存器数据输出端内部寄存器数据输出端clk: 时钟 ckin: 时钟信号禁止,只有当其时钟信号禁止,只有当其无效时,移位寄存器才在时钟的无效时,移位寄存器才在时钟的触发下进行移位操作触发下进行移位操作 S/L: 移位(移位(shift))/装入(装入(load)当此端为高电平时,可执行移位当此端为高电平时,可执行移位操作,当此端为低电平时,读入操作,当此端为低电平时,读入D0~D7端的并行数据端的并行数据 CLR: 异步清零异步清零 D[7:0] SI S/L Q7clk ckin clr 串串/并入、串出移位寄存器并入、串出移位寄存器 LIBRARY IEEE;; USE IEEE.STD_LOGIC_1164.ALL;;ENTITY shifter IS PORT (clr, si, ckin, clk::IN STD_LOGIC;; d::IN STD_LOGIC_VECTOR (7 DOWN TO 0 );; q::OUT STD_LOGIC );; sl::IN BIT );;END shifter;;ATCHITECTURE rtl_shifter OF shifter IS SIGNAL temp8::STD_LOGIC_VECTOR (7 DOWN TO 0 );; BEGIN PROCESS (clr, sl, ckin, clk) IF (clr = '0' ) THEN temp8 <= "00000000";; q <= temp8 (7);; ELSIF (clk 'EVENT ) AND (clk = '1' ) AND (ckin = '0' ) THEN IF (sl = '0') THEN temp8 <= d;; --装入数据装入数据 q <= d (7);; ELSE q <= temp8 (7);; temp8(7) <= temp8(6);; temp8(6) <= temp8(5);; temp8(5) <= temp8(4);; temp8(4) <= temp8(3);; temp8(3) <= temp8(2);; temp8(2) <= temp8(1);; temp8(1) <= temp8(0);; temp8(0) <= si;; ENDIF;; ENDIF;; END PROCESS;; END rtl_shifter;; 4.2.4 计数器计数器 8位异步计数器的设计位异步计数器的设计 Q /QD clkQ /QD clkQ /QD clkQ /QD clk d clkclrcount_in(0)count_in(1)count_in(8)Q0Q1Q2Q7 计数器的顶层设计计数器的顶层设计LIBRARY IEEE;;USE IEEE.STD_LOGIC_1164.ALL;;ENTITY riplecount IS PORT (clk, clr::IN STD_LOGIC;; count::OUT STD_LOGIC_VECTOR (7 DOWN TO 0));; END riplecount;; ARCHITECTURE rtl_riplecount OF riplecount IS SIGNAL count_in::STD_LOGIC_VECTOR (8 DOWN TO 0);; COMPONENT dfft PORT (clk, clr, d::IN STD_LOGIC;; Q::OUT STD_LOGIC; Qn::BUFFER STD_LOGIC);; END COMPONENT; --调用当前库中的同名实体作为元件调用当前库中的同名实体作为元件 BEGIN count_in (0) <= clk; genl::FOR::IN 0 TO 7 GENERATE U::dfft PORT MAP (clk => count_in(i),,clr => clr;; d=> count_in(i+1),,,Q => count(i);; Qn => count_in(i+1));; END GENERATE;; END rt_riplecountl;; --单个触发器性能描述单个触发器性能描述 LIBRARY IEEE;; USE IEEE.STD_LOGIC_1164.ALL;; ENTITY dfft IS PORT (clk, clr, d::IN STD_LOGIC;; Q::OUT STD_LOGIC;; Qn::BUFFER STD_LOGIC);; END dfft;; ARCHITECTURE rtld OF dfft IS BEGIN PROCESS (clk, clr) BEGIN IF (clr = '0') THEN Q <= '0';; Qn <= '1';; ELSIF (clk 'EVENT AND clk = '1') THEN Q <= d;; Qn <= NOT d;; END IF;; END PROCESS;; END rtld;; 4.3 存储器存储器4.3.1 概述概述 存储器单元实际上是时序逻辑电路的一种。

按存储器存储器单元实际上是时序逻辑电路的一种按存储器的使用类型可分为只读存储器的使用类型可分为只读存储器(ROM)和随机存取存储器和随机存取存储器(RAM),,两者的功能有较大的区别,因此在描述上也有两者的功能有较大的区别,因此在描述上也有所不同存储器是许多存储单元的集合,按单元号顺序排列存储器是许多存储单元的集合,按单元号顺序排列每个单元由若干二进制位构成,以表示存储单元中存每个单元由若干二进制位构成,以表示存储单元中存放的数值这种结构和数组的结构非常相似,故在放的数值这种结构和数组的结构非常相似,故在VHDL语言中,通常由数组描述存储器语言中,通常由数组描述存储器 TYPE memory IS ARRAY (INTEGER RANGE <>) OF INTEGER;; TYPE word IS STD_LOGIC_VECTOR (k-1 DOWN TO 0); TYPE memory IS ARRAY (0 TO w-1) OF word ; 4.3.3 随机存储器随机存储器RAM LIBRARY IEEE;; USE IEEE.STD_LOGIC_1164. ALL;;USE IEEE.STD_LOGIC_ARITH.ALL;; ENTITY ram4k IS GENERIC (k::INTEGER: = 8; w::INTEGER: = 12; rd_del, wr_del::TIME );; PORT (WR, RD, CS::IN STD_LOGIC;; Adr::IN STD_LOGIC_VECTOR (w-1 DOWNTO 0);; D::INOUT STD_LOGIC_VECTOR (k-1 DOWNTO 0));; END ram4k;;WRRDCSAdr[11:0]Dout[7:0] ARCHITECTURE behavram4k OF ram4k ISTYPE memory IS ARRAY (0 TO 2**w-1) OF STD_LOGIC_VECTOR (k-1 DOWNTO 0);; SIGNAL sram::memory;; SIGNAL Adr_in::INTEGER;; BEGIN Adr_in <= CONV_INEGER (Adr); --位矢量转换成整数位矢量转换成整数 PROCESS (WR, RD, CS) BEGIN IF CS = '0' THEN IF RD = '0' THEN D <= sram (Adr_in) AFTER rd_del;; ELSIF WR = '0' THEN sram (Adr_in) <= D AFTER wr_del;; ENDIF;; ELSE D <= (OTHERS’Z’) AFTER rd_del;; END IF;; END PROCESS;; END behav;; 4.3.2 只读存储器只读存储器ROM 在用在用VHDL语言描述语言描述ROM时,时,ROM的内容应在仿真的内容应在仿真时先读到时先读到ROM中,这就是中,这就是ROM的初始化。

存储器的初始的初始化存储器的初始化要依赖于外部文件的读取,即由化要依赖于外部文件的读取,即由TEXTIO对对ROM进行进行初始化下面是对初始化下面是对ROM进行初始化的实例进行初始化的实例 VARIABLE startup::BOOLEAN: = TRUE;;VARIABLE l::LINE;; -- LINE是在是在TEXTIO程序包定义的存程序包定义的存取类型取类型VARIABLE j::INTEGER;;VARIABLE rom::memory;;FILE romin::TEXT IS IN "rom2k.in"; --TEXT 是在是在TEXTIO程序程序包定义的文件类型包定义的文件类型 初始化程序:初始化程序: IF startup THEN FOR j IN rom‘ RANGE LOOP --利用数据区间属性函数获得利用数据区间属性函数获得 数组的上下限数组的上下限 READLINE (romin, l );; --从文件从文件romin中读入一行放入中读入一行放入l 中。

中 READ (l, rom(j));; --从从l中读入一个数据放入中读入一个数据放入rom中中 END LOOP;; END IF;; G1 G2Adr[11;0]Dout[7:0] 只读存储器只读存储器ROM的的VHDL程序 LIBRARY IEEE;;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE STD.TEXTIO.ALL;;ENTITY rom4k IS PORT (G1, G2::IN STD_LOGIC;; Adr::IN STD_LOGIC_VECTOR (11DOWN TO 0);; dout: OUT STD_LOGIC_VECTOR (7 DOEN TO 0);; END rom4k; ARCHITECTURE behav_rom4k OF rom4k IS TYPE word IS STD_LOGIC_VECTOR (7 DOWN TO 0);; TYPE memory IS ARRAY (0 TO 4095) OF word;; SIGNAL adr_in::INTEGER RANGE 0 TO 4095;; VARIBLE rom::memory;; VARIBLE startup::BOOLEAN: = TURE;; VARIBLE l::LINE;; VARIBLE j::INTEGER;; FILE romin::TEXT IS IN “rom2k.in”; --文件类说文件类说明明. BEGIN PROCESS (G1, G2) BEGIN IF startup THEN FOR j IN rom ' RANGE LOOP READLINE (romin, l );; READ (l, rom(j));; END LOOP;; startup: = FALSE;; END IF;; adr_in <= CONV_INTEGER (Adr); --将位矢量转换成整数将位矢量转换成整数. IF (G1 = '1' AND G2 = '1') THEN dout <= rom (adr_in);; ELSE dout <= "ZZZZZZZZ”; ENDIF; END PROCESS; END behav_rom2k;; 4.3.4先进后出堆栈先进后出堆栈 先进后出堆栈是处理程序中断先进后出堆栈是处理程序中断的常用数据结构的常用数据结构,其数据存放结其数据存放结构和构和RAM是一致的,但存储方是一致的,但存储方式有所不同。

式有所不同 先进后出堆栈由先进后出堆栈由2个功能块组个功能块组成,即存储器体和堆栈指针成,即存储器体和堆栈指针SP,,进堆时进堆时SP+1→SP指向下一个存指向下一个存储单元;出堆时储单元;出堆时SP-1 →SP,,并并把把SP所指示的存储单元的内容所指示的存储单元的内容输出 din[7:0] push pop clk resetDout[7:0] 256字节先进后出堆栈的字节先进后出堆栈的VHDL程序LIBRARY IEEE;;USE IEEE.STD_LOGIC_1164.ALL;;USE IEEE.STD_LOGIC_ARITH. ALL;;USE IEEE.STD_LOGIC_UNSIGNED. ALL;;ENTITY stack IS GENERIC (w::INTEGER: = 256; k::INTEGER: =8);; PORT (clk, reset, push, pop::IN STD_LOGIC din::IN STD_LOGIC_VECTOR (k-1 DOWNTO 0);; dout::OUT STD_LOGIC_VECTOR (k-1 DOWNTO 0));; END stack;; ARCHITECTURE behav_stack OF stack IS TYPE memory IS ARRAY (0 TO w-1) OF STD_LOGIC_VECTOR (k-1 DOWNTO 0) ; SIGNAL ram::MEMORY;; SIRNAL sp::INTEGER RANGE 0 TO w-1;; BEGIN dout <= ram (sp); P1: PROCESS (clk) BEGIN IF (clk' EVENT AND clk = '1') THEN IF (push= '0' )THEN ram (sp ) <= din;; END IF;; END IF;; END PROCESS P1;;数数据据堆堆栈栈写写 P2: PROCESS (clk, reset) BEGIN IF (reset = '1') THEN sp<= 0;; ELSIF (clk ' EVENT AND clk = '0'AND push=’0’ ) THEN sp<= sp +1;; --在在clk的后沿的后沿sp+1 ElSIF (clk ' EVENT AND clk = '1'AND pop=’0’ ) THEN sp<= sp -1;; - -sp指针修改指针修改 ENDIF;; END PROCESS P2;; END behav_stack;; 加加减减计计数数器器操操作作 4.4 有限状态机有限状态机 有限状态机是时序电路的通用模型,任何时序电路都有限状态机是时序电路的通用模型,任何时序电路都可以表示为有限状态机。

对于大部分数字电子系统,可以表示为有限状态机对于大部分数字电子系统,都可以划分为控制单元和数据单元两个组成部分,控都可以划分为控制单元和数据单元两个组成部分,控制单元的主体是一个有限状态机,它接收外部信号和制单元的主体是一个有限状态机,它接收外部信号和数据单元产生的状态的信息,产生各种控制信号,决数据单元产生的状态的信息,产生各种控制信号,决定何时进行何种数据处理有限状态机分为两类:定何时进行何种数据处理有限状态机分为两类:Moore型和型和Mealy型 次次态态逻辑逻辑状态寄状态寄存器存器输出输出逻辑逻辑输入输入次态次态现态现态输出输出 状态机的设计步骤状态机的设计步骤 定义状态机的各状态适当地确定状态机的工作状态,定义状态机的各状态适当地确定状态机的工作状态,是状态机设计的基础,需要充分利用设计者的设计经验是状态机设计的基础,需要充分利用设计者的设计经验 建立状态转换图构造状态转换图时,通常从一个建立状态转换图构造状态转换图时,通常从一个比较容易的状态开始例如系统的初始状态、复位状态比较容易的状态开始例如系统的初始状态、复位状态或空闲状态等,都是很好的起始状态为每个状态标出或空闲状态等,都是很好的起始状态。

为每个状态标出转换的条件,相应的输入、输出信号转换的条件,相应的输入、输出信号 建立状态机进程在建立状态机进程在VHDL程序中,通常用进程描述程序中,通常用进程描述有限状态机由于次态是现态及输入信号的函数,因此,有限状态机由于次态是现态及输入信号的函数,因此,往往将现态和输入信号作为进程的敏感信号往往将现态和输入信号作为进程的敏感信号 进程中定义状态的转移所有的状态均可表达为进程中定义状态的转移所有的状态均可表达为CASE_WHEN结构中的一条结构中的一条 CASE语句,利用语句,利用CASEWHEN语句语句IF_THEN_ELSE语句实现状态的转移语句实现状态的转移 存储器控制器的设计存储器控制器的设计 存储器控制器的输入信号是微处理器的就绪存储器控制器的输入信号是微处理器的就绪ready和读和读写信号写信号read_write当上电复位或者当上电复位或者ready有效时,存有效时,存储器控制器开始工作,并在下一个时钟周期判断本次储器控制器开始工作,并在下一个时钟周期判断本次作业任务是读存储器还是写存储器,当作业任务是读存储器还是写存储器,当read_write=‘1’时为读操作,使时为读操作,使OE和和CS信号有效,信号有效,read_write=‘0’时时为写操作,为写操作,WE和和CS信号有效。

当信号有效当ready信号再次有效信号再次有效时,结束本次读写操作,并使控制器返回到初始状态时,结束本次读写操作,并使控制器返回到初始状态 存储器存储器控制器控制器readyread-writeOEWECS 存储器控制器状态转移图存储器控制器状态转移图 状态图状态图decisionidlewritereadreadyreadyreadyreadyreadyreadyread_writeread_write 带异步复位的双进程状态机的存储器控制器设计带异步复位的双进程状态机的存储器控制器设计 LIBRARY IEEE USE IEEE.STD_LOGIC_1164.ALL; ENTITY memoy_controller IS PORT (reset, read_write, ready, clk::IN STD_LOGIC; OE, WE,CS::OUT STD_LOGIC); END memory_controller;; ARCHITECTURE state_machine OF memory_ controller IS TYPE statetype IS (idle, decision, read, write);; SIGNAL present_state, next_state::STATETYPE;; 带异步复位的双进程状态机的存储器控制器设计。

带异步复位的双进程状态机的存储器控制器设计state_comb::PROCESS (reset,,present_state,, read_ write,,ready) BEGIN IF (reset = '1') THEN next_state<= idle;; OE <= '0';; WE <= '0';; CS <=‘0’; ELSE CASE present_state IS WHEN idle => OE<= '0'; WE <= '0'; CS <= '0'; IF ready = '1' THEN next_state <= decision; ELSE next_state <= idle; END IF; WHEN decision => OE <= '0'; WE <= '0'; CS <= '0'; IF (read_write = '1') THEN next_state <= read; ELSE next_state <= write; END IF; WHEN read => OE <= '1'; WE <= '0'; CS <= ‘1'; IF (ready = '1') THEN next_state <= idle; ELSE next_state <= read; END IF; WHEN write => OE <= '0'; WE <= '1'; CS <= ‘1'; IF ( ready = '1') THEN next_state <= idle; ELSE next_state <= write; END IF; WHEN OTHERS => OE<=‘0’; WE<=‘0’; CS <=‘0’; next_state<=idle; END CASE; END IF; END PROCESS state_comb;; state_clocked::PROCESS BEGIN WAIT UNTIL clk' EVENT AND clk = '1';; present_state <= next_state;; END PROCESS state_clocked;; END state_machine;; PROCESS(1)CASE-WHENIF-THEN-ELSEPROCESS(2)WAIT UNTILclk ‘EVENTAND clk=‘1’输入输入次态次态现态现态 。

下载提示
相似文档
正为您匹配相似的精品文档