第七讲-综合建模与仿真PPT课件.ppt_第1页
第七讲-综合建模与仿真PPT课件.ppt_第2页
第七讲-综合建模与仿真PPT课件.ppt_第3页
第七讲-综合建模与仿真PPT课件.ppt_第4页
第七讲-综合建模与仿真PPT课件.ppt_第5页
已阅读5页,还剩61页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第七讲综合建模与仿真 内容 常用模块建模 设计 实例基于同步状态机的建模 设计 存储器建模仿真平台设计仿真激励信号产生功能仿真实例 在数字逻辑系统的设计中 从电路结构来看 基本上可分为组合逻辑电路和时序逻辑电路两大类 1 组合逻辑电路组合逻辑电路的输出只与当时的输入信号有关 而与电路过去的状态无关 也即它的输出完全由输入信号和输出函数决定 在手工设计电路时期 组合逻辑主要设计优化工具是卡若图 在目前EDA时期则是综合工具软件 设计者只需正确描述电路功能 具体电路的优化由综合工具完成 最常用的组合逻辑电路有编码器 译码器 数据选择器 加法器和比较器等 组合逻辑设计实例 a 符号 b 功能表 1 2 4译码器 2 4译码器的功能描述 moduledecode2 4 d s input 1 0 s output 3 0 d reg 3 0 d always s 电平敏感变量表case s 2 b00 d 4 b0001 2 b01 d 4 b0010 2 b10 d 4 b0100 2 b11 d 4 b1000 endcaseendmodule 条件S的选项要完备 否则综合工具将综合出意外的锁存器 可用缺省default代替2 b11 2 4译码器的功能描述 moduledecode2 4 d s input 1 0 s output 3 0 d reg 3 0 d always s 电平敏感变量表if s 2 b00 if语句实现有优先级 条件要完备d 4 b0001 elseif s 2 b01 d 4 b0010 elseif s 2 b10 d 4 b0100 elsed 4 b1000 endmodule a 符号 b 内部逻辑电路 2 相等比较器 同或 相同为1 相等比较器的功能描述 modulecompare f a b input 3 0 a b outputf regf always aorb 电平敏感变量表if a b 其它关系的比较器 f 1 b1 elsef 1 b0 endmodule a 4选1开关操作 b 功能表 3 4选1多路复用器 多路选择器 多路复用器的功能描述 modulemux4 1 F P S input 1 0 S input 3 0 P outputF assignF S 2 b00 P 0 S 2 b01 P 1 S 2 b10 P 2 P 3 endmodule 条件赋值语句F 条件 A B功能 条件为真 1 A F 否则B F a 1 4DEMUX的操作 b 功能表 4 多路输出选择器 多路输出选择器的功能描述 moduledecode2 4 p s x input 1 0 s inputx output 3 0 p reg 3 0 p always sorx 电平敏感变量表case s 2 b00 p 3 b0 x 000 x2 b01 p 2 b0 x 1 b0 00 x02 b10 p 1 b0 x 2 b0 0 x00default p x 3 b0 x000endcaseendmodule 本例中X是信号 5 算术运算电路算术运算电路是能够完成二进制数运算的器件 最基本的算术运算电路有半加器和全加器两种 半加器电路不考虑来自低位的进位 能完成两个一位二进制数的加法运算 全加器是一种考虑来自低位的进位的二进制加法运算电路 它可以实现多位二进制数的加法运算 全加器的功能描述 moduleadder4 cout sum ina inb cin output 3 0 sum outputcout input 3 0 ina inb inputcin assign cout sum ina inb cin endmodule 组合运算符 组合逻辑的verilog描述方法小结 用assign赋值语句 用电平敏感的always语句 数字系统的电路通常由组合逻辑 时序逻辑或者两者混合构成 对于时序逻辑电路 其基本结构如图所示 时序逻辑设计基础 同步时序逻辑电路异步时序逻辑电路 时序逻辑电路按其工作方式可分为同步时序逻辑和异步时序逻辑 同步时序电路中 全部时钟并联在一起 统一受系统时钟的控制 各个触发器是同步动作的 异步时序电路中各级触发器的连接不是完全相同的 状态变化也不是同步的 异步时序电路设计较为复杂 目前主要是人工设计 同步时序电路设计主要有状态机和状态流程图方法 a D触发器 b 8位寄存器 1 基本的8位寄存器 a D触发器 b 串行载入移位寄存器 2 移位寄存器 移位寄存器verilog描述 moduleshifter d clk q inputclk inputd output 7 0 q reg 7 0 q reg变量类型always posedgeclk beginq 7 d q 6 q 7 q 5 q 6 q 4 q 5 q 3 q 4 q 2 q 3 q 1 q 2 q 0 q 1 endEndmodule问题 带复位端的移位寄存器描述 一个简单的二进制计数器 3 计数器 计数器verilog描述 modulecounter D CLK A inputCLK input 1 0 D output 1 0 A reg 1 0 A always posedgeCLK A A 1 计数到2 b11后 返回 endmodule 模200的加法计数器设计实例 modulemy counters clk clear qn inputclk clear output 7 0 qn reg 7 0 qn Amodulus200upcounteralways posedgeclkornegedgeclear beginif clear 0 qn 0 elseif qn 200 qn 0 elseqn qn 1 endendmodule 异步复位 基于同步状态机的建模 有限状态机是由寄存器组和组合逻辑构成的硬件时序电路 其状态 即由寄存器组的1和0的组合状态所构成的有限个状态 只能在同一时钟跳变沿的情况下才能从一个状态转向另一个状态 究竟转向哪一状态不但取决于各个输入值 还取决于当前状态 这里指的是米里Mealy型有限状态机 而莫尔Moore型有限状态机究竟转向哪一状态只决于当前状态 状态机可用于产生在时钟跳变沿时刻开关的复杂的控制逻辑 是数字逻辑的控制核心 mealy型时序电路模型 有限状态机是时序电路的通用模型 当电路的输出是输入和现态的函数 称作Mealy型状态机 次态 现态 moore型状态机输出仅仅与电路以前的状态有关 而与输入无关 它是mealy模型的一种特例 moore型时序电路模型 有限状态机设计的一般步骤 1 逻辑抽象 得出状态转换图就是把给出的一个实际逻辑关系表示为时序逻辑函数 可以用状态转换表来描述 也可以用状态转换图来描述 这就需要 分析给定的逻辑问题 确定输入变量 输出变量以及电路的状态数 通常是取原因 或条件 作为输入变量 取结果作为输出变量 定义输入 输出逻辑状态的含意 并将电路状态顺序编号 按照要求列出电路的状态转换表或画出状态转换图 这样 就把给定的逻辑问题抽象到一个时序逻辑函数了 2 状态化简如果在状态转换图中出现这样两个状态 它们在相同的输入下转换到同一状态去 并得到一样的输出 则称它们为等价状态 显然等价状态是重复的 可以合并为一个 电路的状态数越少 存储电路也就越简单 状态化简的目的就在于将等价状态尽可能地合并 以得到最简的状态转换图 3 状态分配状态分配又称状态编码 通常有很多编码方法 编码方案选择得当 设计的电路可以简单 反之 选得不好 则设计的电路就会复杂许多 实际设计时 需综合考虑电路复杂度与电路性能之间的折衷 在触发器资源丰富的FPGA或ASIC设计中采用独热编码 one hot coding 既可以使电路性能得到保证又可充分利用其触发器数量多的优势 4 选定触发器的类型并求出状态方程 驱动方程和输出方程 5 按照方程得出逻辑图用VerilogHDL来描述有限状态机 可以充分发挥硬件描述语言的抽象建模能力 使用always块语句和case if 等条件语句及赋值语句即可方便实现 具体的逻辑化简及逻辑电路到触发器映射均可由计算机自动完成 上述设计步骤中的第2步及4 5步不再需要很多的人为干预 使电路设计工作得到简化 效率也有很大的提高 用VerilogHDL语言设计可综合的状态机的指导原则 1 因为大多数FPGA内部的触发器数目相当多 又加上独热码状态机 onehotstatemachine 的译码逻辑最为简单 所以在设计采用FPGA实现的状态机时往往采用独热码状态机 即每个状态只有一个寄存器置位的状态机 2 建议采用case casex或casez语句来建立状态机的模型 因为这些语句表达清晰明了 可以方便地从当前状态分支转向下一个状态并设置输出 不要忘记写上case语句的最后一个分支default 并将状态变量设为 bx 这就等于告知综合器 case语句已经指定了所有的状态 这样综合器就可以删除不需要的译码电路 使生成的电路简洁 并与设计要求一致 3 如果将缺省状态设置为某一确定的状态 例如 设置default state state1 行不行呢 回答是这样做有一个问题需要注意 因为尽管综合器产生的逻辑和设置default state bx时相同 但是状态机的VerilogHDL模型综合前和综合后的仿真结果会不一致 为什么会是这样呢 因为启动仿真器时 状态机所有的输入都不确定 因此立即进入default状态 这样的设置便会将状态变量设为state1 但是实际硬件电路的状态机在通电之后 进入的状态是不确定的 很可能不是state1的状态 因此还是设置default state bx与实际情况相一致 但在有多余状态的情况下还是应将缺省状态设置为某一确定的有效状态 因为这样做能使状态机若偶然进入多余状态后任能在下一时钟跳变沿时返回正常工作状态 否则会引起死锁 4 状态机应该有一个异步或同步复位端 以便在通电时将硬件电路复位到有效状态 也可以在操作中将硬件电路复位 大多数FPGA结构都允许使用异步复位端 目前大多数综合器往往不支持在一个always块中由多个事件触发的状态机 即隐含状态机 为了能综合出有效的电路 用VerilogHDL描述的状态机应明确地由唯一时钟触发 目前大多数综合器不能综合采用VerilogHDL描述的异步状态机 异步状态机是没有确定时钟的状态机 它的状态转移不是由唯一的时钟跳变沿所触发 5 千万不要使用综合工具来设计异步状态机 因为目前大多数综合工具在对异步状态机进行逻辑优化时会胡乱地简化逻辑 使综合后的异步状态机不能正常工作 如果一定要设计异步状态机 我们建议采用电路图输入的方法 而不要用VerilogHDL输入的方法 6 VerilogHDL中 状态必须明确赋值 通常使用参数 parameters 或宏定义 define 语句加上赋值语句来实现 状态机设计例 例 用于空调控制的有限状态机 它有两个输入 分别与传感器相连 用于检测室内温度 如果温度在设定的范围内 如18 23度 则两个温度输入t high和t low为低 0 如果室内温度超过最高设定温度 23度 则输入t high变为高 1 如果室内温度低于最低设定温度 18度 则输入t low变为高 1 空调控制器输出为加热信号heat和制冷信号cool 当二者其一为高时 空调进行加热和制冷 空调控制有限状态机 状态 状态转移条件 状态转移优先级 空调有限状态机的verilog描述1 modulemy state t high t low heat cool clk reset inputportsinputt high inputt low outputportsoutputheat regheat outputcool regcool inputportsinputclk inputreset 定义空调的三种状态parameter 1 0 right 2 b00 too cold 2 b01 too hot 2 b10 reg 1 0 current state 空调有限状态机的verilog描述1 always posedgeclkornegedgereset if reset 1 b0 current state right elsecase current state 判断空调当前的状态right beginif t high 1 current state too hot elseif t low 1 current state too cold elsecurrent state right end 空调有限状态机的verilog描述1 too cold beginif t high 1 current state too hot elseif t high 0end 空调有限状态机的verilog描述1 too hot beginif t low 1 current state too cold elseif t high 0endcase 空调有限状态机的verilog描述1 always current state 驱动空调进行加热或制冷case current state right beginheat 1 b0 cool 1 b0 endtoo hot beginheat 1 b0 cool 1 b1 endtoo cold beginheat 1 b1 cool 1 b0 endendcaseendmodule 空调有限状态机的verilog描述2 输入逻辑过程 状态转移过程 输出逻辑过程 空调有限状态机的verilog描述2 modulemy state t high t low heat cool clk reset inputportsinputt high inputt low outputportsoutputheat regheat outputcool regcool inputportsinputclk inputreset parameter 1 0 right 2 b00 too cold 2 b01 too hot 2 b10 reg 1 0 current state next state 空调有限状态机的verilog描述2 always t highort loworcurrent state 组合电路 输入逻辑begincase current state right beginif t high 1 next state too hot elseif t low 1 next state too cold elsenext state right end 空调有限状态机的verilog描述2 too cold beginif t high 1 next state too hot elseif t high 0end 空调有限状态机的verilog描述2 too hot beginif t low 1 next state too cold elseif t high 0endcaseend 空调有限状态机的verilog描述2 always posedgeclkornegedgereset begin 状态转移时序电路if reset 1 b0 current state right elsecurrent state next state end 空调有限状态机的verilog描述2 always current state 输出逻辑 与输入无关 moore型case current state right beginheat 1 b0 cool 1 b0 endtoo hot beginheat 1 b0 cool 1 b1 endtoo cold beginheat 1 b1 cool 1 b0 endendcaseendmodule 存储器建模 简单ROM建模简单RAM建模双向端口建模 简单ROM描述 下面的ROM描述中使用二维寄存器组定义了一个存储器mem ROM的数据单独保存在文件my rom data中 如右边所示 通常用这种方法使ROM数据独立于ROM描述 timescale1ns 10psmodulemyrom read data addr read en inputread en input 3 0 addr output 3 0 read data reg 3 0 read data reg 3 0 mem 0 15 initial readmemb my rom data mem always addrorread en if read en read data mem addr endmodule 简单的RAM描述 RAM描述比ROM略微复杂 因为必须既有读功能又有写功能 而读写通常使用同一数据总线 这要求使用新的处理双向数据线的建模技术 在下面的例子中 若读端口未使能 则模型不驱动数据总线 此时若数据总线没有写数据驱动 则总线为高阻态Z 这避免了RAM写入时的冲突 timescale1ns 1nsmodulemymem data addr read write inout 3 0 data input 3 0 addr inputread write reg 3 0 memory 0 15 16 4 读assigndata read memory addr 4 bz 写always posedgewrite memory addr data endmodule data作为输出 data作为输入 存储器数据装入 可以使用循环或系统任务给存储器装入初始化数据用循环给存储器的每个字赋值for i 0 i memsize i i 1 initializememorymema i wordsize 1 b1 调用系统任务 readmem readmemb mem file txt mema 双向端口建模 用关键词inout声明一个双向端口 声明遵循下列规则 inout 7 0 databus inout端口不能声明为寄存器类型 只能是wire类型 这样仿真器若有多个驱动时可以确定结果值 对inout端口可以从任意一个方向驱动数据 在同一时间应只从一个方向驱动inout端口 在RAM模型中 如果使用双向数据总线读取RAM数据 同时在数据总线上驱动写数据 则会产生逻辑冲突 使数据总线变为未知 必须设计与inout端口相关的逻辑以确保正确操作 当把该端口作为输入使用时 必须禁止输出逻辑 双向端口建模 两端为双向端口 modulebus xcvr bus a bus b en a b en b a inoutbus a bus b inputen a b en b a bufif1b1 bus b bus a en a b bufif1b2 bus a bus b en b a Structuralmodulelogicendmodule 若en a b 1 基本单元b1使能 bus a数据传送到bus b 若en b a 1 基本单元b2使能 bus b数据传送到bus a 信号en a b和en b a控制使能 双向端口建模 两端为双向端口 modulebus xcvr bus a bus b en a b en b a inoutbus a bus b inputen a b en b a assignbus b en a b bus a bz assignbus a en b a bus b bz Structuralmodulelogicendmodule 若en a b 1 赋值语句驱动bus a数据到bus b 若en b a 1 赋值语句驱动bus b值到bus a 信号en a b和en b a控制使能 双向端口建模 单端为双向端口 moduleram cell databus rd wr inoutdatabus inputrd wr regdatareg assigndatabus rd datareg bz always negedgewr datareg databus endmodule 当rd 1时 datareg的值赋值databus 在wr下降沿 databus数据写入datareg 单向输出 单向输入 注 上页存储单元在wr的下降沿到达时存入数据 上页模块在wr处于高电平时 通过数据总线写入数据 但必须保证wr的高电平维持时间长于数据的写入时间 在rd处于高电平时 上述存储单元通过数据总线读出数据 由于此模型为单口存储模型 因此wr和rd不能同时为高电平 否则就得不到预期的结果 仿真平台设计 虚线表示编译时检测输入文件是否存在及可读并允许生成输出文件 仿真平台建立 简单的testbench向要验证的设计提供向量 人工验证输出 复杂的testbench是自检测的 其结果自动验证 仿真激励信号产生 产生激励常用的方法有 从一个initial块中施加线激励从一个循环或always块施加激励从一个向量或整数数组施加激励记录一个仿真过程 然后在另一个仿真中回放施加激励 线性激励 线性激励特性 只有变量的值改变时才列出易于定义复杂的时序关系对一个复杂的测试 测试基准 testbench 可能非常大 moduleinline tb reg 7 0 data bus addr wire 7 0 results DUTu1 results data bus addr initialbegindata bus 8 h00 addr 8 h3f 10data bus 8 h45 5addr 8 hf0 25data bus 8 h0f 15 finish endendmodule 用并行块产生仿真激励信号 fork join块在测试文件中很常用 他们的并行特性使用户可以说明绝对时间 并且可以并行的执行复杂的过程结构 如循环或任务 moduleinline tb reg 7 0 data bus instanceofDUTinitialforkdata bus 8 b00 10data bus 8 h45 20repeat 10 10data bus data bus 1 25repeat 5 20data bus data bus 1 140data bus 8 h0f joinendmodule 上面的两个repeat循环从不同时间开始 并行执行 象这样的特殊的激励集在单个的begin end块中将很难实现 Time data bus0 8 b0000 000010 8 b0100 010130 8 b0100 011040 8 b0100 011145 8 b1000 111050 8 b1000 111160 8 b1001 000065 8 b0010 000070 8 b0010 000180 8 b0010 001085 8 b0100 010090 8 b0100 0101100 8 b0100 0110105 8 b1000 1100110 8 b1000 1101120 8 b1000 1110125 8 b0001 1100140 8 b0000 1111 循环激励 从循环产生激励特性 在每一次循环 修改同一组激励变量时序关系规则代码紧凑 moduleloop tb regclk reg 7 0 stimulus wire 7 0 results integeri DUTu1 results stimulus alwaysbegin clockgenerationclk 1 5clk clk endinitialbeginfor i 0 i 256 i i 1 negedgeclk stimulus i 20 finish endendmodule 数组激励 数组产生激励特性 在每次反复中 修改同一组激励变量激励数组可以直接从文件中读取 modulearray tb reg 7 0 data bus stim array 15 0 数组integeri DUTu1 results stimulus initialbegin 从数组读入数据 20stimulus stim array 0 30stimulus stim array 15 线激励 20stimulus stim array 1 for i 14 i 1 i i 1 循环激励 50stimulus stim array i 30 finish endendmodule 用仿真输出信号作激励 在仿真过程中可以对激励和响应信号进行采样 作为其它仿真的激励和期望结果 modulecapture tb parameterperiod 20reg 7 0 in vec out vec integerRESULTS STIMULUS DUTu1 out vec in vec initialbeginSTIMULUS fopen stimulus txt RESULTS fopen results txt forkif STIMULUS 0 forever period 2 fstrobeb STIMULUS b in vec if RESULTS 0 perio

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论