P0-logisim

CO-P0-logisim ​ 写在前面:10.9晚上机有三道题目,笔者只侥幸通过了其中两道,记录一下思路,分享一下拙见QAQ,如有错误还请指正!(os:上机还是很辛苦的……) 1.找最小 1.思路探究 ​ 题目的大意为,输入五个八位二进制数字,完成电路,输出没有出现过的最小正整数,例如,输入为:0,3,2,1,7,那么最小的没有出现过的正整数为4. ​ 题意分析:如果能够想到将输入转换为独热码就可以比较直观地理解问题!我们考虑:这个所求的最小正整数最大是多少?可以想到,找最小正整数的过程类似于找一个“空隙”,如果我们将五位输入按从小到大顺序排好,记为a[n],那么最小正整数会出现的条件: 1 a[n-1] + 1 < a[n] ​ 我们可以发现:最小正整数最大的时候即为五个输入为1,2,3,4,5;此时最小正整数大小为6.故我们可以知道最小正整数的出现范围为16。这一点对我们的解题过程很关键,因为这一认知告诉我们:无论输入如何,我们只需要去找从16之间没有出现过的最小数即为我们所求的最小正整数。 ​ 然后:我们怎么知道数字有没有出现过呢?常规的二进制编码可能较难实现,但是选择独热码是一个比较直观的选择,将每个输入转换为独热码,最后或起来…….到这里思路已经明晰,实现电路吧! 2.电路设计 1.转换为独热码电路 one-hot encoder ​ 这里做出判断,大于6就当作0处理,需要注意的是,八位独热码中0也被编码,即为图中所示,因为要求是正整数,所以无论是否输入0,第0位应该被默认占位,这一点在主电路中也有处理。 2.main ​ 在主电路的处理中,我们添加一个“输入0”,将第0位占位,保证是正整数。 2.回字迷宫 ​ 从迷宫中的1位置出发,绕回字迷宫行走,00向北,01向南,10向西,11向东,如果当前输入的方向有位置,就输出进入位置的编号,若没有位置,就输出当前位置编号,使用mealy状态机实现,注意1位置的编号为1。 ​ 这个题目比较简单,无脑的把状态逻辑和输出逻辑分开列真值表就可以解决……题目里一共八个状态,建议还是使用四位编码吧,从0001开始编码,这样可以在输出逻辑时好看一些,笔者采用三位编码,导致输出时的数字要比状态数字大1,有点费心神。 ​ 打表技巧:将输入利用splitter分解成1位输入到模块中,这样在模块中便于进行analyze功能和debug……毕竟将多位传输进模块,在打完表之后要进行位拼接,这个过程走线比较逆天,另外如果逻辑错了不好进行debug,需要将拼接好的位数再展开……. 3.十六进制匹配 ​ 此题笔者是通过打真值表实现,比较麻烦,下面附上状态转移图 ​ 课程组提供的标准解法中利用三个寄存器存储最近输入的状态,这种做法比较巧妙,引用讨论区中助教的回答

October 9, 2023 · 1 min · sudo

P0课下提交

P0课下提交 ​ 本次P0课下提交部分全部为logisim有关内容,五个电路题目我没有一题是一遍过的QAQ,在做每个题目的过程中或多或少都会发现一些疏漏点,本篇笔记的初衷是记录一下做题思路(毕竟.circ文件不支持添加笔记)以及在做题过程中遇到的一些坑点。 1.CRC校验码的生成 名称 方向 描述 A[7 : 0] I 8位原数据帧 B[3 : 0] I 除数 C[10 : 0] O 8位原数据帧+3位余数 1.被除数的生成 ​ 被除数为8位原数据帧 + (除数位数-1)位0,在题目中具体下来即补全为11位被除数。这时我们发现,按照题目中的提示,按照4位除法来搭建电路,而一个11位数应当可以进行8次4位补位除法(同样参考商的位数是8位可以得到答案,不要被竖式计算过程中似乎计算除法模块小于8次迷惑,做出难以名状的事情)。 2.模二除法 ​ 在此题目中涉及到模二除法的使用,这是一个新概念,模二除法在结果上等于两位进行异或的答案,但是进行模二除法的前提是最高位需要为1(已经保证除数的最高位为1),即保证被除数与除数的最高位相同。这样我们可以知道,能进行除法的四位数为```1xxx```,这样得到的余数为```0xxx```,型为```0xxx```的数字不满足进行模二除法的条件,需要进行借位,直到最高位变为1才进行计算,这是根据题目中给出的样例得到的。 3.电路设计 ​ 通过以上分析我们知道,当前补全的四位能否进行模二除法的关键在于它的最高位,如果当前四位数字的最高位为1则进行模二除法,并传递余数到下一级,如果当前最高位为0则将数字左移一位,传递给下一级,如此传递直到最高位为1满足进行除法的条件。由于我们知道余数一定是三位且在进行下一级除法前需要拼接被除数的下一位,因此在四位除法中输出设计为3位。下面给出电路。 2.主电路搭建 ​ 主电路主要实现8级除法的连接(传入下一位),这里需要注意的是在进行输出输出时都需要进行处理,输入时在原数据后补加3位0,输出时在原数据后补加3位余数。此题用到许多的splitter。 2.实现GRF ​ 这一题主体上的功能比较单一,即对寄存器进行简单的读写操作,但是这个题目中却有很多的细节值得细细品味。而且此题的电路图过于复杂且重复,因此只展示部分电路连接。 1.一个弱智问题MUX与DMX ​ 对于MUX与DMX我要好好品味,毕竟Ppre挂掉就是因为对多路选择器的功能不够熟悉QAQ!。 1.DMX ​ DMX通常用于输入端选择输入到哪里的情况,短边连接输入信号,长边连接多个可以被选择的输入到的位置。 端口说明: 短边连接输入信号(data) 长边连接多个输入路径选择 腰上一个使能端口(include enable),一个选择输入到第几个路径的输入信号(select),这里需要注意的是一些情况下可以不选择启用使能端口,在启用使能端口时,腰上会出现两个接口点,如何去区分功能?端口上有一个灰色点的是select! 2.MUX ​ MUX通常用于选择多方数据中的一个来进行输出,长边连接多个可以进行输出的信号,短边进行输出。 端口说明: 短边进行输出(output) 长边上连接多个可供进行输出的信号 腰上一个使能端口(include enable),一个选择输出第几路数据的信号(select),同样,上面标记有灰色点的为选择信号。 3.总结 ​ DMX用于输入到哪里的选择,MUX用于输出哪个的选择。选择信号为腰上标记灰色点的端口。DMX与MUX在此题中配对放置。 使能端的勾选视情况而定。 2.DMX的three-state ​ 在我进行电路搭建的过程中,我习惯性的将three-state设置为no,在此次搭建过程中,由于需要向32个不同的寄存器中写入数据,我发现在写入数据时每当我向新的寄存器写入数据,之前写过的寄存器会被洗掉变回0,这是一个很奇怪的现象,知道我看了讨论区,才知道要将DMX的three-state设置为yes.这背后的原因是什么呢? ...

October 2, 2023 · 1 min · sudo