一、可编程逻辑设计
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