可编程逻辑2

本文深入探讨了可编程逻辑设计的流程,包括模拟、综合、实现和时序模拟四个阶段。详细介绍了VHDL语言结构,如库、程序包、实体、结构体和配置。此外,文章还涵盖了VHDL中的数据类型、并行与顺序描述语句、组合逻辑和时序逻辑设计,以及如何利用VHDL设计有限状态机和存储控制器。
摘要由CSDN通过智能技术生成

一、可编程逻辑设计
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 be
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值