1、1第一章 可编程集成电路基础1.1 概述1.2 在系统可编程逻辑器件的结构1.2.1 ispLSI10161.2.2 编程接口和编程 第二章 硬件描述语言VHDL基础2.1 概述2.2 VHDL语言语法规则2.2.1 标识符 ( Identifiers)2.2.2 数据对象 ( Data Objects )2.2.3 数据类型 ( Data Types )2.2.4 运算符 ( Operators)2.3 VHDL的语句结构分类2.3.1 库2.3.2 实体说明2.3.3 结构定义2.4 顺序语句2.4.1 信号赋值语句2.4.2 变量赋值语句2.4.3 if_then_else语句2.4.4
2、 case_when语句2.5 并行语句2.5.1 when_else语句2.5.2 with_select_when语句2.6 结构体的子结构描述2.6.1 block语句2.6.2 Proess ( 进程 ) 语句2.6.3 子程序2.6.4 程序包2.7 基本逻辑电路设计第三章 ispDesignEXPERT 开发系统第四章 设计示例第二章 硬件描述语言VHDL基础2.1 概 述随 着 集 成 电 路 的 设 计 规 模 的 增 大 和 复 杂 程 度 日 益 增 高 , 传 统 的 数 字 电 路 设 计 方法 不 适 合 设 计 大 规 模 的 系 统 。 众 多 软 件 公 司 开
3、 发 研 制 了 具 有 自 己 特 色 的 电 路 硬 件 描述 语 言 ( Hardware Description Language,HDL) , 存 在 着 很 大 的 差 异 , 因 此 ,需 要 一 种 强 大 的 、 标 准 化 的 硬 件 描 述 语 言 , 作 为 可 相 互 交 流 的 设 计 环 境 。 美 国 国 防部 在 80年 代 初 提 出 了 VHSIC( Very High Speed Integrated Circuit) 计 划 ,其 目 的 是 为 大 规 模 集 成 电 路 设 计 , 建 立 一 项 新 的 描 述 方 法 。 1981年 提 出 了
4、 一 种 新的 HDL, 称 之 为 VHSIC Hardware Description Language, 简 称 为 VHDL, VHDL语 言 可 描 述 一 个 数 字 电 路 的 输 入 、 输 出 以 及 相 互 间 的 行 为 与 功 能 , 它 特 有 的 层 次性 设 计 语 法 结 构 适 合 大 型 设 计 项 目 的 团 队 合 作 , 是 目 前 最 通 用 的 硬 件 描 述 语 言 。这 种 语 言 有 如 下 的 诸 多 优点:21. 可 描 述 复 杂 的 数 字 电 路 系 统 ;2 成 为 国 际 的 硬 件 描 述 语 言 标 准 , 1987年 被
5、采 纳 为 IEEE1076标 准3 与 硬 件 独 立 , 一 个 设 计 可 用 于 不 同 的 硬 件 结 构 , 而 且 设 计 时 不 必 了 解 过 多的 硬 件 细 节 ;4 有 丰 富 的 软 件 支 持 VHDL的 综 合 和 仿 真 , 从 而 能 在 设 计 阶 段 就 能 发 现 设 计 中的 Bug, 缩 短 设 计 时 间 , 降 低 成 本 ;5 VHDL有 良 好 的 可 读 性 , 容 易 理 解 。2.2 VHDL语言的语法规则2.2.1VHDL标识符(Identifiers) 基本标识符由字母、数字和下划线组成; 第一个字符必须是字母; 最后一个字符不能是
6、下划线; 不允许连续2个下划线; 保留字(关键字)不能用于标识符; 大小写是等效的。2.2.2 数 据 对 象 ( Data Objects )VHDL中常用的数据对象有:常量、信号和变量,常量相当于电路中的恒定电平,信号和变量相当于电路中的连线和连线上的信号值。1 常 量 (Constant)常量声明即为一个常量名赋予一个固定值,其一般格式为:CONSTANT 常量名:数据类型:=表达式;常量可在Library、Entity、Architecture、Process 中进行定义,其有效范围也相应限定。例如:CONSTANT w: integer := 8; - “w” 是整数类型的常数 ,其
7、值为“8”2 信 号 (Signal)信号没有方向性,是一个全局量,用于进程之间的通信,声明电路内部的信号。在Entity 中和 Architecture 中声明,信号声明语句格式为:SIGNAL 信号名:数据类型 约束条件:=表达式;例如: SIGNAL GROUND: BIT : = 0 ;符号“:=”表示直接赋值,用于指定信号的初始值。信号赋值语句的格式为: 信号名 =相 等不 等小 于大 于小 于 等 于 *大 于 等 于二 元 逻 辑 运 算 andornandnorxor逻 辑 与逻 辑 或与 非或 非异 或一 元 逻 辑 运 算 not 求 补连 接 END CASE;CASE
8、和 IS 间的表达式取值满足条件表达式的值时,程序执行由符号=指定的顺序处理语句。例 CASE语句举例library ieee;use ieee.std_logic_1164.all;13entity mux is port (a,b,c : in std_logic;output: out std_logic );end mux;ARCHITECTURE archdesign OF mux ISSIGNAL option: std_logic_vector(0 TO 1);BEGINdecode: PROCESS (a, b, c, option)BEGINCASE option ISWHE
9、N “00“ = output output output output END BLOCK块结构名;BLOCK语句中描述的各个语句可并发执行, 举例如下:例: 采用 BLOCK语句描述二选一电路ENTITY mux IS PORT ( d0,d1: IN BIT;Sel: IN BIT; Q: OUT BIT );END mux;ARCHITECTURE connect OF mux IS SIGNAL tmp1, tmp2, tmp3: BIT;BEGINcale:BLOCKBEGIN tmp1 RETURN 1;WHEN 1 = RETURN 0;WHEN z = RETURN z;EN
10、D CASE;END Invert;END Logic;2.7 用VHDL描述基本逻辑电路2.7.1 描述组合电路191. 用 VHDL语言描述一个如图所示的三态门。doutdinen图3 三态门20程序如下:LIBRARY IEEE; USE IEEESTD_LOGIC_1164.ALL;ENTITY tri_gate ISPORT(din,en : IN STD_LOGIC;Dout : OUT STD_LOGIC);END tri_gate;ARCHITECTURE example OF tri_gate ISBEGINPROCESS (din,en)BEGIN IF en=l THEN
11、dout 在 ispDesignEXPERT System Project Navigator主 窗 口 中 , 按File=New Project 菜 单 建 立 一 个 新 的 工 程 文 件 , 此 时 会 弹 出 如 下 图 所 示的 对 话 框 , 在 该 对 话 框 中 的 Project Type 栏 中 , 选 择 VHDL 类 型 , 然后 , 将 该 工 程 文 件 存 盘 为 demo.syn。25step2- 在 ispDesignEXPERT System Project Navigator 主 窗 口 中,选 择 Source=New 菜 单。 在 弹 出 的 Ne
12、w Source 对 话 框 中, 选 择 VHDL Module 类 型。此 时, 软 件 会 产 生 一 个 如 下 图 所 示 的 New VHDL Source 对 话 框:在 对 话 框 的 各 栏 中, 分 别 填 入 如 上 图 所 示 的 信 息。 按 OK 钮 后, 进 入 文 本 编 辑 器 - Text Editor 编 辑 VHDL 文 件。Step3- 在 Text Editor中 输 入 如 下 用 VHDL描 述 的 二 十 进 制 计 数 器 的 程序 , 存 盘 返 回 到 ispDesignEXPERT System Project Navigator 项
13、目 引 导 器 窗口 , 输 入 的 源 程 序 文 件 demo.vhd显 示 在 Source in Project中 。二十进制计数器程序及说明如下:library ieee;26use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity demo isport(clk,clr,en: in std_logic;A,B,C,D,E: out std_logic);end demo;architecture demo_arch of demo issignal count: std_logic_vector(4 do
14、wnto 0);beginA 选 中 Source in Project源 程 序 区 中 的 ispLSI1016-80LJ44, 在 主 窗 口 右 侧 选 择 Compile Design命 令 , 编 译 文 件 demo.vhd后生 成 熔 丝 图 文 件 ( *.jed) 。一 般 来 讲 , 第 一 次 输 入 的 VHDL源 程 序 时 都 可 能 存 在 语 法 和 其 他 输 入 方 面的 错 误 , 此 时 可 选 择 菜 单 Tools=Synplicity Synplify Synthesis,出 现 如 下 窗 口 。 选 Add调 入 demo.vhd, 然 后
15、对 demo.vhd文 件 进 行 编 译 、 综合 。 27若 整 个 编 译、 综 合 过 程 无 错 误, 该 窗 口 在 综 合 过 程 结 束 时 会 自 动 关 闭。 若 在 此 过 程 中 出 错, 双 击 上 述 Synplify 窗 口 中 Source Files 栏 中 的 demo.vhd 文 件 进 行 修 改 并 存 盘, 然 后 按 RUN 钮 重 新 编 译。Step5- 编 译 和 综 合 各 步 骤 通 过 后 , 要 形 成 可 以 将 程 序 下 载 到 实 验 板 上 的*.jed文 件 , 为 此 , 在 文 本 编 辑 软 件 中 按 照 程 序
16、编 写 一 个 引 脚 锁 定 文 件( *.prn) ,将 程 序 中 的 输 入 /输 出 信 号 与 实 验 板 上 的 ispLSI1016芯 片 的 具体 管 脚 一 一 对 应 。下面是demo中的二十进制计数器的引 脚 锁 定 文 件 demo.prn:In/out信 号 引 脚 属 性 芯 片 引 脚 号Clk In 11Clr In 14En In 24A Out 15B Out 16C Out 17D Out 18E out 19此 后 , 打 开 编 译 设 计 文 件 的 Compile Design的 Compile Properties对 话 框 , 在 Pin文
17、本 框 中 输 入 引 脚 锁 定 文 件 Demo.prn,然 后 单 击28“确 定 ”按 钮 , 完 成 引 脚 锁 定 功 能 。step6- 返 回 到 ispDesignEXPERT System Project Navigator 项 目 引 导器 窗 口 , 选 中 Source in Project源 程 序 区 中 的 ispLSI1016-80LJ44, 在 主 窗 口 右 侧 选 择 Compile Design命 令 , 编 译 文 件 demo.vhd后生 成 用 于 下 载 的 熔 丝 图 文 件 demo.jed。II. 下载 熔丝图文件为了下载熔丝图文件到实验
18、板的ispLSI1016-80PLCC44芯片中,执行如下操作:1 检查实验板的编程接口电缆是否已连接到计算机的并行接口处,如未连好,文件存盘后关闭计算机,将接口电缆连接好后开机;2 在 ispDesignEXPERT System Project Navigator 左 侧 的 Source in Project窗 口 中 , 选 中 系 统 可 编 程 逻 辑 器 件 ispLSI1016-80LJ44;3 在 右 侧 的 窗 口 中 , 双 击 系 统 可 编 程 逻 辑 器 件 的 ISP Daisy Chain Download(莲 花 链 式 下 载 )命 令 , 进 入 程 序
19、下 载 操 作 ;4 双 击 LSC ISP Daisy Chain Download 系 统 中 的 SCAN按 钮 开 始 扫 描 操作 , 查 找 用 户 实 验 板 上 的 ispLSI器 件 , 如 果 计 算 机 的 并 行 接 口 和 编 程接 口 电 缆 连 接 以 及 编 程 接 口 电 缆 和 用 户 电 路 板 的 连 接 无 误 , 则 程 序 将 显示 用 户 电 路 板 的 ispLSI集 成 电 路 的 型 号 , 然 后 提 示 Scan Board: successful。5 在 Browse窗 口 中 找 到 需 要 下 载 的 .jed文 件 , 并 选
20、择 PV(Program use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity freq isport (xclk,clk: in std_logic;A0,B0,C0,D0,A1,B1,C1,D1:out std_logic;A2,B2,C2,D2,A3,B3,C3,D3:out std_logic);end;architecture example of freq issignal countb:std_logic_vector(3 downto 0);
21、signal count0:std_logic_vector(3 downto 0);signal count1:std_logic_vector(3 downto 0);signal count2:std_logic_vector(3 downto 0);signal count3:std_logic_vector(3 downto 0);signal en,clr,m0,m1,m2:std_logic;beginP1:process(xclk,en,clr)beginif(clr=0) thencount0=“0000“; m0=0;elsif(en=1) and rising_edge
22、(xclk) ) thenif( count0=“1001“) thencount0=“0000“; m0=0;elsecount0=count0 + 1; m0=1;end if;end if;end process P1;P2:process(en,clr,m0)beginif(clr=0) thencount1=“0000“; m1=0;elsif(en=1) and falling_edge(m0) ) thenif( count1=“1001“) thencount1=“0000“; m1=0;30elsecount1=count1 + 1; m1=1;end if;end if;e
23、nd process P2;P3:process(en,clr,m1)beginif(clr=0) thencount2=“0000“; m2=0;elsif(en=1) and falling_edge(m1) ) thenif( count2=“1001“) thencount2=“0000“; m2=0;elsecount2=count2 + 1; m2=1;end if;end if;end process P3;P4:process(en,clr,m2)beginif(clr=0) thencount3=“0000“;elsif(en=1) and falling_edge(m2) ) thenif( count3=“1001“) thencount3=“0000“;elsecount3=count3 + 1;end if;end if;end process P4;P5:process(clk)beginif(rising_edge (clk) )thencountb=countb+1;elsecountb=countb;end if;if (countb=“0111“) thenclr = 0;elseclr = 1;end if;