P0

Coooookie hahah

P0_Study

电路分析设计

  1. Input与Output分析
  2. 功能分析
    (可以先进行类似于表格的书面化说明,明白好设计思路与设计需求再去设计电路)
  3. 分层设计与分模块设计
    模块类似于函数的封装,便于理清思路、清晰电路、debug
    eg1.Moore机与Mealy机都可以划分为状态转移、状态存储、输出模块
    eg2.32位加法器分为多个一位加法器
    PS:注意子电路的appearance,要跟题目要求一致

有限状态机

首先回顾一下Moore和Mealy叭!
1

  1. 状态转移电路一般只是组合逻辑的计算,也就是说随着input的变化(无论clk处于什么状态),其计算的状态也相应发生,所以一定要有状态存储模块,clk处于上升沿时输出prev_state存入now_state
  2. 对于组合逻辑部分,画好状态转移图,一个经济有效的方法就是打表,利用analyze circuit来实现
  3. 一定弄清题目对于输出的要求,正确使用register

线路颜色不对报错

小结:

  1. 红色 E 的可能原因:短路/多驱动,门电路没接输入,多驱动即相当于多个逻辑运算assign同一个output,这当然是不行的
  2. 状态转移模块是组合逻辑,不需要时钟,不需要 reset
  3. 真值表生成电路功能的使用
  4. 不要在组合逻辑电路中出现环路,否则会出现震荡!

question

  1. register的使用(navigation那里)
    ①先把问题转化成有限状态机,再把有限状态机实现成电路
    ②每个时钟上升沿到来,更新寄存器的值
  2. 三态问题?什么时候用三态?(好像三态的输入用逻辑门运算会变红)
    不用考虑三态
  3. 二进制减法qaq不会(主要是ftoi那里)
    扩展为32位,再用0去减
    用0去减其实与非门等效

CRC

1
1

  1. 体现了模块化的思想
  2. 要审题,题目说了被除数是要拼接的
  3. 注意splitter的最高位最低位以及数据的最高位最低为的对应,不要反了!

GRF

题目不难,注意线路很杂的时候要看有没有接上或者接错,CTRL CV 的时候tunnel要改完改对

ftoi

  1. 二进制浮点数小数点几位,相当于右移几位;乘2^n想当于左移(正数),注意要先左移再右移,否则就丢失掉后面的数据位了
  2. 二进制减法?不会qaq
  3. 计算负数的补码,取反(非门计算)+1,(?2^n-x感觉是不是不太行,因为n达不到32位)
  4. 学会试着使用simulate-logging功能debug
  1. 状态转移打表 “课上课下打表最经济有效”————董老 salute!
    此处状态转移以及hit都可以打表得到(注意打表的时候输入输出都只能是一位,这里需要splitter套层皮,同样是注意高低位)
  2. 太憨了!看好输入输出要求,是否提供clk,如果clk是一个input就不要再自己放一个clk了,太憨。
  3. 注意状态存储部分要符合题目要求
  4. 状态转移打表、register存储、input和prev_state决定输出,这些没什么好说的
  5. What deserves special mention is 注意这里利用MUX实现了同步复位,因为后面有register,只有clk处于上升沿,这个clr才是有效的(组合逻辑是不是们没有任何延迟?目前是的)

祝上机顺利!

P0_Review

写在前面

首先恭喜帆帆顺利通过P0,再接再厉!

五人投票

  1. 题意描述:四个组员(00-11)一个组长,组长可以投屏蔽票,并指定一人屏蔽他的投票,组员是赞成、反对、弃权,组长是赞成、反对、弃权、屏蔽,若赞成票数大于反对票数,则输出1,否则输出0
  2. 主要思路:首先用比较器判断每个人是投赞成还是反对(是则对应输出为1,组长投屏蔽票时,则其对应的赞成和反对的输出都为0;组员的统计使用了一个mux,如果是被屏蔽了则把其输入置为弃权票),然后分别把赞成和反对的票数相加,最后用一个比较器绝定输出
  3. 错误:①使用比较器的时候习惯性连亮着的点,连错端口
    ②比较器要置为unsigned(根据数据类型决定比较器的参数属性)
    1
    1
  4. 优化:线路过于凌乱复杂,评论区给出了更好的解决方法
    使用bit adder而非那么多加法器
    1

字符匹配

  1. 本题要求一个mealy机来匹配字符串0121(输出01)和1210(输出10),无匹配则输出00
  2. 解题思路:基本的mealy型状态机,即数据输入、状态转移、状态存储、状态输出。其中状态转移和状态输出打表解决。这里需要注意的是有九个状态,状态转移很复杂,一不小心就会出错。
  3. 错误:①注意输入0把之前的输入失配之后,应转移到已匹配一个0的情况而非初始状态
    ②已匹配0121后,再输入0,则匹配到1210;再输入2,转移到匹配了12的状态
    反正就多注意吧,仔细一点
  4. 优化:利用高老师上课讲的移位的方法,使用三个串联寄存器或者三位的移位寄存器(因为此处只是mealy机),用每一次输入之后input、s0、s1、s2来分别与0121和1210比较
    三个寄存器串联
    1
    1
    注意 此处需要给寄存器赋一个并不会出现的初值3,否则寄存器默认初始值0,则会使匹配出现问题
    使用移位寄存器
    1
    1
    注意 此处也是赋初值问题,为了避免初始默认0造成的影响,同学提供了在最高位加上1校验的方法(00->100,01->101 etc)
  5. 后记:认真听讲,多去思考讨论,学习简洁优美的思路

类斐波那契

斐波那契好像是P0绕不过去的点了,就是一年比一年复杂qaq。不应该着急走的,其实慢慢做,静心想,也没有很难!
题目:
1
这里提供一个讨论区使用移位寄存器的方法,使用寄存器串联同理
1

  1. 计数器在第一个时钟上升沿结束后变成1
  2. 每个时钟上升沿到来都会立即把s_x存入移位寄存器,然后相应后面的s_x又会更新,因为是组合逻辑。在第n个时钟上升沿到来把f(n-1)存入了移位寄存器,此时s_x也改变为f(n),所以第n+1个时钟上升沿到来时,f(n)存入结果寄存器
  3. 时钟端口除了时钟外,尽量不要接其他东西,不要参与计算逻辑
  4. 主要是弄懂核心的迭代,对于输出周期,可以多一个少一个自己调一调,也就好了~
  • 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.