P0
P0_Study
电路分析设计
- Input与Output分析
- 功能分析
(可以先进行类似于表格的书面化说明,明白好设计思路与设计需求再去设计电路) - 分层设计与分模块设计
模块类似于函数的封装,便于理清思路、清晰电路、debug
eg1.Moore机与Mealy机都可以划分为状态转移、状态存储、输出模块
eg2.32位加法器分为多个一位加法器
PS:注意子电路的appearance,要跟题目要求一致
有限状态机
首先回顾一下Moore和Mealy叭!
- 状态转移电路一般只是组合逻辑的计算,也就是说随着input的变化(无论clk处于什么状态),其计算的状态也相应发生,所以一定要有状态存储模块,clk处于上升沿时输出prev_state存入now_state
- 对于组合逻辑部分,画好状态转移图,一个经济有效的方法就是打表,利用analyze circuit来实现
- 一定弄清题目对于输出的要求,正确使用register
线路颜色不对报错
小结:
- 红色 E 的可能原因:短路/多驱动,门电路没接输入,多驱动即相当于多个逻辑运算assign同一个output,这当然是不行的
- 状态转移模块是组合逻辑,不需要时钟,不需要 reset
- 真值表生成电路功能的使用
- 不要在组合逻辑电路中出现环路,否则会出现震荡!
question
- register的使用(navigation那里)
①先把问题转化成有限状态机,再把有限状态机实现成电路
②每个时钟上升沿到来,更新寄存器的值 - 三态问题?什么时候用三态?(好像三态的输入用逻辑门运算会变红)
不用考虑三态 - 二进制减法qaq不会(主要是ftoi那里)
扩展为32位,再用0去减
用0去减其实与非门等效
CRC
- 体现了模块化的思想
- 要审题,题目说了被除数是要拼接的
- 注意splitter的最高位最低位以及数据的最高位最低为的对应,不要反了!
GRF
题目不难,注意线路很杂的时候要看有没有接上或者接错,CTRL CV 的时候tunnel要改完改对
ftoi
- 二进制浮点数小数点几位,相当于右移几位;乘2^n想当于左移(正数),注意要先左移再右移,否则就丢失掉后面的数据位了
- 二进制减法?不会qaq
- 计算负数的补码,取反(非门计算)+1,(?2^n-x感觉是不是不太行,因为n达不到32位)
- 学会试着使用simulate-logging功能debug
navigation
- 状态转移打表 “课上课下打表最经济有效”————董老 salute!
此处状态转移以及hit都可以打表得到(注意打表的时候输入输出都只能是一位,这里需要splitter套层皮,同样是注意高低位) - 太憨了!看好输入输出要求,是否提供clk,如果clk是一个input就不要再自己放一个clk了,太憨。
- 注意状态存储部分要符合题目要求
- 状态转移打表、register存储、input和prev_state决定输出,这些没什么好说的
- What deserves special mention is 注意这里利用MUX实现了同步复位,因为后面有register,只有clk处于上升沿,这个clr才是有效的(组合逻辑是不是们没有任何延迟?目前是的)
祝上机顺利!
P0_Review
写在前面
首先恭喜帆帆顺利通过P0,再接再厉!
五人投票
- 题意描述:四个组员(00-11)一个组长,组长可以投屏蔽票,并指定一人屏蔽他的投票,组员是赞成、反对、弃权,组长是赞成、反对、弃权、屏蔽,若赞成票数大于反对票数,则输出1,否则输出0
- 主要思路:首先用比较器判断每个人是投赞成还是反对(是则对应输出为1,组长投屏蔽票时,则其对应的赞成和反对的输出都为0;组员的统计使用了一个mux,如果是被屏蔽了则把其输入置为弃权票),然后分别把赞成和反对的票数相加,最后用一个比较器绝定输出
- 错误:①使用比较器的时候习惯性连亮着的点,连错端口
②比较器要置为unsigned(根据数据类型决定比较器的参数属性) - 优化:线路过于凌乱复杂,评论区给出了更好的解决方法
使用bit adder而非那么多加法器
字符匹配
- 本题要求一个mealy机来匹配字符串0121(输出01)和1210(输出10),无匹配则输出00
- 解题思路:基本的mealy型状态机,即数据输入、状态转移、状态存储、状态输出。其中状态转移和状态输出打表解决。这里需要注意的是有九个状态,状态转移很复杂,一不小心就会出错。
- 错误:①注意输入0把之前的输入失配之后,应转移到已匹配一个0的情况而非初始状态
②已匹配0121后,再输入0,则匹配到1210;再输入2,转移到匹配了12的状态
反正就多注意吧,仔细一点 - 优化:利用高老师上课讲的移位的方法,使用三个串联寄存器或者三位的移位寄存器(因为此处只是mealy机),用每一次输入之后input、s0、s1、s2来分别与0121和1210比较
三个寄存器串联
注意 此处需要给寄存器赋一个并不会出现的初值3,否则寄存器默认初始值0,则会使匹配出现问题
使用移位寄存器
注意 此处也是赋初值问题,为了避免初始默认0造成的影响,同学提供了在最高位加上1校验的方法(00->100,01->101 etc) - 后记:认真听讲,多去思考讨论,学习简洁优美的思路
类斐波那契
斐波那契好像是P0绕不过去的点了,就是一年比一年复杂qaq。不应该着急走的,其实慢慢做,静心想,也没有很难!
题目:
这里提供一个讨论区使用移位寄存器的方法,使用寄存器串联同理
- 计数器在第一个时钟上升沿结束后变成1
- 每个时钟上升沿到来都会立即把s_x存入移位寄存器,然后相应后面的s_x又会更新,因为是组合逻辑。在第n个时钟上升沿到来把f(n-1)存入了移位寄存器,此时s_x也改变为f(n),所以第n+1个时钟上升沿到来时,f(n)存入结果寄存器
- 时钟端口除了时钟外,尽量不要接其他东西,不要参与计算逻辑
- 主要是弄懂核心的迭代,对于输出周期,可以多一个少一个自己调一调,也就好了~
- Post title:P0
- Post author:Coooookie
- Create time:2023-01-02 20:29:24
- Post link:https://coooookie0913.github.io/2023/01/02/P0/
- Copyright Notice:All articles in this blog are licensed under BY-NC-SA unless stating additionally.