可编程逻辑2

一、可编程逻辑设计
1、可编程逻辑设计流程图

①、模拟
先通过模拟器将设计进行仿真
②、综合
把高层次的描述转换成底层电路,形成网表
③、实现
将综合后的逻辑放置到一个逻辑器件之中的过程,同时实现合理布线
④、时序模拟
对设计的逻辑功能及时序进行验证
2、原理图输入
元件库:CAD工具提供一系列表示不同输入端数的各种类型门的图形符号

二、VHDL
1、语言结构

①、库
存放已经编译的实体、结构体、程序包、配置
②、程序包
存放各种设计模块能共享的数据类型、常数、程序等
③、实体
描述所设计硬件系统的外部接口信号
④、结构体
描述所设计硬件系统内部结构和功能
⑤、配置
用来从库中选取所需单元来组成新系统
(1)、实体格式

(2)、结构体格式

(3)、例:半加器

LIBRARY ieee ;
USE ieee.std_logic_1164.all ;

ENTITY half_adder IS 
       PORT ( A,B : IN  std_logic;
              Co  : OUT std_logic;
              S   : OUT std_logic);
END half_adder; 

ARCHITECTURE rtl OF half_adder IS
  BEGIN
	      S <= A XOR B;
	      Co <= A AND B;
  END rtl;

2、对象及数据类型
(1)、对象


(2)、数据类型
①、标准数据类型

②、用户定义数据类型
原则:先定义,后使用
例:

可枚举类型std-logic定义:

3、并行描述语句
并行语句:描述一组并发行为,并发执行,与书写顺序无关
顺序语句:描述一组严格顺序执行的行为,与书写顺序有关
(1)、进程语句
一个结构体可以包括一个或多个进程语句,进程内部是顺序语句,各进程语句之间是并发行为

    PROCESS [敏感信号表]
       [进程语句说明部分] ;
     BEGIN
      <进程语句部分>;
    END  PROCESS 

敏感信号的值发生改变,能够引起进程语句的执行
进程语句由顺序语句构成:IF语句、CASE语句、LOOP语句等
(2)、并发信号赋值语句
并发赋值语句在结构体中是并行执行的
例:

LIBRARY IEEE;
USE IEEE.std_logic_1164.ALL;

ENTITY gate IS 
        PORT (A,B : IN  std_logic;
          X,Y,Z   : OUT std_logic);
END gate; 

ARCHITECTURE behaveOF gate IS
         BEGIN
	     X <= A AND B;
	     Y <= A OR B;
	     Z <= A XOR B;
END behave;

(3)、条件信号赋值语句
根据不同条件将不同的表达式赋值给目标信号

目标信号 <= 表达式1 when 条件1  else
           表达式2 when 条件2  else
                     ……
           表达式n-1 when 条件n-1 else
           表达式n;

例:

LIBRARY IEEE;
USE IEEE.std_logic_1164.ALL;

ENTITY and_gate IS 
      PORT (a,b : IN  std_logic;
             x  : OUT std_logic);
END and_gate; 

ARCHITECTURE rtl OF and_gate IS
     BEGIN
  x <= ‘0’ WHEN a=‘0’ AND b=‘0’ ELSE
       ‘0’ WHEN a=‘0’ AND b=‘1’ ELSE
       ‘0’ WHEN a=‘1’ AND b=‘0’ ELSE
       ‘1’;
END rtl;

(4)、选择信号赋值语句

with  表达式  select 
目标信号 <=表达式1 when 选择条件1,
          表达式2 when 选择条件2,
                        ……
          表达式n when 选择条件n,

例:

LIBRARY IEEE;
USE IEEE.std_logic_1164.ALL;

ENTITY mux4 IS 
      PORT (d0,d1,d2,d3 : IN  std_logic;
                     sel: IN std_logic_vector(1 downto 0); 
                      q : OUT std_logic);
END mux4; 

ARCHITECTURE rtl OF mux4 IS
     BEGIN
    WITH sel SELECT
    q <= d0 WHEN “00”,
         d1 WHEN “01”,
         d2 WHEN “10”,
         d3 WHEN OTHER;
END rtl;

4、顺序描述语句
(1)、if语句

if   条件  then
    顺序语句;
end if;

if   条件  then
    顺序语句;
else
    顺序语句;
end if;

if   条件1  then
   第一组顺序语句;
elsif   条件2  then
   第二组顺序语句;
……
elsif   条件n  then
    第n组顺序语句;
else
   第n+1组顺序语句;
end if;

例:

LIBRARY IEEE;
USE IEEE.std_logic_1164.ALL;
ENTITY mux4 IS 
           PORT (d0  : IN  std_logic_vector(3 DOWNTO 0);
                 d1  : IN  std_logic_vector(3 DOWNTO 0);
                 d2  : IN  std_logic_vector(3 DOWNTO 0);
                 d3  : IN  std_logic_vector(3 DOWNTO 0);
                 sel : IN  std_logic_vector(1 DOWNTO 0);
                 q   : OUT std_logic_vector(3 DOWNTO 0));
END mux4;
ARCHITECTURE rtl OF mux4 IS
BEGIN
     PROCESS(d0,d1,d2,d3,sel)
     BEGIN
          IF (sel = "00") THEN
              q <= d0;
          ELSIF (sel = "01") THEN
              q <= d1;
          ELSIF (sel = "10") THEN
              q <= d2;
          ELSE
              q <= d3;
          END IF;
     END PROCESS;
END rtl;

(2)、case语句

case   条件表达式  is
  when  条件表达式的值=>一组顺序语句;
                                ……
  when  条件表达式的值=>一组顺序语句;
end case;

例:

LIBRARY IEEE;
USE IEEE.std_logic_1164.ALL;
ENTITY mux4 IS 
           PORT (d0  : IN  std_logic_vector(3 DOWNTO 0);
                 d1  : IN  std_logic_vector(3 DOWNTO 0);
                 d2  : IN  std_logic_vector(3 DOWNTO 0);
                 d3  : IN  std_logic_vector(3 DOWNTO 0);
	         sel : IN  std_logic_vector(1 DOWNTO 0);
	 q   : OUT std_logic_vector(3 DOWNTO 0));
END mux4;
ARCHITECTURE rtl OF mux4 IS
BEGIN
     PROCESS(d0,d1,d2,d3,sel)
     BEGIN
              CASE sel IS
                   WHEN "00" => q <= d0;
                   WHEN "01" => q <= d1;
                   WHEN "10" => q <= d2;
                   WHEN "11" => q <= d3;
                   WHEN OTHERS => q <= "ZZZZ";
              END CASE;
     END PROCESS;
END rtl;

(3)、loop语句
①、for loop语句:

循环标号:for 循环变量 in 范围 loop
                       顺序处理语句;
                    end loop 循环标号;

例:

LIBRARY IEEE;
USE IEEE.std_logic_1164.ALL;
ENTITY vector_to_int IS
           PORT (input : IN  std_logic_vector(7 DOWNTO 0);
                 flag  : OUT  boolean;
                 q     : OUT integer);
END vector_to_int;
ARCHITECTURE behave OF vector_to_int IS
BEGIN
     PROCESS(input)
     VARIABLE  tmp : integer := 0;
     BEGIN
              flag <= false;
              FOR i IN 7 downto 0 LOOP
                  tmp := tmp * 2;
                  IF (input(i)= '1') THEN
                     tmp := tmp +1;
                  ELSIF (input(i)/= '0') THEN
                     flag <= true;
                  END IF;
              END LOOP;
              q <= tmp;
      END PROCESS;
END behave;

②、while loop语句:

循环标号:while  条件表达式  loop
                       顺序处理语句;
                    end loop 循环标号;           

例:

LIBRARY IEEE;
USE IEEE.std_logic_1164.ALL;

ENTITY logic_and IS
           PORT (input : IN std_logic_vector(7 DOWNTO 0);
                     q : OUT std_logic);
END logic_and;

ARCHITECTURE behave OF logic_and IS
BEGIN
     PROCESS(input)
     VARIABLE  tmp : std_logic;
     VARIABLE  i : integer;
     BEGIN
          tmp := '1';
          i := 0;
          WHILE (i<8) LOOP
                tmp := tmp AND input(i);
                i :=i+1;
          END LOOP;
          q <= tmp;
     END PROCESS;
END behave;

5、结构体的三种描述方式
设计全加器

(1)、数据流描述方式
描述从输入到输出信号的走向

LIBRARY IEEE;
USE IEEE.std_logic_1164.ALL;

ENTITY full_adder IS 
        PORT (A,B : IN  std_logic;
              Cin : IN  std_logic;
              Co  : OUT std_logic;
              S   : OUT std_logic);
END full_adder; 

ARCHITECTURE rtl OF full_adder IS
         SIGNAL  tmp1,tmp2  : std_logic; 
BEGIN
	     tmp1 <= A XOR B;
	     tmp2 <= tmp1 AND Cin;
	     S <= tmp1 XOR Cin;
	     Co <= tmp2 OR (A AND B);
END rtl;

(2)、结构描述方式
通过调用库中的元件或是已设计好的模块来完成设计实体功能的描述
半加器:

LIBRARY IEEE;
USE IEEE.std_logic_1164.ALL;

ENTITY half_adder IS 
       PORT ( A,B : IN  std_logic;
              Co  : OUT std_logic;
              S   : OUT std_logic);
END half_adder; 

ARCHITECTURE rtl OF half_adder IS
      SIGNAL tmp1,tmp2 : std_logic;
BEGIN
	     tmp1 <= A OR B;
	     tmp2 <= A NAND B;
	     Co  <= NOT tmp2;
	     S   <= tmp1 AND tmp2;
END rtl;

全加器:

LIBRARY IEEE;
USE IEEE.std_logic_1164.ALL;

ENTITY full_adder IS 
        PORT (A,B : IN  std_logic;
              Cin : IN  std_logic;
              Co  : OUT std_logic;
              S   : OUT std_logic);
END full_adder; 

ARCHITECTURE structure OF full_adder IS 
      SIGNAL tmp1,tmp2,tmp3 : std_logic;
      COMPONENT half_adder
            PORT(A,B : IN  std_logic;
                 Co  : OUT std_logic;
                 S   : OUT std_logic);
      END COMPONENT;
      COMPONENT or_gate
            PORT(a,b : IN  std_logic;
                 c   : OUT std_logic);
      END COMPONENT;
BEGIN
          U0:  half_adder
               PORT MAP (A=>A,B=>B, S=>tmp1,Co=>tmp2);
          U1:  half_adder
               PORT MAP (A=>tmp1,B=>Cin,S=>S, Co=>tmp3);
          U2:  or_gate
               PORT MAP (a=>tmp3,b=>tmp2,c=>Co);
END structure;

COMPONENT调用已有组件
PORT MAP将设计的端口名称替换为被调用组件的端口名称
(3)、行为描述方式

LIBRARY IEEE;
USE IEEE.std_logic_1164.ALL;
ENTITY full_adder IS 
        PORT (A,B, Cin : IN  std_logic;
                 Co, S : OUT std_logic;
END full_adder; 

ARCHITECTURE behave OF full_adder IS
BEGIN
         PROCESS(A,B,Cin)
	     VARIABLE  n  :  integer RANGE 0 TO 3;
	     CONSTANT  S_vector  : std_logic_vector(0 TO 3) :="0101";
	     CONSTANT  Co_vector : std_logic_vector(0 TO 3) :="0011";
         BEGIN
	          n := 0;
              IF (A ='1') THEN
		         n := n+1;
              END IF; 
              IF (B ='1') THEN
		         n := n+1;
              END IF;
              IF (Cin ='1') THEN
		         n := n+1;
              END IF;
              S <= S_vector(n);
              Co <= Co_vector(n);
         END PROCESS;
END behave;

6、VHDL的组合逻辑设计
(1)、多输入简单门电路
例:三输入与门

LIBRARY IEEE;
USE IEEE.std_logic_1164.ALL;

ENTITY and3_gate IS 
           PORT (a,b,c  : IN  std_logic;
		             y  : OUT std_logic);
END and3_gate;

ARCHITECTURE behave_arc OF and3_gate IS
BEGIN
     PROCESS(a,b,c)
     BEGIN
	  y <= a AND b AND c;
     END PROCESS;
END behave_arc;

LIBRARY IEEE;
USE IEEE.std_logic_1164.ALL;

ENTITY and3_gate IS 
           PORT (a,b,c  : IN  std_logic;
		 y  : OUT std_logic);
END and3_gate;

ARCHITECTURE rtl_arc OF and3_gate IS
BEGIN
PROCESS (a,b,c)
     VARIABLE  comb  : std_logic_vector(2 DOWNTO 0);
     BEGIN
          comb := a & b & c;
          CASE comb IS
               WHEN "000" => y <= '0';
               WHEN "001" => y <= '0';
               WHEN "010" => y <= '0';
               WHEN "011" => y <= '0';
               WHEN "100" => y <= '0';
               WHEN "101" => y <= '0';
               WHEN "110" => y <= '0';
               WHEN "111" => y <= '1';
               WHEN OTHERS => y <= 'X';
          END CASE;
     END PROCESS;
END rtl_arc;

&:并置运算符,将逻辑信号连接后形成一个新的位矢量
(2)、三态门电路

LIBRARY IEEE;
USE IEEE.std_logic_1164.ALL;

ENTITY tri_gate IS 
      PORT (din,en  : IN  std_logic;
	           dout : OUT std_logic);
END tri_gate;

ARCHITECTURE behave_arc OF tri_gate IS
BEGIN
     PROCESS (din,en)
     BEGIN
          IF (en = '1') THEN
              dout <= din;
          ELSE
              dout <= 'Z';
          END IF;
     END PROCESS;
END behave_arc;

(3)、总线缓冲器

LIBRARY IEEE;
USE IEEE.std_logic_1164.ALL;

ENTITY bidir_bus_buff8 IS 
   PORT (a,b  : INOUT std_logic_vector(7 DOWNTO 0);
      en,dr   : IN    std_logic;
END bidir_bus_buff8;

ARCHITECTURE rtl_arc OF bidir_bus_buff8 IS
     SIGNAL aout,bout : std_logic_vector(7 DOWNTO 0);
BEGIN
     PROCESS (a,b,dr,en)
     BEGIN
          IF (en = '0' AND dr = '1') THEN
              bout <= a;
          ELSIF (en = '0' AND dr = '0') THEN
              aout <= b;
          ELSE
              aout <= "ZZZZZZZZ";
              bout <= "ZZZZZZZZ";
          END IF;
          b <= bout;
          a <= aout;
     END PROCESS;
END rtl_arc;

(4)、选择器

LIBRARY IEEE;
USE IEEE.std_logic_1164.ALL;

ENTITY mux IS 
      PORT (a,b,c,d: IN  std_logic;
                  s: IN std_logic_vector(1 downto 0); 
                  y: OUT std_logic);
END mux; 

ARCHITECTURE rtl OF mux IS
     BEGIN
     y <= a WHEN s=“00” ELSE
             b WHEN s=“01” ELSE
             c WHEN s=“10” ELSE
             d WHEN s=“11” ELSE 
             ‘X’;
END rtl;

(5)、编码器
①、普通编码器

LIBRARY IEEE;
USE IEEE.std_logic_1164.ALL;

ENTITY encoder8_3 IS 
     PORT (d  : IN  std_logic_vector(0 TO 7);
           q  : OUT std_logic_vector(2 DOWNTO 0));
END encoder8_3;

ARCHITECTURE rtl_arc OF encoder8_3 IS
BEGIN
     PROCESS (d)
     BEGIN
          CASE d IS
               WHEN "01111111" => q <= "111";
               WHEN "10111111" => q <= "110";
               WHEN "11011111" => q <= "101";
               WHEN "11101111" => q <= "100";
               WHEN "11110111" => q <= "011";
               WHEN "11111011" => q <= "010";
               WHEN "11111101" => q <= "001";
               WHEN "11111110" => q <= "000";
               WHEN OTHERS => q  <= "ZZZ";
          END CASE;
     END PROCESS;
END rtl_arc;

②、优先编码器

LIBRARY ieee;
USE ieee.std_logic_1164.all;
ENTITY BIM IS
      PORT  (st : IN	STD_LOGIC;
	          d : IN	STD_LOGIC_VECTOR(0 TO 7);
	      ye,ys : OUT  STD_LOGIC;
	          y : OUT	STD_LOGIC_VECTOR(2 DOWNTO 0));
END BIM;
ARCHITECTURE func OF BIM IS
 BEGIN
      PROCESS (st,d) 
      BEGIN
                IF (st='0') THEN
                     IF d(7)='0'    THEN y<="000";ye<='0';ys<='1';
                     ELSIF d(6)='0' THEN y<="001";ye<='0';ys<='1';
                     ELSIF d(5)='0' THEN y<="010";ye<='0';ys<='1';
	                 ELSIF d(4)='0' THEN y<="011";ye<='0';ys<='1';
	                 ELSIF d(3)='0' THEN y<="100";ye<='0';ys<='1';
	                 ELSIF d(2)='0' THEN y<="101";ye<='0';ys<='1';
	                 ELSIF d(1)='0' THEN y<="110";ye<='0';ys<='1';
	                 ELSIF d(0)='0' THEN y<="111";ye<='0';ys<='1';
	                 ELSE  y<="111";ye<='1';ys<='0';
	                 END IF;	
                ELSE
	                 y <= "111";ye<='1';ys<='1';			
                END IF;		
      END PROCESS;
END func;

(6)、译码器

LIBRARY IEEE;
USE IEEE.std_logic_1164.ALL;
ENTITY decoder_74LS138 IS 
      PORT (g1,g2a,g2b,a,b,c : IN  std_logic;
                           y : OUT std_logic_vector(7 DOWNTO 0));
END decoder_74LS138;
ARCHITECTURE rtl_arc OF decoder_74LS138 IS
     SIGNAL  comb  : std_logic_vector(2 DOWNTO 0);
BEGIN
   comb <= c & b & a;
  PROCESS (g1,g2a,g2b,comb)
    BEGIN
     IF (g1 = '1' AND g2a = '0' AND g2b = '0') THEN
              CASE comb IS
                   WHEN "000" => y <= "11111110";
                   WHEN "001" => y <= "11111101";
                   WHEN "010" => y <= "11111011";
                   WHEN "011" => y <= "11110111";
                   WHEN "100" => y <= "11101111";
                   WHEN "101" => y <= "11011111";
                   WHEN "110" => y <= "10111111";
                   WHEN "111" => y <= "01111111";
                   WHEN OTHERS => y  <= "XXXXXXXX";
              END CASE;
          ELSE
              y <= "11111111";
          END IF;
     END PROCESS;
END rtl_arc;

(7)、比较器

LIBRARY IEEE;
USE IEEE.std_logic_1164.ALL;

ENTITY comparison IS 
           PORT (a  : IN  std_logic;
                 b  : IN  std_logic;
                 q  : OUT std_logic_vector(2 DOWNTO 0));
END comparison;

ARCHITECTURE behave_arc OF comparison IS
BEGIN
     PROCESS (a,b)
     BEGIN
          IF (a = b) THEN
              q <= "001";
          ELSIF (a > b) THEN
              q <= "010";
          ELSE
              q <= "100";
          END IF;
     END PROCESS;
END behave_arc;	

(8)、转换器

Y0=D0⊕D1
Y1=D1⊕D2
Y2=D2⊕D3
Y3=D3

library IEEE; 
use IEEE.std_logic_1164.all;
 entity BIN2GARY is
 port ( DATA_IN : in std_logic_vector (3 downto 0); 
             EN : in std_logic; 
       DATA_OUT : out std_logic_vector (3 downto 0) ); 
end entity; 
architecture bin2gary_arch of BIN2GARY is
begin 
DATA_OUT(0) <= (DATA_IN(0) xor DATA_IN(1)) and EN;
DATA_OUT(1) <= (DATA_IN(1) xor DATA_IN(2)) and EN; 
DATA_OUT(2) <= (DATA_IN(2) xor DATA_IN(3)) and EN; 
DATA_OUT(3) <= DATA_IN(3) and EN; 
end architecture; 

7、VHDL时序逻辑设计
时钟信号:描述时序电路执行的条件
①、上升沿有效

也可以描述为:
②、下降沿有效

也可以描述为:
③、同步复位/置位信号
用来设置时序电路的初始状态

(1)、触发器
①、基本D触发器

LIBRARY IEEE;
USE IEEE.std_logic_1164.ALL;

ENTITY basic_dff IS 
           PORT (d,clk  : IN  std_logic;
		         q,qb   : OUT std_logic);
END basic_dff;

ARCHITECTURE rtl_arc OF basic_dff IS
BEGIN
	 PROCESS (clk)
         BEGIN
              IF (clk'event AND clk ='1') THEN
                  q  <= d;
                  qb <= NOT d;
              END IF;
         END PROCESS;
END rtl_arc;

②、同步复位D触发器

LIBRARY IEEE;
USE IEEE.std_logic_1164.ALL;

ENTITY sync_rdff IS 
           PORT (d,clk, reset : IN  std_logic;
		                  q,qb: OUT std_logic);
END sync_rdff;

ARCHITECTURE rtl_arc OF sync_rdff IS
BEGIN
	 PROCESS (clk)
         BEGIN
              IF    (clk'event AND clk ='1')   THEN
                  IF (reset :='0') THEN
                      q  <= '0';
                      qb <= '1';
                  ELSE
                      q  <= d;
                      qb <= NOT d;
                  END IF;
              END IF;
         END PROCESS;
END rtl_arc;

③、异步复位D触发器

LIBRARY IEEE;
USE IEEE.std_logic_1164.ALL;

ENTITY sync_rdff IS 
           PORT (d,clk, reset : IN  std_logic;
		                  q,qb: OUT std_logic);
END sync_rdff;

ARCHITECTURE rtl_arc OF sync_rdff IS
BEGIN
         PROCESS (clk,reset)
         BEGIN
                IF (reset :='0') THEN
                      q  <= '0';
                      qb <= '1';
                ELSIF (clk'event AND clk ='1') THEN
                      q  <= d;
                      qb <= NOT d;
                END IF;
         END PROCESS;
END rtl_arc;

④、同步置位/复位D触发器

LIBRARY IEEE;
USE IEEE.std_logic_1164.ALL;
ENTITY sync_rsdff IS 
           PORT (d,clk,set,reset: IN  std_logic;
                            q,qb: OUT std_logic);
END sync_rsdff;
ARCHITECTURE rtl_arc OF sync_rsdff IS
BEGIN
	 PROCESS (clk)
         BEGIN
              IF (clk'event AND clk ='1') THEN
                  IF (set ='0' AND reset ='1') THEN
                      q  <= '1';
                      qb <= '0';
                  ELSIF (set ='1' AND reset ='0') THEN
                      q  <= '0';
                      qb <= '1';
                  ELSE
                      q  <= d;
                      qb <= NOT d;
                  END IF;
              END IF;
         END PROCESS;
END rtl_arc;

⑤、异步置位/复位D触发器

LIBRARY IEEE;
USE IEEE.std_logic_1164.ALL;
ENTITY async_rsdff IS 
           PORT (d,clk,set,reset: IN  std_logic;
		                    q,qb: OUT std_logic);
END async_rsdff;
ARCHITECTURE rtl_arc OF async_rsdff IS
BEGIN
	 PROCESS (clk,set,reset)
         BEGIN
              IF (set ='0' AND reset ='1') THEN
                  q  <= '1';
                  qb <= '0';
              ELSIF (set ='1' AND reset ='0') THEN
                  q  <= '0';
                  qb <= '1';
              ELSIF (clk'event AND clk ='1') THEN
                  q  <= d;
                  qb <= NOT d;
              END IF;
         END PROCESS;
END rtl_arc;

⑥、异步置位/复位JK触发器

LIBRARY IEEE;
USE IEEE.std_logic_1164.ALL;

ENTITY async_rsjkff IS 
           PORT (j,k,clk,set,reset: IN  std_logic;
                    	      q,qb: OUT std_logic);
END async_rsjkff;

ARCHITECTURE rtl_arc OF async_rsjkff IS
     SIGNAL q_temp,qb_temp : std_logic;
BEGIN
	 PROCESS (clk,set,reset)
         BEGIN
              IF (set ='0' AND reset ='1') THEN
                  q_temp  <= '1';
                  qb_temp <= '0';
              ELSIF (set ='1' AND reset ='0') THEN
                  q_temp  <= '0';
                  qb_temp <= '1';
              ELSIF (clk'event AND clk ='1') THEN
                  IF (j ='0' AND k ='1') THEN 
                      q_temp  <= '0';
                      qb_temp <= '1';
                  ELSIF (j ='1' AND k ='0') THEN
                      q_temp  <= '1';
                      qb_temp <= '0';
                  ELSIF (j ='1' AND k ='1') THEN
                      q_temp  <= NOT q_temp;
                      qb_temp <= NOT qb_temp;
                  END IF;
              END IF;
              q  <= q_temp;
              qb <= qb_temp;
         END PROCESS;
END rtl_arc;

(2)、锁存器

LIBRARY IEEE;
USE IEEE.std_logic_1164.ALL;

ENTITY latch_74LS373 IS 
       PORT (d: IN  std_logic_vector(7 DOWNTO 0);
          oe,g: IN  std_logic;
             q: INOUT std_logic_vector(7 DOWNTO 0));
END latch_74LS373;

ARCHITECTURE rtl_arc OF latch_74LS373 IS
BEGIN
	 PROCESS (oe,g)
         BEGIN
              IF (oe ='0') THEN
                  IF (g ='1') THEN 
                      q <= d;
                  ELSE
                      q <= q;
                  END IF;
              ELSE
                  q <= "ZZZZZZZZ";
              END IF;
         END PROCESS;
END rtl_arc;

(3)、寄存器

LIBRARY IEEE;
USE IEEE.std_logic_1164.ALL;
ENTITY registerN IS
           GENERIC (n: integer :=8);
           PORT (d: IN  std_logic_vector(n-1 DOWNTO 0);
                en: IN  std_logic;
               clk: IN  std_logic;
                 q: BUFFER std_logic_vector(n-1 DOWNTO 0));
END registerN;

ARCHITECTURE rtl_arc OF registerN IS
BEGIN
	 PROCESS (clk)
         BEGIN
                 IF (clk'event AND clk ='1') THEN
                     ELSIF (en ='1') THEN 
                         q <= d;
                     ELSE
                         q <= q;
                 END IF;
              END PROCESS;
END rtl_arc;

串入/串出移位寄存器

LIBRARY IEEE;
USE IEEE.std_logic_1164.ALL;
ENTITY dff IS
       PORT (d   : IN  std_logic;
             clk : IN  std_logic;
             q   : OUT std_logic);
END dff;

ARCHITECTURE rtl OF dff IS
BEGIN
     PROCESS (clk)
     BEGIN
          IF (clk'event AND clk = '1') THEN
              q <= d;
          END IF;
     END PROCESS;
END rtl;

①、

LIBRARY IEEE;
USE IEEE.std_logic_1164.ALL;
ENTITY shift_reg IS 
           PORT (d1  : IN  std_logic;
                 cp  : IN  std_logic;
		 d0  : OUT std_logic);
END shift_reg;
ARCHITECTURE structure OF shift_reg IS
         COMPONENT dff
            PORT (d   : IN  std_logic;
                  clk : IN  std_logic;
		  q   : OUT std_logic);
         END COMPONENT;
   SIGNAL  q   : std_logic_vector(4 DOWNTO 0);
BEGIN
         q(0) <= d1;
	 dff1: dff  PORT MAP (q(0),cp,q(1));
	 dff2: dff  PORT MAP (q(1),cp,q(2));
	 dff3: dff  PORT MAP (q(2),cp,q(3));
         dff4: dff  PORT MAP (q(3),cp,q(4));
         d0 <= q(4);
END structure;

②、

LIBRARY IEEE;
USE IEEE.std_logic_1164.ALL;

ENTITY shift_reg IS 
           PORT (d1  : IN  std_logic;
                 cp  : IN  std_logic;
	 d0  : OUT std_logic);
END shift_reg;

ARCHITECTURE structure OF shift_reg IS
         COMPONENT dff
            PORT (d   : IN  std_logic;
                  clk : IN  std_logic;
	 q   : OUT std_logic);
         END COMPONENT;
      SIGNAL  q   : std_logic_vector(4 DOWNTO 0);
BEGIN
         q(0) <= d1;
         G1: FOR i IN 0 TO 3 GENERATE
             dffx: dff  PORT MAP (q(i),cp,q(i+1));
         END GENERATE G1;
         d0 <= q(4);
END structure;

③、

LIBRARY IEEE;
USE IEEE.std_logic_1164.ALL;
ENTITY shift_regN IS 
           GENERIC (n : integer:=4);
           PORT (d1 : IN  std_logic;
                 cp : IN  std_logic;
                 d0 : OUT std_logic);
END shift_regN;
ARCHITECTURE structure_arc OF shift_regN IS
         COMPONENT dff
            PORT (d, clk   : IN  std_logic;
                       q   : OUT std_logic);
         END COMPONENT;
      SIGNAL  q   : std_logic_vector(n-1 DOWNTO 1);
   BEGIN
     G1:FOR i IN 0 TO n-1 GENERATE
         P1:IF (i = 0) GENERATE
             dffx: dff  PORT MAP (d1,cp,q(i+1));
         END GENERATE P1;
         P2:IF (i = n-1) GENERATE
             dffx: dff  PORT MAP (q(i),cp,d0);
         END GENERATE P2;
         P3:IF ((i /= 0) AND (i /= n-1)) GENERATE
             dffx: dff  PORT MAP (q(i),cp,q(i+1));
         END GENERATE P3;
     END GENERATE G1;
END structure_arc;

串入/并出移位寄存器

LIBRARY IEEE;
USE IEEE.std_logic_1164.ALL;
ENTITY dff IS
       PORT (d   : IN  std_logic;
             clk : IN  std_logic;
             q   : OUT std_logic);
END dff;

ARCHITECTURE rtl OF dff IS
BEGIN
     PROCESS (clk)
     BEGIN
          IF (clk'event AND clk = '1') THEN
              q <= d;
          END IF;
     END PROCESS;
END rtl;
LIBRARY IEEE;
USE IEEE.std_logic_1164.ALL;
ENTITY shift_reg IS 
           PORT (d1  : IN  std_logic;
                 cp  : IN  std_logic;
	q   : OUT std_logic_vector(3 DOWNTO 0));
END shift_reg;
ARCHITECTURE structure_arc OF shift_reg IS
         COMPONENT dff
            PORT (d   : IN  std_logic;
                  clk : IN  std_logic;
	q   : OUT std_logic);
         END COMPONENT;
   SIGNAL  q_temp  : std_logic_vector(4 DOWNTO 1);
BEGIN
     G1:FOR i IN 0 TO 3 GENERATE
         P1:IF (i = 0) GENERATE
             dffx: dff  PORT MAP (d1,cp,q_temp(i+1));
         END GENERATE P1;
         P2:IF (i /= 0) GENERATE
        dffx: dff  PORT MAP (q_temp(i),cp,q_temp (i+1));
         END GENERATE P2;
     END GENERATE G1;
     q <= q_temp(4 DOWNTO 1);
END structure_arc;

(4)、计数器
四位二进制同步计数器

LIBRARY IEEE;
USE IEEE.std_logic_1164.ALL;
USE IEEE.std_logic_arith.ALL;
USE IEEE.std_logic_unsigned.ALL;
ENTITY counter IS 
    PORT (clk, areset, sset ,enable : IN  std_logic;
                             cout   : OUT  std_logic;
                                q   : BUFFER std_logic_vector(3 DOWNTO 0));
END counter;

ARCHITECTURE rtl_arc OF counter IS
BEGIN
     PROCESS (clk,areset)
     BEGIN
          IF (areset ='1') THEN
              q <= '0';
          ELSIF (clk'event AND clk ='1') THEN
              IF (sset ='1') THEN
                  q <= "1010";
              ELSIF (enable ='1') THEN
                  q <= q +1;
              ELSE
                  q <= q;
              END IF;
          END IF;
     END PROCESS;
     cout <= '1' WHEN q = "1111" AND enable ='1'
              ELSE '0';
END rtl_arc;

同步可逆计数器

LIBRARY IEEE;
USE IEEE.std_logic_1164.ALL;
USE IEEE.std_logic_arith.ALL;
USE IEEE.std_logic_unsigned.ALL;

ENTITY counterN IS 
    GENERIC (n : integer:=8);
    PORT (clk,areset,sset,enable,updown : IN  std_logic;
                                     q  : BUFFER std_logic_vector(n-1 DOWNTO 0));
END counterN;
ARCHITECTURE rtl_arc OF counterN IS
BEGIN
     PROCESS (clk,areset)
     BEGIN
          IF (areset ='1') THEN
              q <= '0';
          ELSIF (clk'event AND clk ='1') THEN
              IF (sset ='1') THEN
                  q <= '1';
              ELSIF (enable ='1') THEN
                  IF (updown ='1') THEN 
                      q <= q +1;
                  ELSE
                      q <= q -1;
                  END IF;
              ELSE
                  q <= q;
              END IF;
          END IF;
     END PROCESS;
END rtl_arc;

8、有限状态机
①、摩尔型

②、米里型

(1)、描述有限状态机功能的VHDL
①、至少包括一个状态信号,用来指定有限状态机的状态
②、包含状态转移指定和输出指定,对应于控制单元中与每个控制步骤有关的转移条件
③、包含时钟信号,用来同步
④、包含同步或异步复位信号

(2)、设计存储控制器

状态转移图

①、单进程

LIBRARY IEEE;
USE IEEE.std_logic_1164.ALL;

ENTITY store_controller IS 
    PORT (ready clk read_write : IN  std_logic;
	                     we,re : OUT std_logic);
END store_controller;

ARCHITECTURE state_machine OF store_controller IS
     TYPE state_type IS (idle,decision,read,write);
     SIGNAL state  : state_type;
BEGIN
     one_process:PROCESS (clk)
     BEGIN
          IF (clk'event AND clk ='1') THEN
             CASE state IS
                  WHEN idle => IF (ready ='1') THEN
                                   state <= decision;
                               ELSE
                                   state <= idle;
                               END IF;
                  WHEN decision => IF (read_write ='1') THEN
                                       state <= read;
                                   ELSE
                                       state <= write;
                                   END IF;
                  WHEN read => IF (ready ='1') THEN
                                   state <= idle;
                               ELSE
                                   state <= read;
                               END IF;
                  WHEN write => IF (ready ='1') THEN
                                    state <= idle;
                                ELSE
                                    state <= write;
                                END IF;
             END CASE;
          END IF;
     END PROCESS;
     re <= '1' WHEN state = read   ELSE '0';
     we <= '1' WHEN state = write  ELSE '0';
END state_machine;

②、三进程

LIBRARY IEEE;
USE IEEE.std_logic_1164.ALL;

ENTITY store_controller IS 
           PORT (ready : IN  std_logic;
                 clk   : IN  std_logic;
            read_write : IN  std_logic;
            we,oe      : OUT std_logic);
END store_controller;

ARCHITECTURE state_machine OF store_controller IS
     TYPE state_type IS (idle,decision,read,write);
     SIGNAL present_state,next_state : state_type;
BEGIN
     nextstate_logic:PROCESS (present_state,ready,read_write)
     BEGIN
          CASE present_state IS
               WHEN idle => IF (ready ='1') THEN
                                next_state <= decision;
                            ELSE
                                next_state <= idle;
                            END IF;
               WHEN decision => IF (read_write ='1') THEN
                                    next_state <= read;
                                ELSE
                                    next_state <= write;
                                END IF;
               WHEN read => IF (ready ='1') THEN
                                next_state <= idle;
                            ELSE
                                next_state <= read;
                            END IF;
               WHEN write => IF (ready ='1') THEN
                                next_state <= idle;
                             ELSE
                                next_state <= write;
                             END IF;
          END CASE;
     END PROCESS;    

state_register:PROCESS (clk)
     BEGIN
          IF (clk'event AND clk ='1') THEN
              present_state <= next_state;
          END IF;
     END PROCESS;

     output_logic:PROCESS (present_state)
     BEGIN
          CASE present_state IS
               WHEN idle     => we <= '0'; oe <= '0';
               WHEN decision => we <= '0'; oe <= '0';
               WHEN read     => we <= '0'; oe <= '1';
               WHEN write    => we <= '1'; oe <= '0';
          END CASE;
     END PROCESS;
END state_machine;

猜你喜欢

转载自blog.csdn.net/qq_43581718/article/details/106105975