完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
Logisim仿真
当搭建好一个时序电路后,我们可以使用菜单栏里Simulate中的选项来帮助我们对电路进行仿真。选中其中的Ticks Enable后,可以使时钟自动地周期性变化。如果你觉得时钟变化太快或太慢,可以修改Tick Frequency选项来修改时钟变化周期。 另外,在仿真前一定记得要选中Simulation Enable,否则电路不会进行仿真。 快捷键的使用 熟练使用相关快捷键能带给电路调试很大的便利。对于 Clock 元件,使用哪个快捷键能使其电位改变一次? A. Ctrl + T B. Ctrl + R A. Ctrl + K A. Ctrl + I 答案:A. Ctrl + T 使用哪个快捷键能使电位连续改变? A. Ctrl + T B. Ctrl + R A. Ctrl + K A. Ctrl + I 答案:C. Ctrl + K Step Simulation Simulate菜单中有一项Step Simulation,这个选项在平时我们并不常用,但使用它能看到Logisim对电路仿真的细节,所以有时对调试是很有帮助的。这个选项在Simulation Enable被选中时是不可用的,所以使用前记得关闭Simulation Enable。 每当我们点击一次Step Simulation,电路就会向前仿真一步。注意这里的一步并不是时钟改变一次,而是Logisim进行了一次它仿真的最小粒度。比如下面这个电路,在初始时它的状态除了两个输入管脚都是不确定的,然后每进行一次Step Simulation,电路变化如图片所示。 从每一幅的电路变化可以看出,每个基本逻辑门元件的状态变化需要一次Step Simulation的延迟才能完成,而pin、wire等元件的状态变化则没有这种延迟。 这种细致的仿真有时对我们很有用,比如我们不小心错误地把RS锁存器搭成了下面的样子 然后点击两次S管脚,Logisim会立刻出现下面的错误(出现振荡)。 如果你一直在跟着教程做,你会发现什么都没有看清错误就出现了,因为电路运行地太快了,人眼根本看不到发生了什么。这时我们就可以使用Step Simulation功能,一步步地跟踪电路的行为。通过几次的Step Simulation,我们发现在S被改变两次后,~Q会自主地在0、1状态间交替改变。Logisim监测到了这种周期性改变,认为电路发生了振荡,从而终止了仿真。 另外,Logisim的帮助文档中提到了另外一种有趣的现象: 这个电路正常来说应该始终输出0,但在Logisim中,其输入每改变两次,输出就会改变一次。你可以尝试自己搭建这个电路,然后使用Logisim的Step Simulation功能来探究其中的原因。 子电路的调试 随着电路的复杂化,我们的电路中很可能嵌套着很多子电路。如果在仿真时出现了下面这种情况,我们就会猜测子电路存在问题。 我们可以采取几种办法来进入到子电路中,观察子电路仿真的详细情况: 1、点击左上角的 ,然后直接双击想要进入的子电路。 2、点击左上角的 ,这时左侧的电路列表就会变成下面这种父电路嵌套子电路的形式。双击要进入的电路即可。这种方法可以方便地进入嵌套较深的子电路。 3、使用Simulate栏中的go in to state/go out to state选项。这种方法可以方便地在父子电路间反复切换。 子电路 一般情况下,在子电路中能否直接改变输入管脚的值? 答案:否 一般情况下,在子电路中能否直接对其结构进行修改? 答案:是 子电路的结构与C语言中子函数的设计非常相似,对于传入的信号是不可以直接改变的,换句话说在子电路中修改其输入不会对上层电路产生影响,这使得我们可以放心地调试子电路,而子电路中可以直接修改其结构。ROM与RAM的使用 ROM使用 对于ROM元件,如果想通过导入文件的方式来改变其内容,需要在文件的头部加入什么语句才能使Logisim正确识别该文件(请回顾之前章节对ROM的讲解)? 答案:v2.0 raw RAM使用 使用下面的电路运行0x25个周期以后,RAM中存储单元数值为0x23的地址为(注:图中左侧放行元件为Counter)(答案请使用十六进制形式,不加0x前缀)? 答案:0xff RAM可以设置分端口存取模式,该模式下左侧有用于存储的两个端口,A代表存储地址,D代表存储数据。电路左侧counter开始逐个递增,直到0x23时,D端口存入0x23,而上面的A端口地址是当前数据值和0x23作XNOR运算的结果,按位XNOR时每一位相异为0,相同为1,此时两路输入均为0x23,因此计算结果为0xff,那么存储数值0x23的地址即为0xff。应用与挑战 Logging模块 Logging模块,是一个可以记录仿真过程中各个部件的状态及数据的模块,在大规模电路仿真的过程中,可以将每一步的状态记录下来,这样不仅仅更直观,并且,起到步进仿真的效果。 在菜单的simulate栏目下,可以选择logging模块,根据当前电路,选择需要跟踪的元器件。 对于子模块,可以选择相应的输入输出,进行相应的记录,以下是一个不是很好的示例:
下图展示,具有标签名称的logging表,看起来十分的直观。 Table页的相关检测数据,需要在simulate状态下才会进行更新,所以大家在检测过程中请先打开simulate模式。 Logisim 设计指南 1.对电路进行标识(Label) 善用 Label 工具,没有 Label 的电路就像没有注释的代码一样,毫无可读性。 2.使用适当的多路选择器(Multiplexer) 以单周期数据通路中的 ALU 为例,没有必要使用一个16输入的多路选择器(不要让多路选择器存在悬空的输入)。 3.不要使用常量来扩展信号 不要用分线器(Splitter)和常量来扩展信号,扩展器(Bit Extender)才是简洁、易懂的选择。 在电路中尽量避免使用常量。 4.不要将信号和它取反的结果作为多路选择器(Multiplexer)的输入 左侧的电路可以被一个异或门(XOR Gate)替代。 5.适当使用常量 正如3中提到的,在通常情况下,你绘制的电路不应需要任何常量。两种例外的情况是:(a)子电路需要的输入比你需要使用的多(b)常量能使你的电路更加简单。每当你想要向电路中添加一个常量时,思考一下能否通过使用其他门电路来优化掉这个常量。 上图中左右两侧的电路是等价的。 6.不要将一个信号同时作为多路选择器(Multiplexer)的输入和控制 左侧的电路可以被一个或门(OR Gate)替换掉。 7.有意义的子电路 如果一个子电路只含有一个内置器件,那么使用子电路将毫无意义,请直接将器件放置在顶层电路中。 上图中左右两侧的子电路都可以直接被一个内置器件代替,使用子电路毫无意义。 8.学会做全面测试 请确认你提交的电路中不包含任何红色的连线,并且能够通过你自己构造的测试。如果你设计的电路使用二进制补码输入,请务必测试正、负数两种情况。 你构造的测试点至少应包括:正数+正数、正数+负数、负数+负数、负数+正数,另外不要忘记0。 9.不要拥有对外部文件绝对路径的依赖 如果你使用了外部 Logisim 库,请确保将库文件和你的电路设计一同上交,为确保万无一失,你可以在提交前将全部文件复制到一个空文件夹内,以测试电路是否能够正常打开。 10.使用正确的数据流方向 在 Logisim 中,通常的数据流方向是由上至下、由左至右,虽然很多器件可以通过更改朝向来改变输入输出的方向,但多路选择器(Multiplexer)等器件的朝向是不能更改的。如果不合理安排数据流方向,那么你的电路很可能会像下图中左侧的例子一样纠结。 11.学会编辑子电路外观 通常子电路的默认外观都非常丑陋,接口拥挤,而且没有注释,所以推荐大家尽可能自行编辑子电路外观,这里给出一个示例。 工具栏包含用于添加其他形状的工具,如下所示,其中包含shift和alt键如何修改工具行为的说明。此外,在按住Ctrl的情况下,单击或拖动鼠标会将鼠标位置附着到最近的网格点。 [tr] 选择,移动,复制和粘贴形状。[/tr]
1. Splitter
9. Shifter
10. Register
logisim在这里已经给出了相应的模式供大家选择,而在后续的Verilog实现过程中,需要大家对这些模式有清楚的认识,并且自己实现。 11. RAM 在RAM的相关的属性设置中,我们要求大家选择的数据接口模式为:Separate load and store ports 思考题:这里将其余两种模式的含义交给大家思考,思考其余两种模式的具体含义,以及三种模式各有什么特点,为什么选择第三种模式。 提示:大家可以选择不同的模式,观察端口的变化。 至此,我们已经讲述了大部分器件的相关属性,想必你也对器件的属性,以及Logisim所提供的各种功能有了清楚的了解。在之后的实验中,选择一个正确的器件,以及正确的功能模式,对于我们的实验至关重要,请大家重视本节的学习,并且多动手实践。 Logisim 自动化方法概览 本节内容属于选学内容,且方法并不完善,请各位同学适当参考! 自动化方法概览 在此之前我们使用Logisim搭建我们使用的数字电路时,都是在图形化界面(GUI)中进行操作,但在面临较为复杂,还有诸多重复性部件的电路时,如通用寄存器堆(GPR)等,如果全部使用手工搭建,会非常耗时。但如果我们考察电路的实际储存形式,可以发现它只是xml代码,因此可以使用代码自动生成的方法简化操作,达到提高效率的目的,接下来我们就对方法本身进行介绍,并针对某个具体问题进行讲解。 Circ文件与标签 Logisim使用的文件是.circ文件,它是使用扩展性标记语言编写的文件,Logisim通过这种文件来存储电路。这是一种描述性文件,和网页用的语言HTML类似,可以通过直接修改文件来更改电路图。作为一种XML文件,它主要是被用于传输数据,而非显示数据,这是与HTML的不同之处,因此它的标签均是可以自定义的。只需满足如bar式的格式即可,在Logisim中同样也是Logisim自行规定了一些标签,通过标签的类型其中比较常见的有:
以内存矩阵为例 下面我们来考虑这么一个问题: 假设我们现在有8位字长,存储容量为256B(8位地址)的ROM芯片,我们需要搭建合理的电路,将其扩展成,32位字长,存储容量为16KB的ROM(12位地址)。ROM芯片如图 从理论上分析,字长扩展了4倍,地址扩展了4位,因此共需4 * 16 = 64块原芯片,预计是要摆出一个16行4列的芯片矩阵看,面对如此大量的芯片,传统地在logisim中“手撸”一个电路就显得十分繁琐了。因此我们需要采用自动化的方法。 首先我们需使用GUI工具拖放元件,这一步其实是非常重要的,通过合理的尝试,我们可以找到显示效果最漂亮的摆放方式,为之后的编码听过位置信息。 之后我们需要观察产生的.circ文件,文件中我们可以发现, 接着我们需要编写脚本去批量生成按照规律摆放的ROM芯片,在此我们使用的较为简单的Python语言去编写脚本。需要知道的是,整个自动化方法的核心就是把摆放电路这件机械重复的事,交由计算机去完成。我们只需要根据前文所确定的最小单元,与摆放的**位置信息,**就能够编写相应的代码来自动生成所要的部分电路xml。 观察所编写的代码,其实只是将最小单位的位置信息参数化,进行重复输出而已,编写起来应该比较简单。之后我们只需将生成的xml黏贴到源文件中main下合适的部分即可。最终效果如下: 可以注意到的是,此时我们还没有解决连线的大问题,因此我们就要使用Tunnel简化布线,Tunnel元件直接不用wire连接在部件上组成最小单位,再进行自动化方法即可。效果如图,可以发现Tunnel的名字同样也参数化了,这样就可以通过有规律的Tunnel信号进行操作。 总结 综上,我们可以发现自动化方法的一般步骤就是 尝试——发现最小单元——编写生成代码——使用xml代码, 适用于减少重复性操作的场景,当然这种方法并不完善有许多值得改进与发展的地方,希望各位加油! Logisim 自动化测试概览 前面已经讲过logisim的Logging功能,但是logging得出的文本并不直观,也不利于我们做测试,所以需要你通过某种方式来转换一下Logging文本格式。 关于logisim命令行测试,请参考官方文档:http://www.cburch.com/logisim/docs/2.7/en/html/guide/verify/index.html 至此,PreProject的Logisim部分全部介绍完毕。 |
|
|
|
只有小组成员才能发言,加入小组>>
4540个成员聚集在这个小组
加入小组3343 浏览 0 评论
航顺(HK)联合电子发烧友推出“近距离体验高性能Cortex-M3,免费申请价值288元评估板
4270 浏览 1 评论
4296 浏览 0 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-28 12:23 , Processed in 0.601215 second(s), Total 74, Slave 58 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号