好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

电子设计自动化技术课件.ppt

299页
  • 卖家[上传人]:ni****g
  • 文档编号:581413652
  • 上传时间:2024-08-29
  • 文档格式:PPT
  • 文档大小:411.50KB
  • / 299 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 电子设计自动化电子设计自动化电子科技大学 第一章 电子设计自动化简介一、 历史与现状二 、EDA技术的根本特征三 、EDA工具简介四 、ASIC设计—EDA的重要应用五 、课程主要内容 一 历史与现状 传统的设计方法: 上 上 设计分解 构造系统 下 下 设计分解: 1 确定设计目标 2 功能分解 3 进一步细分,直至可用市面上买到 的元器件构建此模块为止构造系统: 1 用市面上可买到的元器件构建 最底层模块 2 用较低一层模块构造较高一层模块 3 构造顶层模块 传统设计方法的每一个设计步骤都要借助于经验和手工来完成,一个较为复杂的电子系统需要经过屡次设计 测试 修改 再设计的反复迭代过程,才能完成。

      弊端:效率低下、消耗量大 电子设计自动化技术〔Electronics Design Automation 简称EDA〕是一种以计算机为根本工作平台,应用计算机图形学、拓扑逻辑学、计算数学、以及人工智能等多种计算机应用科学的最新成果开发出来的一整套软件工具,帮助电子设计工程师从事电子元件、产品和系统设计的综合技术 EDA的开展第一代:70年代 手工绘制PCB和IC幅员 在计算机上完成第二代: 80年代 仿真和自动布局布线第三代: 90年代 高级语言描述、系统级仿真和综合,开始实 现“概念驱开工程〞〔Concept Driver Engineering, CED 〕的梦想 二、EDA技术的根本特征第三代EDA技术的根本特征有三个方面: 1. 高级语言描述 2. 自顶而下的分层设计 3. 并行设计环境 1. 高级语言描述迫于Time-to-Market 的压力和设计大规模集成电路的需要,产生了硬件描述语言。

      HDL特点:〔1〕是一种计算机语言 〔2〕可以对电子系统进行分层设计 与描述〔3〕描述即可抽象〔高层的行为描述〕, 也可具体〔底层的结构描述〕〔4〕支持延迟仿真,可模拟硬件行为〔5〕数据类型丰富,可自定义类型 2. 自上而下的分层设计传统设计方法是自下而上缺点:即使每一个子系统分别满足设计要求 但整个系统的要求不一定得到满足现代设计方法是自上而下设计: 特点:逐层描述、逐层模拟 保证满足系统指标 3. 并行设计环境 将众多的软件工具集成在一起,对电子系统设计进行工程管理、流程控制、数据管理等工作,使原来各个独立的软件工具成为一个统一的设计软件包,便于使用和管理 新趋势:抛弃各公司专有设计环境,开发符合工业标准的公共设计平台和接口标准 三、EDA工具简介 1. 设计输入工具 2. 仿真工具 3. 综合工具 4. PCB设计工具 5. IC/ASIC设计工具 6. 库与库开发工具 7. 机电一体化设计 8. 软件设计工具 四、ASIC设计—EDA的重要应用 ASIC-----Application Specific Integrated Circuit是根据某种整机或电子系统的要求而专门设计的IC。

      优点:集成度高、速度快、可靠性好、保密性好、 体积小、重量轻 1、ASIC分类 IC 通用IC 专用IC---ASIC 专用定制ASCP 面向多用户、特定领域ASSP 全定制ASIC 半定制ASIC 常用的半定制ASIC: 门阵列 (Gate Array) 标准单元 (Standard Cell) 可编程器件 (PLD) 现场可编程门阵列 (FPGA) 2. ASIC的设计方法〔1〕别离元器件〔中小规模IC〕的电路集成  需要解决:电路结构调整,以适应ASIC实现       电路优化       测试码生成  可借助EDA工具实现 〔2〕由功能到电路的设计实现   根据系统或整机要求提指标,然后设计 较优化 3. ASIC的设计步骤〔1〕概念形成阶段 〔2〕系统描述或电路设计阶段〔3〕功能仿真阶段〔4〕时序验证仿真阶段〔5〕测试码生成,测试码仿真阶段〔6〕得到如下文件:    全部电路图、自制库、时序仿真波形与输入鼓励、    测试码仿真波形与相应的测试码,外引脚清单、    IC交、直流特性。

        〔7〕 布局布线〔8〕 后仿真阶段〔9〕 工艺测试码生成阶段〔10〕样片初测 〔11〕样片终测 五、课程内容 HDL语言是当今EDA技术开展的突出代表 HDL分为 VHDL (侧重高层设计〕 Verilog 〔侧重结构设计〕 VHDL更适合一般电子设计工程师的需要,本课程主 要介绍VHDL语言 推荐参考书VHDL硬件描述语言与数字逻辑电路设计西安电子科技大学出版社 第二章 VHDL语言入门第一节 VHDL概念第二节 VHDL语言优缺点第三节 VHDL建模方法 第一节 VHDL概念VHSIC---Very High Speed Integrated CircuitVHDL----VHSIC Hardware Description Language 传统设计方法:传统设计方法: 原理图、真值表、原理图、真值表、 卡诺图、状态方程卡诺图、状态方程 缺点:〔1〕费时费力,易于出错。

      〔2〕自己设计控制逻辑 〔3〕难于理解和维护 〔4〕需建立相应文档以说明功能 〔5〕原理图输入工具专用,难于移植 〔6〕不适合于系统仿真 在实行VHSIC方案〔美国国防部于70年代末至80年代初实行的研制高速、大规模集成电路的开发方案〕中,发现传统的设计方法无法满足开发这类非常复杂集成电路的要求 81年 提出标准 87年 成为IEEE1076标准 93年 更新为IEEE1164标准 96年 成为综合标准 VHDL是用于描述硬件系统、电路板和元件结构与功能的设计与建模语言 第二节 VHDL语言优缺点一、优点: 1. 快速 2. 强大而灵活 3. 工艺独立 4. 可移植性 5. 测试能力 6. 工艺转换 第二节 VHDL语言优缺点一、优点: 1. 快速 2. 强大而灵活 3. 工艺独立 4. 可移植性 5. 测试能力 6. 工艺转换 第二节 VHDL语言优缺点一、优点: 1. 快速 2. 强大而灵活 3. 工艺独立 4. 可移植性 5. 测试能力 6. 工艺转换 强大而灵活l语言结构丰富l多层次描述l支持库和设计复用l支持模块化设计l既可设计也可仿真 第二节 VHDL语言优缺点一、优点: 1. 快速 2. 强大而灵活 3. 工艺独立 4. 可移植性 5. 测试能力 6. 工艺转换 工艺独立lVHDL描述与器件和工艺无关l支持多种描述风格 支持多种描述风格网表: U1: xor2 port map {a(0), b(0), x(0)}; U2: xor2 port map {a(1), b(1), x(1)}; U3: nor2 port map {x(0), x(1), aeqb};布尔方程: aeqb <=(a(0) XOR b(0)) NOR (a(1) XOR b(1));并行描述: aeqb <= ‘1’ When a=b else ‘0’ ;串行描述: IF a=b THEN aeqb <= ‘1’ ELSE aeqb <= ‘0’ END IF; 第二节 VHDL语言优缺点一、优点: 1. 快速 2. 强大而灵活 3. 工艺独立 4. 可移植性 5. 测试能力 6. 工艺转换 第二节 VHDL语言优缺点一、优点: 1. 快速 2. 强大而灵活 3. 工艺独立 4. 可移植性 5. 测试能力 6. 工艺转换 第二节 VHDL语言优缺点一、优点: 1. 快速 2. 强大而灵活 3. 工艺独立 4. 可移植性 5. 测试能力 6. 工艺转换 二、缺点: 〔1〕放弃对电路级实现的控制, 代之抽象、高层描述。

      〔2〕综合器综合出的电路效率不高 〔3〕综合的效果随工具的不同而不同 第三节 VHDL建模方法 易于理解 VHDL应具备 易于修改 VHDL构造复杂设计的方法 〔1〕 自顶向下设计 〔2〕 模块化 〔3〕 抽象 〔4〕 信息隐藏 〔5〕 一致性 第三章 VHDL根底 本章介绍根本的VHDL概念及与语言相关的术语 第一节 VHDL构件 第二节 根本语言结构 第三节 设计描述层次 第一节 VHDL构件VHDL由语言构件组成: 75 个保存字200个描述字或字的组合 保存字是对VHDL编译器有特殊意义的字 要求: 严格按照VHDL定义使用。

      描述字组合并不出现在实际的VHDL程序中 ,仅在VHDL语法定义中使用,提供在构造VHDL描述时的构件名 例: port_clause 构件图 port_clause port ( port_list ) ; 保存字 可表示为:port_clause…….port (port_list) ; 第二节 根底语言结构 VHDL硬件模型的主要构成是 设计实体〔Design Entity) 它可以表示一个电路单元(cell) 、芯片(chip) 电路板(board) 或电子系统(subsystem) 设计实体由两局部构成:设计实体由两局部构成: 实体声明〔实体声明〔Entity Declaration)Entity Declaration) 结构体结构体 〔〔Architecture Body)Architecture Body) Design Entity Entity Declaration Architecture Body 库单元: 可独立存在于一个设计文件中, 并被编译的硬件描述〔模型〕的局部。

      四种库单元: 实体声明 结构体 封装声明 〔Package Declaration) 封装体 (Package Body) 允许声明(Declaration)和体(Body) 的局部分别被编译 实体声明定义了设计实体与外部的接口 结构: ENTITY identifier IS entity_header --(generic and/or port clauses) entity_declarative_part --(declarations for subprograms, -- types, signals, ……) BEGIN entity_statement_part END identifier ; generic语句和port语句格式: generic_clause …..generic (generic_list); port_clause ..…port (port_list); 实体声明最简单的例子: ENTITY and2 IS a q PORT (a, b : IN bit; b q : OUT bit); END and2; 结构体描述设计实体的输入与输出的关系 〔设计实体的行为与结构〕结构: ARCHITECTURE identifier OF entity_name IS architecture_declarative_part BEGIN architecture_statement_part END identifier ; 例如: ARCHITECTURE example OF and2 IS --declaration here BEGIN --statements here END example; 每一个设计实体只能有一个实体声明,可有一个或多个结构体。

      〔不同的抽象级别或算法〕例: Entity Declaration Architecture Body behave trfc_lc rtl structure 硬件描述似金字塔形,最顶层为实体声明〔最根本单元〕 Entity Generic Port In Port OutArchitecture Architecture Architecture CS Block CS CS CS CS Block CS Block Process CS CP SS CS SS Block Process Process CS SS SS CS SS SS 第三节 设计描述层次 VHDL硬件描述的抽象层次为: 行为级描述 (Behavioral Level Description) 存放器传输级描述 (Register Transfer Level(RTL) Description) 结构级描述 (Structural Level Description) 一 、结构级描述 结构级描述用相互连接的元件来表达一个设计。

      这种方法比较类似原理图 例:两输入多路器原理图表示, 上层: 下层:DoD1 QselD0Sel U3 aa U4 Q u1D1 U4 abnsel VHDL描述: ENTITY mux IS --实体声明 PORT (d0, d1, sel: IN bit; q: OUT bit ); --端口语句 END mux; --结构体 ARCHITECTURE struct OF mux IS COMPONENT and2 --结构声明局部 PORT(a, b: IN bit; c: OUT bit); END COMPONENT; COMPONENT or2 PORT(a, b: IN bit; c: OUT bit); END COMPONENT; COMPONENT inv PORT (a: IN bit c: OUT bit); END COMPONENT; SIGNAL aa,ab, nsel: bit --信号声明 FOR U1 :inv USE ENTITY WORK. Invrt (behav); --配置说明 FOR U2 , U3:and2 USE ENTITY WORK. And_gt(dflw); -- FOR U4 :or 2 USE ENTITY WORK. Or_gt(arch1); -- BEGIN u1: inv PORT MAP (sel, nsel); --结构体描述局部 u2: and2 PORT MAP (nsel, d1, ab); u3: and2 PORT MAP (d0, sel, aa); u4: or2 PORT MAP (aa, ab, q); END struct; 二、行为级描述 行为级描述是用电路和信号对于各种鼓励的响应的方式来表达一个设计的功能。

      行为级描述着重用于描述硬件的算法,而不涉及其结构如何实现它可用于快速建立与仿真整个电路功能,以及作为其它模块鼓励 例: 多路器: ENTITY mux IS PORT (d0, d1, sel: IN bit; q: OUT bit); END mux; ARCHITECTURE behav OF mux IS BEGIN f1: PROCESS (d0, d1, sel) BEGIN IF (sel=‘0’) THEN q <= d1; ELSE q<= d0; END IF; END PROCESS f1; END behav; 与结构级描述的主要区别是process 语句。

      Process语句格式为: process statement… label: PROCESS (sensitivity_list) process_declarative_part BEGIN process_statement_part END PROCESS label; Process语句的核心内容是 IF语句,其格式为:if statement … IF condition THEN sequence_of_statements ELSIF condition THEN sequence_of_statements ELSE sequence_of_statements END IF; if 语句用法与C、BASIC语言中用法相近。

      信号赋值语句:信号赋值语句: target <= TRANSPORT waveform; 上式中,上式中,<=为组合分隔符,表示其右边的值为组合分隔符,表示其右边的值赋给左边的赋给左边的target 在在VHDL语言中,语言中,<=也可作为关系算子,意也可作为关系算子,意思是思是“小于等于〞小于等于〞 以一个移位存放器为例说明: 数组类型:多个元素,每个元素均为相同数据类型〔bit)可用 TO 或 DOWNTO 指示 shftin shftout shftctl 0 1 2 3 0 1 2 3 0 1 当shftctl为“00〞时: shftin 0 1 2 3 S0 S1 S2 S3 shftout 0 1 2 3 当shftctl为“01〞时: shftin 0 1 2 3 S0 S1 S2 ‘0’ shftout 0 1 2 3 当shftctl为“10〞时: shftin 0 1 2 3 ‘0’ S0 S1 S2 shftout 0 1 2 3 当shftctl为“11〞时: shftin 0 1 2 3 S0 S0 S1 S2 shftout 0 1 2 3 ENTITY shifter IS --实体声明 PORT (shftin :IN bit_vector(0 TO 3); --端口语句 shftout :OUT bit_vector(0 TO 3); shftctl :IN bit_vector(0 TO 1)); END shifter; ARCHITECTURE behav OF shifter IS --结构体 BEGIN f2: PROCESS(shftin, shftctl) - - process描述 VARIABLE shifted: bit_vector(0 TO 3); --pro.声明局部 BEGIN CASE shftctl IS - -process描述局部 WHEN “00〞 =>shifted := shftin; WHEN “01〞 =>shifted := shftin(1 TO 3) & ‘0’; WHEN “10〞 =>shifted := ‘0’ & shftin(0 TO 2); WHEN “11〞 =>shifted :=shftin(0) & shftin(0 TO 2); END CASE; shftout <= shifted AFTER 10 ns; END PROCESS f2; END behav; 变量声明格式: variable declaration … VARIABLE identifier_list : subtype_indication :=expression;变量赋值语句: variable assignment statement … target := expression; case语句: case statement … CASE expression IS WHEN choices => --case stmnt alternative sequence_of_statements END CASE; 结构级描述与行为级描述的差异:结构级描述与行为级描述的差异: 结构级描述确定了各种元件的连接,结构级描述确定了各种元件的连接, 行为级描述确定了电路和信号对各种鼓励的行为级描述确定了电路和信号对各种鼓励的算法。

      算法 有信号赋值语句有信号赋值语句 ------非结构级描述非结构级描述 有元件实例化语句有元件实例化语句-----非行为级描述非行为级描述 三、三、RTL描述描述 RTL描述用从一个输入或存放器到另一个描述用从一个输入或存放器到另一个存放器或存放器或 输出的信息流来确定一个设计的功能输出的信息流来确定一个设计的功能RTL描述和行为级描述都用描述和行为级描述都用process 来描述电路来描述电路的功能行为级描述用少量行为级描述用少量process, 每个每个process完成许多完成许多串行信号赋值串行信号赋值 RTL描述用大量的并行信号赋值语句描述用大量的并行信号赋值语句 RTL描述使用以下并行语句〔concurrent〕: Block语句 并行程序调用〔procedure〕 并行断言语句〔assertion〕 并行信号赋值语句 以多路器〔以多路器〔MUX〕为例:〕为例: ENTITY mux IS --实体声明实体声明 PORT (d0, d1, sel: IN bit; q: OUT bit);--端口语句端口语句 END mux; -- 结构体结构体 ARCHITEDTURE rtl OF mux IS BEGIN csl: --并行信号赋值描述并行信号赋值描述 q <= d1 WHEN sel =‘0’ ELSE -- 条件信号描条件信号描述述 d0; END rtl; 并行信号赋值语句的格式为:并行信号赋值语句的格式为:concurrent signal assignment statement … label: conditional_signal_assignment ... Or label: selected_signal_assignment conditional signal assignment … target <= options conditional_waveforms;conditional waveforms … waveform WHEN condition ELSE waveform WHEN condition ELSE waveform 以移位存放器为例,比较行为级描述与RTL级描述的区别。

      行为级描述: ENTITY shifter IS PORT (shftin :IN bit_vector ( 0 TO 3); shftout :OUT bit_vector (0 TO 3); shftctl :IN bit_vector (0 TO 1)); END shifter; ARCHITECTURE behav OF shifter ISBEGIN f2: PROCESS (shftin, shftctl ) VARIABLE shifted : bit_vector ( 0 TO 3); BEGIN CASE shftctl IS WHEN “00〞〞=> shifted := shftin; WHEN “01〞〞=> shifted :=shftin(1 TO 3) & ‘0’; WHEN “10〞〞=> shifted := ‘0’ & shftin(0 TO 2); WHEN “11〞〞=> shifted := shftin(0) & shftin(0 TO 2); END CASE ; shftout <== shifted AFTER 10 ns; END PROCESS f2;END behav; RTL级描述:ENTITY shifter IS PORT (shftin :IN bit_vector (0 TO 3); shftout :OUT bit_vector (0 TO 3); shftctl :IN bit_vector (0 TO 1));END shifter ; ARCHITECIURE rtl OF shifter ISBEGIN shftout(3) <= ‘0’ AFTER 10 ns WHEN shftctl = “01〞〞 ELSE shftin(3) AFTER 10 ns WHEN shftctl = “00〞〞 ELSE shftin(2) AFTER 10 ns ; shftout(2) <= shftin(3) AFTER 10 ns WHEN shftctl =“01〞〞 ELSE shftin(2) AFTER 10 ns WHEN shftctl =“00〞〞 ELSE shftin(1) AFTER 10 ns; shftout(1) <= shftin(2) AFTER 10 ns WHEN shftctl =“01〞〞 ELSE shftin(1) AFTER 10 ns WHEN shftctl = “00〞〞 ELSE shftin (0) AFTER 10 ns; shftout(0) <= shftin(1) AFTER 10 ns WHEN shftctl =“01〞〞 ELSE ‘0’ AFTER 10 ns WHEN shftctl =“10〞〞 ELSE shftin(0) AFTER 10 ns;END rtl; 第四章第四章 数据类型数据类型第一节第一节 数据类型定义数据类型定义第二节第二节 提取对象的信息提取对象的信息 第一节第一节 数据类型定义数据类型定义VHDL 数据类型分为:数据类型分为: 数量类型数量类型 〔〔Scalar Types) 组合类型组合类型 (Composite Types) 文件类型文件类型 (File Types) 寻址类型寻址类型 (Access Types) 对象(Objects)是指装载指定类型值的容器。

      对象可以是信号、变量或常量算子或子程序可对对象值进行处理例: PORT (d0, d1, sel : IN bit; q : OUT bit); 在预定义的package “standard〞中,定义 bit类型是值为0或1的集合 TYPE bit IS (‘0’ , ‘1’); 一旦一个对象被声明为某一类型,那么在类型声明所界定的范围内可以对对象进行运算〔或操作〕 例:bit类型对象,可以定其值为‘0’或‘1’,但不能定其值为10 〔越界〕 类型声明的格式为:类型声明的格式为: type declaration … TYPE identifier IS type_definition;* 注意:identifier不能为预定义类型 子类型声明的格式为:子类型声明的格式为: subtype declaration … SUBTYPE identifier IS subtype_indication;子类型并不是一个新类型,它是基类型的子集的一个新名字。

      例: TYPE control_valves IS (on ,off, standby, shutdown); SUBTYPE off_controls IS control_valves RANGE off TO shutdown; 一、 数量类型数量类型用相应的比例来说明 包括: 物理类型 〔physical types) 浮点类型 (floating types) 枚举类型 〔enumeration types) 整数类型 〔integer types) 1. 物理类型物理类型 可测量的量,用可测量根本单位的整数倍表达可测量的量,用可测量根本单位的整数倍表达 格式为:格式为: physical type definition … RANGE range UNITS identifiers; --基准单位声名基准单位声名 identifier = abstract_literal name; END UNITS Range的结构为:的结构为:range … attribute_name 或或simple_expression TO simple_expression 或或simple_expression DOWNTO simple_expression 预定义类型预定义类型: “time〞。

      〞 例:例:TYPE measure IS RANGE 0 TO 1,000,000,000 UNITS mm; cm= 10 mm; dm= 10 cm; m = 1000 mm; END UNITS; 用用measure类型的例子:类型的例子: process_size: PROCESS (sig1) VARIABLE w,h : measure; BEGIN w: = (100cm + 1 m) - 10 mm; h: = 20 cm + w; sig2 <= z; -- 其它地方声明其它地方声明 END PROCESS process_size; 2. 浮点类型浮点类型 定义了一个近于实数的数集合。

      定义了一个近于实数的数集合 由于精度有限,由于精度有限, 如如 可取为可取为格式:格式: floating type definition… RANGE range预定义浮点类型预定义浮点类型: “real〞 例:例: 定义定义half_hour 类型为:类型为: TYPE half_hour IS RANGE 0.0 TO 29.99; 执行以下运算:执行以下运算:      test_time: PROCESS VARIABLE test_t1: half_hour; BEGIN test_t1: =15.0+15.00; END PROCESS test_time; 例:例: 定义定义half_hour 类型为:类型为: TYPE half_hour IS RANGE 0.0 TO 29.99; 执行以下运算:执行以下运算:      test_time: PROCESS VARIABLE test_t1: half_hour; BEGIN test_t1: =15.0+15.00; END PROCESS test_time;Error!   3. 枚举类型枚举类型   定义一个用户化的数值集合。

         定义一个用户化的数值集合格式格式:enumeration type definition … (enumeration_literal1, …,enumeration_literaln)enumeration literal 可为标识符〔字母、下划线、数字可为标识符〔字母、下划线、数字〕〕               或符号字〔单引号括起的图形符号〕或符号字〔单引号括起的图形符号〕 例:例:TYPE wire_color IS (red, black, green)TYPE traffic_light IS (red, yellow, green,flashing) 预定义枚举类型:预定义枚举类型: bit,boolean,character,severity_level. 4. 整数类型整数类型  格式:  格式: integer type definition …RANGE range 指定指定range时,编译器必须知道其值。

      时,编译器必须知道其值 预定义整数类型: integer 例:例:TYPE test_int IS RANGE 0 TO black; 例:例:TYPE test_int IS RANGE 0 TO black;Error! 例:例:TYPE test_int IS RANGE 0 TO black;TYPE test_integer IS RANGE 0 TO ext_val;假定ext_val为外部输入参数Error! 例:例:TYPE test_int IS RANGE 0 TO black;TYPE test_integer IS RANGE 0 TO ext_val;假定ext_val为外部输入参数Error!Error!         二、组合类型用一个标识符代表一组值分为: 数组类型 〔Array Types) 记录类型 〔Record Types)   1. 数组类型 相同类型的元素的集合可以为一或多维数组 可用指针〔index)指向元素 数组定义:数组定义: 无约束数组定义无约束数组定义 〔〔unconstrained) (大小不定〕大小不定〕受约束数组定义受约束数组定义 〔〔constrained) (大小指定大小指定〕〕 格式:受约束数组:格式:受约束数组:constrained array definition … ARRY index_constraint OF subtype_indication 无约束数组:无约束数组:unconstrained array definition … ARRY (type_mark RANGE< >) OF subtype_indication 例:例: 受约束的:受约束的:TYPE arr1 IS ARRY (0 TO 4) OF integer; 无约束的:无约束的: TYPE mem_arr IS ARRY (0 TO 1023) OF integer;TYPE arr2 IS ARRY (integer RANGE< >) OF mem_arr; 2. 记录类型记录类型 元素可为各种类型。

      元素可为各种类型格式:格式: record type definition … RECORD identifier_list:element_subtype_definition … END RECORD 例:例: TYPE half_day IS (am,pm); TYPE clock_time IS RECORD hour: integer RANGE 1 TO 12; minute, second: integer RANGE 1 TO 60; ampm: half_day; END RECORD; 用法:用法: VARIABLE time_of_day: clock_time; …. time_of_day.minute:=35; start_hour := time_of_day.hour; 三、文件类型定义外部文件所存数据类型格式:file type definition …… FILE OF type_mark 四、寻址类型其值指向其它对象格式:Access_type_definition …… ACCESS subtype_indication 第二节第二节 提取对象的信息提取对象的信息利用属性〔利用属性〔attribute)提取对象信息用提取对象信息用于运算和测试于运算和测试 可供提取信息的对象类型有: 数组〔Arrays) 块 (Blocks) 信号 (Signals) 类型 (Types) 属性定义格式:attribute name …… prefix ’attribute_simple_name对象或函数调用 例:属性 ’eventLIBRARY my_lib;USE ;ENTITY incomplete_counter ISPORT (clock, data : IN my_qsim_state; q_out : INOUT my_qsim_state);END incomplete_counter;ARCHITECTURE behav OF incomplete_counter ISBEGIN q_out <= data WHEN clock’event AND clock=‘1’ ELSE q_out;END behav;‘0’‘1’ 例:属性 ’left和 ’rightTYPE high_byte IS RANGE 28 TO 31;……FOR i IN high_byte ’left TO high_byte’right LOOP ……END LOOP; 例: 属性 ’pos(x)返回x的位置值TYPE opcode IS (mov, lda, sta, jmp, ret, add, sub, nop, hlt);CONSTANT stop: integer := opcode ’pos(hlt); 例: 属性 ’pos(x)返回x的位置值TYPE opcode IS (mov, lda, sta, jmp, ret, add, sub, nop, hlt);CONSTANT stop: integer := opcode ’pos(hlt);0 1 2 3 4 5 6 7 8~~~~~~~~~~~ Stop = 8 第五章 分解设计功能的结构第一节 并行分解第二节 串行分解第三节 并行与串行建模比较第四节 信号与变量赋值第五节 多值驱动的决断第六节 产生共享模块 Delta延迟 Block1 Block2 Process1CS1 CS2 CS3 CS1 CS2 CS3 SS1 SS2 SS3递归1时间 第一节 并行分解构造硬件并行执行的功能 VHDL语言中并行语句有l并行信号赋值语句lProcess语句l并行程序〔procedure)调用l并行断言〔assertion)语句lBlock语句l元件实例化语句lGenerate语句 VHDL语言中并行语句有l并行信号赋值语句lProcess语句l并行程序〔procedure)调用l并行断言〔assertion)语句lBlock语句l元件实例化语句lGenerate语句 一、Block语句 Block语句是分解硬件功能的主要的并行语句。

      它将多个并行语句归入一个设计单元 格式:block statement …… label: BLOCK (expression)block_declarative_item BEGINconcurrent_statement END BLOCK label; 例:ENTITY bistable_latch ISPORT (enable, data : IN bit; q, q_not : OUT bit);END bistable_latch; ARCHITECTURE example OF bistable_latch ISBEGINlatch1:BLOCK (enable=‘1’)SIGNAL d_in : bit;BEGINd_in <= GUARDED data;q<= d_in;q_not <= NOT d_in;END BLOCK latch1;END example; ’behavior 和 ’structure 识别block是行为级描述或结构级描述例:ASSERT latch1’behavior REPORT “Block latch1 is not a behavioral description〞; SEVERITY note;ASSERT latch1’structure REPORT “Block latch1 is not a structural description〞; SEVERITY note; 二、元件实例化语句介绍元件声明和元件实例化语句。

      〔仅用于结构级描述〕 元件实例化的顺序:先声明 后实例化 元件声明描述了元件的接口关系 格式:component declaration … COMPONENT identifier generic_clause port_clause END COMPONENT; component instantiation statement……label: name generic_map_aspect port_map_aspect ; generic map aspect …… GENERIC MAP (association_list) port map aspect …… PORT MAP (association_list)Association list …… association_element, association_element … VHDL描述: ENTITY mux IS --实体声明 PORT (d0, d1, sel: IN bit; q: OUT bit ); --端口语句 END mux; --结构体 ARCHITECTURE struct OF mux IS COMPONENT and2 --结构声明局部 PORT(a, b: IN bit; c: OUT bit); END COMPONENT; COMPONENT or2 PORT(a, b: IN bit; c: OUT bit); END COMPONENT; COMPONENT inv PORT (a: IN bit c: OUT bit); END COMPONENT; SIGNAL aa,ab, nsel: bit ; --信号声明 FOR U1 :inv USE ENTITY WORK. Invrt (behav); --配置说明 FOR U2 , U3:and2 USE ENTITY WORK. And_gt(dflw); -- FOR U4 :or 2 USE ENTITY WORK. Or_gt(arch1); -- BEGIN u1: inv PORT MAP (sel, nsel); --结构体描述局部 u2: and2 PORT MAP (nsel, d1, ab); u3: and2 PORT MAP (d0, sel, aa); u4: or2 PORT MAP (aa, ab, q); END struct; 用不同的参数实例化元件 —— generic clause例如:与门中,entity declaration 中有generic clause:prop_delay : time;在architecture body 中有:generic map : prop_delay => 12 ns;generic map : prop_delay => 10 ns;generic map : prop_delay => 8 ns; 第二节 串行分解硬件功能串行执行的结构 在VHDL语言中可用作串行执行的语句有:l控制语句〔Control Statements)l If语句、 Case语句、 Wait语句 在VHDL语言中可用作串行执行的语句有:l控制语句〔Control Statements)l循环语句〔Looping Statements) 在VHDL语言中可用作串行执行的语句有:l控制语句〔Control Statements)l循环语句〔Looping Statements)l Loop语句、 Next语句、 Exit语句 在VHDL语言中可用作串行执行的语句有:l控制语句〔Control Statements)l循环语句〔Looping Statements)l赋值语句〔Assignments) 在VHDL语言中可用作串行执行的语句有:l控制语句〔Control Statements)l循环语句〔Looping Statements)l赋值语句〔Assignments)l 信号赋值、变量赋值 在VHDL语言中可用作串行执行的语句有:l控制语句〔Control Statements)l循环语句〔Looping Statements)l赋值语句〔Assignments)l断言语句〔Assertion Statement)l返回语句〔Return Statement)l空语句 〔Null Statement)l子程序 〔Subprograms) 在VHDL语言中可用作串行执行的语句有:l控制语句〔Control Statements)l循环语句〔Looping Statements)l赋值语句〔Assignments)l断言语句〔Assertion Statement)l返回语句〔Return Statement)l空语句 〔Null Statement)l子程序 〔Subprograms) 子程序〔Subprograms) 用算法计算值,然后返回分为:procedurefunction 子程序结构:子程序声明〔subprogram declaration)子程序体 〔subprogram body) subprogram subprogram declaration subprogram body 子程序声明定义子程序与外部环境接口子程序体为算法或行为描述 通过调用子程序使主程序阅读更为方便主程序关心的是发生了什么事〔What happened)子程序描述怎么发生的〔How happeded) Procedure 与function的区别: function只返回一个值〔用return),且不改变其它值。

      procedure可返回多个值〔无return),或不返回值,可改变其它值 主程序Procedure Call RAM Load Procedure RAM FileProcedure Call RAM Read ProcedureProcedure Call Concat RAM Data Procedure Function Call Check Parity FunctionOp_Code(256)Op_Code(256)RAM_Code(4)AddressRAM_Data(4)RAM_Data(4)RAM_Data_ConcRAM_Data_ConcOp_Code_ConcBoolean ValueRAM_Package 子程序在package中定义。

      主程序在调用前需要用Library语句和Use语句使之可见说明: 子程序声明的格式:PROCEDURE designator (formal_parameter_list);-- 或者FUNCTION designator (formal_parameter_list)RETURN type_mark; 子程序体的格式:PROCEDURE designator (formal_parameter_list) IS-- 或者FUNCTION designator (formal_parameter_list)RETURN type_mark ISsubprogram_declarative_partBEGINsubprogram_statement_partEND designator; function调用格式:function call …… name (association_element, …)association_element …… format_part => actual_part procedure调用的格式:并行调用 concurrent procedure call ……label: name (association_element, …);串行调用 procedure call statement ……name (association_element, …); 在实体声明之前需要有:LIBRARY lib_stuff, package_stuff;在实体声明或结构体的声明局部需要有:USE lib_stuff.ram_package.all;在ram_package的声明局部有:TYPE op_code_array IS ARRAY (0 TO 255) OF bit_vector(0 TO 7); ------Procedure 声明------PROCEDURE ram_load (CONSTANT Op_code: IN op_code_array);------Procedure 体------PROCEDURE ram_load (CONSTANT Op_code: IN op_code_array) ISFILE ram_cntnts: op_code_array IS IN “/idea/user/vhdl_lib/ram1_file〞;BEGINFOR a IN Op_code’RANGE LOOP write (ram_cntnts, Op_code(a));END LOOP;END ram_load; 在ram_package的声明局部需要有:TYPE ram_data_array IS ARRAY (0 TO 3) OF bit_vector (0 TO 7);在预定义的math package中有:FUNCTION rand (seed: real) RETURN real; ------Procedure 声明------PROCEDURE ram_read (VARIABLE ram_data: OUT ram_data_array; VARIABLE test_add_start: OUT integer);------Procedure 体------PROCEDURE ram_read (VARIABLE ram_data: OUT ram_data_array;VARIABLE test_add_start: OUT integer) IS FILE ram_cntnts: op_code_array IS IN “/idea/user/vhdl_lib/ram1_file〞; USE std.math.rand; VARIABLE address : integer; VARIABLE op_code: op_code_array; CONSTANT Seed : real := 0.1; BEGIN address := integer ( rand(Seed) * 63.0) * 4; test_add_start := address; FOR a IN 0 TO (address + 3) LOOP read( ram_cntnts, op_code(a)); IF a >= address THEN ram_data( a – address) := op_code(a); END IF; END LOOP;END ram_read; ------Procedure 声明------PROCEDURE concat_data (CONSTANT Ram_data: IN ram_data_array;VARIABLE ram_data_conc: OUT bit_vector (0 TO 31));------Procedure 体------PROCEDURE concat_data (CONSTANT Ram_data: IN ram_data_array; VARIABLE ram_data_conc: OUT bit_vector (0 TO 31)) ISBEGIN ram_data_conc := Ram_data(0) & Ram_data(1) & Ram_data(2) & Ram_data(3) ;END concat_data; ------ Function声明 ------FUNCTION chk_pty ( CONSTANT Ram_data_conc : IN bit_vector (0 TO 31); CONSTANT Op_code_conc : IN bit_vector (0 TO 31)) RETURN boolean;------ Function 体 ------FUNCTION chk_pty ( CONSTANT Ram_data_conc : IN bit_vector (0 TO 31); CONSTANT Op_code_conc : IN bit_vector (0 TO 31)) RETURN boolean IS VARIABLE sum1, sum2 : boolean := false; BEGIN FOR i IN 0 TO 31 LOOPIF Ram_data_conc(i) = ‘1’ THEN sum1 := NOT sum1;END IF;IF Op_code_conc(i) = ‘1’ THEN sum2 := NOT sum2;END IF; END LOOP; RETURN sum1 = sum2 ;END chk_pty; Function调用:Chk_pty (op_code_conc => op_code_c, ram_data_conc => ram_data_c)Procedure调用:Ram_read (ram_data => ram_data_in, test_add_start => start_address) 第三节 并行与串行建模对照并行语句:对全部右端信号敏感串行语句:逐行执行 ABCDE(输出)00001000110010100110010010101101101011101000110011101011011011000110101110011110例:实现一个aoi电路,真值表如下: 00011110001101011101110000101101CDAB卡诺图表示为: LIBRARY ieee; USE ieee.std_logic_1164.all;ENTITY aoi IS PORT (A, B, C, D : IN std_logic; E : OUT std_logic);END aoi;ARCHITECTURE behav1 OF aoi ISBEGIN E <= NOT (( A AND B) OR (C AND D));END behav1; ARCHITECTURE rtl OF aoi IS SIGNAL O1, O2, O3 : std_logic;BEGIN E <= NOT O3; -- CS1 O1 <= A AND B; -- CS2 O2 <= C AND D; -- CS3 O3 <= O1 OR O2; -- CS4END rtl; ARCHITECTURE behav2 OF aoi ISBEGIN PROCESS (A, B, C, D)VARIABLE O1, O2, O3 : std_logic; BEGINO1 := A AND B; -- SS1O2 := C AND D; -- SS2O3 := O1 OR O2; -- SS3E <= NOT O3; -- SS4 END PROCESS;END behav2; 执行步骤图 behav1 rtl behav2 Process CS1 CS2 CS3 递归1递归1 CS4 递归2递归2 CS1 递归3 递归1 递归2SS1SS2SS3SS4 ARCHITECTURE behav2 OF aoi ISBEGIN PROCESS (A, B, C, D)VARIABLE O1, O2, O3 : std_logic; BEGIN O3 := O1 OR O2;O1 := A AND B; O2 := C AND D; E <= NOT O3; END PROCESS;END behav2; ARCHITECTURE behav2 OF aoi ISBEGIN PROCESS (A, B, C, D)VARIABLE O1, O2, O3 : std_logic; BEGIN O3 := O1 OR O2;O1 := A AND B; O2 := C AND D; E <= NOT O3; END PROCESS;END behav2;ERROR! ARCHITECTURE behav3 OF aoi IS SIGNAL O1, O2, O3 : std_logic;BEGIN O1 <= A AND B; O2 <= C AND D; P1: PROCESS (O1, O2) BEGIN O3 <= O1 OR O2; END PROCESS; P2: PROCESS (O3) BEGIN E <= NOT O3; END PROCESS;END behav3;递归1 P1:Process递归2 P2:Process递归3 第四节 信号与变量赋值信号赋值:在Delta延迟后完成变量赋值:立即赋值 ARCHITECTURE behav4 OF aoi IS SIGNAL O1, O2, O3 : std_logic;BEGIN PROCESS(A, B, C, D) BEGIN O1 <= A AND B; O2 <= C AND D; O3 <= O1 OR O2; E <= NOT O3; END PROCESS;END behav4; ARCHITECTURE behav4 OF aoi IS SIGNAL O1, O2, O3 : std_logic;BEGIN PROCESS(A, B, C, D) BEGIN O1 <= A AND B; O2 <= C AND D; O3 <= O1 OR O2; E <= NOT O3; END PROCESS;END behav4;ERROR! ARCHITECTURE behav5 OF aoi IS SIGNAL O1, O2, O3 : std_logic;BEGIN PROCESS( A, B, C, D) BEGIN O3 <= O1 OR O2; O1 <= A AND B; O2 <= C AND D; E <= NOT O3; END PROCESS;END behav5; ARCHITECTURE behav5 OF aoi IS SIGNAL O1, O2, O3 : std_logic;BEGIN PROCESS( A, B, C, D) BEGIN O3 <= O1 OR O2; O1 <= A AND B; O2 <= C AND D; E <= NOT O3; END PROCESS;END behav5;ERROR! ARCHITECTURE behav4_fixed OF aoi IS SIGNAL O1, O2, O3 : std_logic;BEGIN PROCESS( A, B, C, D, O1, O2, O3) BEGIN O1 <= A AND B; O2 <= C AND D; O3 <= O1 OR O2; E <= NOT O3; END PROCESS;END behav4_fixed; 例:实现一个累加器,从1加到10ARCHITECTURE arch1 OF ch_val IS TYPE ar1 IS ARRAY (1 TO 10) OF integer; SIGNAL t : integer := 0; SIGNAL arr_a : ar1;BEGIN PROCESS (cntrl) BEGIN FOR i IN 1 TO 10 LOOP t <= t + arr_a(i); END LOOP; END PROCESS;END arch1; 例:实现一个累加器,从1加到10ARCHITECTURE arch1 OF ch_val IS TYPE ar1 IS ARRAY (1 TO 10) OF integer; SIGNAL t : integer := 0; SIGNAL arr_a : ar1;BEGIN PROCESS (cntrl) BEGIN FOR i IN 1 TO 10 LOOP t <= t + arr_a(i); END LOOP; END PROCESS;END arch1;ERROR! ARCHITECTURE arch_ok OF ch_val IS TYPE ar1 IS ARRAY (1 TO 10) OF integer; SIGNAL t : integer := 0; SIGNAL arr_a : ar1;BEGIN PROCESS (cntrl) VARIABLE a : integer := 0; BEGIN FOR i IN 1 TO 10 LOOP a := a + arr_a(i); END LOOP; t <= a; END PROCESS;END arch1; 第五节 多值驱动的决断 电路中存在一个信号被多个驱动器驱动的现象。

      VHDL中实现多值驱动的方法:仲裁机制例:SIGNAL total : wired_or integer; 第六节 产生共享模块-- 用Package 一、Package用法用Package搜集一组相关项,供其它程序模块使用 Package中可包含的有l类型和子类型声明l常数l子程序〔functions 和 procedures)l信号 硬件设计 Package调用示意图模块1模块2 Package模块3模块4 例如:在“standard〞 Package中有如下定义:PACKAGE standard_portion IS --predefined enumeration types: TYPE bit IS (‘0’, ‘1’); TYPE boolean IS (false, true); --predined array types TYPE string IS ARRAY (positive RANGE<>) OF character; TYPE bit_vector is ARRAY (natural RANGE<>) OF bit;END standard_portion; PackagePackage由两局部构成:由两局部构成:PackagePackage声明声明 〔〔Package Declaration)Package Declaration) Package Package体体 〔〔Package Body)Package Body) Package Package Declaration Package Body Package声明在Package以外可见。

      格式:PACKAGE identifier ISpackage_declarative_part END identifier; Package体在Package外不可见格式: PACKAGE BODY identifier ISpackage_body_declarative_part END identifier; Package是独立的库单元Package体为可选——— Package声明必须先于使用它的程序被编译Package体可在使用它的程序进行仿真前被编译修改package声明:重编译package声明 package体 实体声明 结构体修改package体:仅重编译package体 /idea/user/name/sys_1076_tutorial my_package tlc tlc_types tlc_types library_clause behavioral proc_decl procedure use_clause of tlc ENTITY tlc proc_call pkg_hdr pkg_body entity arch1Package与实体的关系示意图 二、调用package用library语句指定库用use语句指定声明 1.在实体前用library语句指定库2.指定逻辑名 物理地址映射3.在需要使用package内容的地方之前使用use语句 格式:Library clause …… LIBRARY logical_name_list ;Use clause …… USE prefix.suffix, prefix.suffix, … ; 例如:LIBRARY package_lib, vhdlsim_lib ;USE package_lib. package1. ALL; 例如:LIBRARY package_lib, vhdlsim_lib ;USE package_lib. package1. ALL; 库 package package 中的声明~~~~~~~~~ ~~~~~~ ~~~~ 例如:USE lib_stf. mem_ops. ram_load;USE lib_stf. mem_ops. ram_read; 第六章 全局考虑 第一节 范围和可视性第二节 重载 第一节 范围和可视性信号和变量的作用域,从其声明的地方到其所在描述单元的结束。

      ARCHITECTURE overall OF test IS 例1 SIGNAL first_sig: bit; BEGIN process1: PROCESS VARIABLE process_sig: bit; PROCEDURE inside (VARIABLE data: OUT bit);PROCEDURE inside (VARIABLE data: OUT bit) IS VARIABLE procedure_var: bit;BEGIN ……END inside; BEGINinside (in_data);…… END PROCESS process1; -- part of architecture bodyEND overall; ARCHITECTURE overall OF test IS 例2 SIGNAL first_sig : bit; BEGIN process1: PROCESS VARIABLE: process_sig: bit;VARIABLE:first_sig : bit; PROCEDURE inside (VARIABLE data: OUT bit);PROCEDURE inside (VARIABLE data: OUT bit) IS VARIABLE procedure_var: bit;BEGIN ……END inside; ARCHITECTURE overall OF test IS 例2 SIGNAL first_sig : bit; BEGIN 隐藏 process1: PROCESS VARIABLE: process_sig: bit;VARIABLE:first_sig : bit; PROCEDURE inside (VARIABLE data: OUT bit);PROCEDURE inside (VARIABLE data: OUT bit) IS VARIABLE procedure_var: bit;BEGIN ……END inside; BEGINinside (in_data);first_sig := process_sig;sig <= first_sig ; END PROCESS process1; -- part of architecture bodyEND overall; BEGINinside (in_data);first_sig := process_sig;sig <= first_sig ; END PROCESS process1; -- part of architecture bodyEND overall; 第二节 重载重用预定义名 一、重载枚举字 枚举定义中有交叠例:TYPE wire_color IS (green, black, red);TYPE traffic_lt IS (red, yellow, green, flashing); 一、重载枚举字 枚举定义中有交叠例:TYPE wire_color IS (green, black, red);TYPE traffic_lt IS (red, yellow, green, flashing); ____ _____ ____ ARCHITECTURE physical OF hardware IS SIGNAL sig1 : bit; TYPE wire_color is (green, black, red); TYPE traffic_lt IS (red, yellow, green, flashing);BEGIN example: PROCESS (sig1) VARIABLE pwr_hot, pwr_neutral : wire_color;VARIABLE top_lt, middle_lt, bottom_lt : traffic_lt; BEGINpwr_hot := red;top_lt := red; END PROCESS example;END hardware; 二、重载子程序 例:PACKAGE my_qsim_logic IS TYPE my_qsim_state IS (‘X’, ‘0’, ‘1’, ‘Z’); SUBTYPE my_qsim_value IS my_qsim_state RANGE ‘X’ TO ‘1’; TYPE my_qsim_12state IS (SXR, SXZ, SXS, SXI, S0R, S0Z, S0S, S0I, S1R, S1Z, S1S, S1I); TYPE my_qsim_strength IS (‘Z’, ‘R’, ‘S’, ‘I’); TYPE my_qsim_state_vector IS ARRAY (positive RANGE<>) OF my_qsim_state; TYPE my_qsim_value_vector IS ARRAY (positive RANGE<>) OF my_qsim_value; TYPE my_qsim_12state_vector IS ARRAY (natural RANGE<>) OF my_qsim_12state; TYPE my_qsim_strength_vector IS ARRAY (natural RANGE<>) OF my_qsim_strength; FUNCTION my_to_qsim_12state (val : my_qsim_value; str : my_qsim_strength) RETURN my_qsim_12state; FUNCTION my_to_qsim_12state (val : my_qsim_state) RETURN my_qsim_12state; FUNCTION my_to_qsim_12state (val : my_qsim_value_vector; str : my_qsim_strength_vector) RETURN my_qsim_12state_vector; FUNCTION my_to_qsim_12state (val : my_qsim_state_vector) RETURN my_qsim_12state_vector;END my_qsim_logic; 例:example2 : PROCESS (sig1) USE my_lib. My_qsim_logic. ALL; CONSTANT Sig_strngth : my_qsim_strength := ‘S’; VARIABLE var1 : my_qsim_value := ‘0’; VARIABLE var2 : my_qsim_state := ‘Z’; VARIABLE var3 : bit := ‘0’; VARIABLE reg_in_a: my_qsim_12state;BEGIN reg_in_a := my_to_qsim_12state (var1, Sig_strngth); reg_in_a := my_to_qsim_12state (var2); reg_in_a := my_to_qsim_12state (var3, Sig_strngth);END PROCESS example2; 三、重载算子 预定义算子优先级列表(从上到下〕算子类双边算子单边算子杂项**Abs not乘法* / mod rem符号+ -加法+ - &关系算子 = /= < <= > >=逻辑算子 And or nand nor xor 算子重载与其它重载稍有不同,符号“=〞需要用双引号括起来。

      例:PACKAGE my_qsim_state IS (‘X’, ‘0’, ‘1’, ‘Z’); TYPE my_qsim_state IS (‘X’, ‘0’, ‘1’, ‘Z’); FUNCTION “=〞 (l, r : my_qsim_state) RETURN my_qsim_state; FUNCTION “=〞 (l, r : my_qsim_state) RETURN boolean;END my_qsim_logic; exam3: PROCESS (sig1) USE my_lib. qsim_logic. ALL; VARIABLE var1 : my_qsim_state := ‘0’; VARIABLE var2 : my_qsim_state := ‘1’; VARIABLE result1 : my_qsim_state; VARIABLE result2 : boolean;BEGIN result1 := (var1 = var2); result2 := (var1 = var2); var2 := ‘0’; result1 := (var1 = var2); result2 := (var1 = var2); sig1 <= result1;END PROCESS exam3; “=〞 运算也可写为:result1 := “=〞 (var1, var2); 第七章 编程技巧第一节 VHDL编程方法第二节 定时建模的方法第三节 用错误检查提高建模准确性第四节 提高仿真性能建模第五节 对逻辑操作查表第六节 Process语句—防止无限循环第七节 用VHDL做仿真鼓励 第一节 VHDL编程方法 采用如下方法增强复杂设计的可读性:将相关的声明与描述归为一组用缩排表示隶属关系用空格进行代码分隔使相似的字〔如保存字〕和标点一致注释程序功能保存字用大写字母,用户定义标识符用小写字母对于generic和常数标识符,第一个字母大写,其余小写对process,并行程序调用等标号〔描述名〕时刻想着读者。

      你可能只写一次,但会读屡次 第二节 定时建模的方法 一、嵌入固定延时参数例:ENTITY and2_gate IS PORT (in0, in1 : IN bit; out1 : OUT bit);END and2_gate;ARCHITECTURE fixed_delay OF and2_gate IS CONSTANT Typical_delay : time := 8 ns;BEGIN out1 <= in0 AND in1 AFTER Typical_delay;END fixed_delay; 二、嵌入可变延时参数例:LIBRARY my_lib;USE my_lib. Logic_example. ALL;ENTITY and2_gate IS PORT (in0, in1 : IN my_lsim_LOGIC; out1 : OUT my_lsim_LOGIC);END and2_gate; ARCHITECTURE variable_delay OF and2_gate IS CONSTANT Tplh_typ : time := 5 ns; CONSTANT Tphl_typ : time := 8 ns;BEGIN and_inputs : PROCESS (in0, in1) BEGINIF (in0 AND in1) = ‘1’ THEN out1 <= ‘1’ AFTER Tplh_typ;ELSIF (in0 AND in1) = ‘0’ THEN out1 <= ‘0’ AFTER Tphl_typ;ELSIF (Tplh_typ >= Tphl_typ) THEN out1 <= ‘X’ AFTER Tplh_typ;ELSE out1 <= ‘X’ AFTER Tphl_typ;END IF; END PROCESS and_inputs;END variable_delay; 三、用generic参数化模型例:LIBRARY my_lib;USE my_lib. my_qsim_logic. ALL;ENTITY test_and2_gate ISEND test_and2_gate; ARCHITECTURE test_bench OF test_and2_gate IS COMPONENT and2GENERIC (Rs, Fl : time);PORT (a, b : IN my_qsim_12state; c : OUT my_qsim_12state); END COMPONENT; FOR a1 : and2 USE ENTITY and2_gate(behav)GENERIC MAP (Rs, Fl)PORT MAP (a, b, c); SIGNAL x, y, z : my_qsim_12state;BEGIN a1 : and2GENERIC MAP (7 ns, 10 ns);PORT MAP (x, y, z);END test_bench; PACKAGE my_qsim_logic IS TYPE my_qsim_state IS (‘X’, ‘0’, ‘1’, ‘Z’); SUBTYPE my_qsim_value IS qsim_state_state RANGE ‘X’ TO ‘1’; TYPE my_qsim_12state IS (SXR, SXZ, SXS, SXI, S0R, S0Z, S0S, S0I, S1R, S1Z, S1S, S1I); FUNCTION my_qsim_state_from (val: my_qsim_12state) RETURN my_qsim_state;END my_qsim_logic;USE my_qsim_logic. ALL;ENTITY and2_gate IS GENERIC (Out1_rs, Out1_fl : time := 0 ns); PORT (in0, in1 : IN my_qsim_12state; out1 : OUT my_qsim_12state);END and2_gate; ARCHITECTURE behave OF and2_gate ISBEGIN and_inputs : PROCESS (in0, in1) BEGINIF ((my_qsim_state_from (in0) AND my_qsim_state_from (in1)) = ‘1’)THEN out1 <= S1S AFTER Out1_rs;ELSIF ((my_qsim_state_from (in0) AND my_qsim_state_from(in1))=‘0’) THEN out1 <= S0S AFTER Out1_fl;ELSIF (Out1_rs >= Out1_fl) THEN out1 <= SXS AFTER Out1_rs;ELSE out1 <= SXS AFTER Out1_fl;END IF; END PROCESS and_inputs;END behave; 四、用Generic参数化上升/下降延时 对多值延时进行参数化例:设在package : my_qsim_extended中 有function 为my_qsim_get_time, 可以将字符串根据定时模式转换为时间值 USE my_lib. My_qsim_logic. ALL; 1bit锁存器实体声明USE my_lib. My_qsim_extended. ALL;ENTITY latch IS GENERIC ( -- -- --CONSTANT Data_rise : string := “0, 0, 0〞;CONSTANT Data_fall : string := “0, 0, 0〞;CONSTANT Enable_rise : string := “0, 0, 0〞;CONSTANT Enable_fall : string := “0, 0, 0〞;CONSTANT Timing_mode : timing_type := typ); PORT (enable, data : IN my_qsim_state; q_out : OUT my_qsim_state);CONSTANT Data_tplh : time := my_qsim_get_time (Data_rise, Timing_mode);CONSTANT Data_tphl : time := my_qsim_get_time (Data_fall, Timing_mode);CONSTANT Enable_tplh : time := my_qsim_get_time (Enable_rise, Timing_mode);CONSTANT Enable_tphl : time := my_qsim_get_time (Enable_fall, Timing_mode);BEGIN --END latch; Test Bench Model latch Entity timing_mode min, typ, maxTest_latch data 8, 16, 30 上升 data 7, 14, 25 下降 enable 8, 16, 30 上升 enable 5, 7, 15 下降 LIBRARY my_lib; 测试台程序USE my_lib. My_qsim_logic. ALL;USE my_lib. My_qsim_extended. ALL;ENTITY test_latch ISEND test_latchARCHITECTURE test_bed OF test_latch IS COMPONENT latch1GENERIC (En_width, Da_setup, Da_hold : time; Da_rise, Da_fall, En_rise, En_fall : string; Timing_mode : timing_type); PORT (Da, en : IN my_qsim_state; q0 : OUT my_qsim_state); END COMPONENT; FOR L1 : latch1 USE ENTITY latch (behav1)GENERIC MAP (En_width, Da_setup, Da_hold,Da_rise, Da_fall,En_rise, En_fall, Timing_mode);PORT MAP (da, en, q0); SIGNAL data, enable, q_out : my_qsim_state;BEGIN L1 : latch1GENERIC MAP (20 ns, 20 ns, 5 ns,“8, 16, 30〞, “7, 14, 25〞,“8, 16, 30〞, “5, 7, 15〞, typ);PORT MAP (data, enable, q_out);END test_bed; ARCHITECTURE behav1 OF latch IS 1bit锁存器结构体BEGIN PROCESS 〔enable, data) BEGINIF enable’event THEN IF enable = ‘1’ THENIF data = ‘1’ THEN q_out <= data AFTER Enable_tplh;ELSIF data = ‘0’ THEN q_out <= data AFTER Enable_tphl;ELSIF Enable_tplh > Enable_tphl THEN q_out <= ‘X’ AFTER Enable_tplh;ELSE q_out <= ‘X’ AFTER Enable_tphl;END IF; ELSIF enable /= ‘0’ THENIF Enable_tplh >= Enable_tphl THEN q_out <= ‘X’ AFTER Enable_tplh;ELSE q_out <= ‘X’ AFTER Enable_tphl;END IF; END IF; ELSE IF enable = ‘1’ THENIF data = ‘1’ THEN q_out <= data AFTER Data_tplh;ELSIF data = ‘0’ THEN q_out <= data AFTER Data_tphl;ELSIF Data_tplh >= Data_tphl THEN q_out <= ‘X’ AFTER Data_tplh;ELSE q_out <= ‘X’ AFTER Data_tphl;END IF; END IF;END IF; END PROCESS;END behav1; 第三节 用错误检查提高建模准确性进行建立和保持时间检查 USE my_lib. My_qsim_logic. ALL; 1bit锁存器实体声明USE my_lib. My_qsim_extended. ALL;ENTITY latch IS GENERIC ( CONSTANT Enable_width : time := 0 ns;CONSTANT Data_setup : time := 0 ns;CONSTANT Data_hold : time := 0 ns;CONSTANT Data_rise : string := “0, 0, 0〞;CONSTANT Data_fall : string := “0, 0, 0〞;CONSTANT Enable_rise : string := “0, 0, 0〞;CONSTANT Enable_fall : string := “0, 0, 0〞;CONSTANT Timing_mode : timing_type := typ); PORT (enable, data : IN my_qsim_state; q_out : OUT my_qsim_state);CONSTANT Data_tplh : time := my_qsim_get_time (Data_rise, Timing_mode);CONSTANT Data_tphl : time := my_qsim_get_time (Data_fall, Timing_mode);CONSTANT Enable_tplh : time := my_qsim_get_time (Enable_rise, Timing_mode);CONSTANT Enable_tphl : time := my_qsim_get_time (Enable_fall, Timing_mode);BEGIN chk_width : ASSERT (enable = ‘1’) OR (enable’delayed = ‘0’) OR (enable’delayed’ last_event >= Enable_width) REPORT “Enable signal has insufficient pulse width.〞SEVERITY error; chk_setup : ASSERT (enable’ stable) OR (enable /= ‘0’) OR(data’ last_event >= Data_setup) REPORT “Data-to-enable setup time violation.〞SEVERITY error; chk_hold : ASSERT (data’ stable) OR (enable /= ‘0’) OR(enable’ last_event >= Data_hold) REPORT “Data-from-enable hold time violation.〞SEVERITY error;END latch; 20 ns 16 nsenableenable’delayed 30 ns 递归1 30 ns 递归2enableenable’delayed ’delayed属性示意图 Data_setup Data_hold Data_hold 20 ns 5 ns 3 nsEnabledata 第四节 提高仿真性能建模 一、在循环中用变量代替信号的时机 信号:保存一组波形值,并在递归完成时 进行赋值。

      ARCHITECTURE a1 OF en IS TYPE var_arr IS ARRAY (1 TO 64) OF integer; SIGNAL sig1 : integer;BEGIN PROCESS (cntrl)VARIABLE max : integer;VARIABLE var : var_arr; BEGINFOR elmnt IN 1 TO 64 LOOP IF var (elmnt) > max THENsig1 <= var (elmnt);max := var (elmnt); END IF;END LOOP; END PROCESS;END a1; ARCHITECTURE a2 OF en IS TYPE var_arr IS ARRAY (1 TO 64) OF integer; SIGNAL sig1 : integer;BEGIN PROCESS (cntrl)VARIABLE max : integer;VARIABLE var : var_arr; BEGINFOR elmnt IN 1 TO 64 LOOP IF var (elmnt) > max THENmax := var (elmnt); END IF;END LOOP;sig1 <= max; END PROCESS;END a2; 二、仅当需要时采用决断函数多信号驱动时需要采用决断函数因为决断函数仿真资源开销比较大,慎重使用。

      例:信号s1需要采用决断函数SIGNAL s1, s2 : wired_or bit; 例:信号s1需要采用决断函数SIGNAL s1, s2 : wired_or bit;应代替为SIGNAL s1 : wired_or bit;SIGNAL s2 : bit; 三、用属性’event代替’stable用更专用的程序模块代替通用的程序模块,以提高仿真性能 例:IF (sig’stable = false) THEN -- something happenedEND IF;IF (sig’event = true) THEN -- something happenedEND IF; 第五节 对逻辑操作查表对布尔或逻辑操作十分有效表作为常数 例:实现两个my_lsim_Logic类型信号的与运算sig3 <= sig1 AND sig2;PACKAGE logic_example IS TYPE my_lsim_logic IS (‘0’, ‘1’, ‘X’, ‘Z’); FUNCTION “AND〞 (a, b : IN my_lsim_Logic)RETURN my_lsim_Logic;END logic_example; PACKAGE BODY logic_example IS FUNCTION “AND〞 (a, b : IN my_lsim_Logic)RETURN my_lsim_Logic IS TYPE a2_lookup IS ARRAY (my_lsim_Logic’(‘0’) TO my_lsim_Logic’(‘Z’),My_lsim_Logic’(‘0’) TO my_lsim_Logic’(‘Z’))OF my_lsim_Logic; CONSTANT Output : a2_lookup := -- 0 1 X Z((‘0’, ‘0’, ‘0’, ‘0’), -- 0 (‘0’, ‘1’, ‘X’, ‘X’), -- 1 (‘0’, ‘X’, ‘X’, ‘X’), -- X (‘0’, ‘X’, ‘X’, ‘X’)); -- Z BEGINRETURN Output (a, b); END “AND〞;END logic_example; 第六节 Process语句—防止无限循环Process语句一旦被激活〔运行〕,它将始终运行下去,直到被某个条件所终止。

      终止process语句的条件有:•敏感表•Wait语句•包含wait语句的procedure调用 ARCHITECTURE behav3 OF aoi IS SIGNAL O1, O2, O3 : my_lsim_logic;BEGIN O1 <= A AND B; O2 <= C AND D; P1: PROCESS BEGIN 导致O3 <= O1 OR O2; 无限循环 END PROCESS; P2: PROCESS BEGINE <= NOT O3; END PROCESS;END behav3; ARCHITECTURE behav3 OF aoi IS SIGNAL O1, O2, O3 : my_lsim_logic;BEGIN O1 <= A AND B; O2 <= C AND D; P1: PROCESS (O1, O2) BEGINO3 <= O1 OR O2; END PROCESS; P2: PROCESS BEGINE <= NOT O3;WAIT ON O3; END PROCESS;END behav3; LIBRARY contains_package;USE pkg_at_rt. ALL;ENTITY expl IS PORT (sig1 : IN bit);END expl;ARCHITECTURE behav OF expl ISBEGIN PROCESSVARIABLE var1 : bit; BEGIN-- something happens hereprocedure1 (var1, sig1); END PROCESS;END behav; PACKAGE pkg_at_rt IS PROCEDURE procedure1 (VARIABLE frst : OUT bit;VARIABLE scnd : IN bit);END pkg_at_rt;PACKAGE BODY pkg_at_rt IS PROCEDURE procedure1 (VARIABLE frst : OUT bit;VARIABLE scnd : IN bit) IS BEGINfrst := NOT scnd;WAIT FOR 10 ns; END procedure1;END pkg_at_rt; 第七节 用VHDL做仿真鼓励VHDL仿真鼓励可有多种,VHDL测试台是其中的一种 LIBRARY my_lib;USE my_lib. My_qsim_logic. ALL;ENTITY test_and2_gate ISEND test_and2_gate;ARCHITECTURE test_bed OF test_and2_gate IS COMPONENT and2GENERIC (Rs, Fl : time);PORT (a, b : IN my_qsim_12state;c : OUT my_qsim_12state); END COMPONENT; FOR a1 : and2 USE ENTITY and2_gate(behav)GENERIC MAP (Rs, Fl)PORT MAP (a, b, c); SIGNAL x, y, z : my_qsim_12state; BEGIN a1 : and2GENERIC MAP (7 ns, 10 ns);PORT MAP (x, y, z); x <= S0S AFTER 10 ns,S1S AFTER 20 ns,SXS AFTER 30 ns,S0S AFTER 40 ns,S1S AFTER 50 ns,SXS AFTER 60 ns,S0S AFTER 70 ns; y <= S0S AFTER 40 ns,S1S AFTER 70 ns,SXS AFTER 130 ns;END test_bed; 第八章 仿真与综合第一节 逻辑仿真第二节 电路综合 第一节 逻辑仿真 一、仿真级别行为级: 快速构建系统模型并仿真确认RTL级: 功能验证结构级: 多为对综合后的描述或反标注 后的描述进行验证 二、仿真鼓励的产生VHDL测试台文件产生法命令输入法 第二节 逻辑综合将HDL描述转换为功能符合要求的电路 一、HDL综合将HDL输入转换为未经优化的布尔方程 二、逻辑综合•逻辑优化,减少布尔方程数•门级映射 三、约束条件确定电路综合目标,在满足目标的前提下使电路规模最小。

      综合工具将采用多种电路结构来 实现设计,以获得最正确结果 约束条件包括:•面积•速度 约束条件包括:•面积•速度 时钟周期 最大路径延迟 建立时间 保持时间 到达时间 约束条件包括:•面积•速度•驱动能力•负载•工作条件、温度•可测试性 附件1: VHDL例如程序 一、典型结构分析1.时钟锁存电路2.PROCESS (clock)3.BEGIN4. IF (clock’event AND clock=‘1’) THEN5.-- statement6.END IF;7.END PROCESS; 2. 同步复位电路PROCESS (clock)BEGIN IF (clock’event AND clock=‘1’) THENIF (sync_reset=‘1’) THEN -- statementEND IF; END IF;END PROCESS; 3. 异步复位电路PROCESS 〔reset, clock)BEGIN IF (reset = ‘1’) THEN-- statement ELSIF (clock’event AND clock = ‘1’) THEN-- statement END IF;END PROCESS; 4. 计数器电路PROCESS 〔clock) VARIABLE counter: integer := 0;BEGIN IF (clock’event AND clock = ‘1’) THENcounter := counter + 1;-- statement END IF;END PROCESS; 5. 状态机电路ARCHITECTURE state_machine OF example IS TYPE four_type IS (A1, A2, A3, A4); SIGNAL next_state : four_type; SIGNAL clock : STD_LOGIC;BEGIN PROCESS (clock) BEGINIF (clock’event AND clock=‘1’) THEN CASE (next_state) ISWHEN (A1) => next_state <= A2;-- statement WHEN (A2) => next_state <= A3;-- statement WHEN (A3) => next_state <= A4;-- statementWHEN (A4) => next_state <= A1;-- statement END CASE;END IF; END PROCESS;END state_machine; 二、样例程序 例1: 书 P222 的8255描述例2: 样例程序 附件2: 工具简单使用 使用的工具:仿真:Modelsim综合:Leonardo Modelsim使用:先用一个文本编辑器编写VHDL程序vlib work 建库vcom xxx.vhd 编译vsim xxx.vhd 仿真 在vsim中:view * 翻开所有窗口add wave * 加所有信号到波形窗force clk 0 50, 1 100 –repeat 100 产生100ns周期方波时钟run 1000 运行1000ns 。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.