前言:

本专栏旨在记录高频笔面试手撕代码题,以备数字前端秋招,本专栏所有文章提供原理分析、代码及波形,所有代码均经过本人验证。

目录如下:

1.数字IC手撕代码-分频器(任意偶数分频)

2.数字IC手撕代码-分频器(任意奇数分频)

3.数字IC手撕代码-分频器(任意小数分频)

4.数字IC手撕代码-异步复位同步释放

5.数字IC手撕代码-边沿检测(上升沿、下降沿、双边沿)

6.数字IC手撕代码-序列检测(状态机写法)

7.数字IC手撕代码-序列检测(移位寄存器写法)

8.数字IC手撕代码-半加器、全加器

9.数字IC手撕代码-串转并、并转串

10.数字IC手撕代码-数据位宽转换器(宽-窄,窄-宽转换)

11.数字IC手撕代码-有限状态机FSM-饮料机

12.数字IC手撕代码-握手信号(READY-VALID)

13.数字IC手撕代码-流水握手(利用握手解决流水线断流、反压问题)

14.数字IC手撕代码-泰凌微笔试真题

15.数字IC手撕代码-平头哥技术终面手撕真题

16.数字IC手撕代码-兆易创新笔试真题

17.数字IC手撕代码-乐鑫科技笔试真题(4倍频)

18.数字IC手撕代码-双端口RAM(dual-port-RAM)

...持续更新

更多手撕代码题可以前往 数字IC手撕代码--题库


目录

题目描述

原理分析

状态机

状态转移

三段式

代码

testbench

波形


题目描述

平头哥的手撕代码很有意思,平头哥技术终面手撕真题,题目描述如下:

输入clk,每个时钟输入1比特的data_in,然后进来之后的序列是每次左移,也就是如果第一个时钟data_in=1,第二个时钟datain=0,第三个时钟data_in=1;则data_temp=101;然后data_out是在data_temp可以整除3的时候,输出1,其他时刻输出0;

这道题乍一看,好像是什么移位寄存器的题,似乎不难;但实有点难度,涉及到一些数学的推导,下面我们来分析一下。

首先,要声明的一点,这道题只能用状态机写,为什么?

明确一下我们的需求,我们的需求是知道一条序列,然后要求输出data_out。


原理分析

有两种做法,第一种,存储所有输入的值,然后对3取余,接着输出结果。表面可以,实则不行,因为如果要存储所有的值,在输入数据量已知的情况下,你可能提前预设reg [9999:0] data_temp来存储1w个输入的结果,那如果是100w个输入呢?那100M的时钟跑一秒,1个亿的输入呢?你全存下来,然后对3取余么?显然不行,因此第一种做法是不行的。


第二种做法,考虑所有可能,然后用状态机来进行状态转移,每输入一个数据1,状态机跳转到对应状态,再根据对应状态,选择输出data_out是否为1 。下面来分析一下所有可能的情况,进而再画出状态转移图:

输入数据是1bit的,每周期输入1bit数;

假设当前余数为0时,那么左移(乘以2)后余数是0,那么进来1余1,进来0余0;

假设当前余数为1时,那么左移(乘以2)后余数是2,那么进来1余0,进来0余2;

假设当前余数为2时,那么左移(乘以2)后余数是1,那么进来1余2,进来0余1;

整个题目用有4个状态的状态机就可描述了,3个状态分别表示对3取余后的余数,1个状态为初始状态,输入为data_in,题目要求data_temp可以整除3的时候,data_out拉高,其他时候data_out拉低。

状态机

状态转移

初始状态和余数为0时的状态都是进来1余1,进来0余0,两者的区别就在于:初始状态的data_out为低(其他状态),余数为0时的data_out为高。

画出状态转移图后,这道题就变得很简单了,我们之前专栏手撕过FSM饮料机,这个同理解决即可:数字IC手撕代码-有限状态机FSM-饮料机


三段式

下面直接上代码:

状态机三段式写法,第一段:状态转移

// FSM state
reg [3:0] next_state    ;
reg [3:0] current_state ;//(1) state transfer
always @(posedge clk)beginif(!rstn)begincurrent_state <= IDLE;endelse begincurrent_state <= next_state;end
end

第二段:根据当前状态和当前输入,决定下一状态

//(2) determine the next state according to the current statealways @(*)beginnext_state = current_state;case(current_state)IDLE:case(data_in)1'b0: next_state = RES_0;1'b1: next_state = RES_1;endcaseRES_0:case(data_in)1'b0: next_state = RES_0;1'b1: next_state = RES_1;endcaseRES_1:case(data_in)1'b0: next_state = RES_2;1'b1: next_state = RES_0;endcaseRES_2:case(data_in)1'b0: next_state = RES_1;1'b1: next_state = RES_2;endcasedefault: next_state = IDLE;endcase
end

状态转移就按照状态转移图来写就行了,根据当前状态和当前输出,改变下一周期的状态为什么。


第三段:根据当前状态和输入,决定输出结果

//(3)determine the output according to the current state and input
always @(posedge clk)beginif(!rstn)begindata_out <= 1'b0;endelse if((current_state==IDLE && data_in==1'b0)||(current_state==RES_0 && data_in==1'b0)||(current_state==RES_1 && data_in==1'b1))data_out <= 1'b1;else data_out <= 1'b0;
end

输出判断,只有在状态为RES_0也就是余数为0,即对3整除时,data_out才会拉高。

代码

module T_head#(parameter IDLE=4'b0001,RES_0=4'b0010,RES_1=4'b0100,RES_2=4'b1000
)(input         clk       ,input         rstn      ,input         data_in   ,output   reg  data_out
);// FSM state
reg [3:0] next_state    ;
reg [3:0] current_state ;//(1) state transfer
always @(posedge clk)beginif(!rstn)begincurrent_state <= IDLE;endelse begincurrent_state <= next_state;end
end//(2) determine the next state according to the current statealways @(*)beginnext_state = current_state;case(current_state)IDLE:case(data_in)1'b0: next_state = RES_0;1'b1: next_state = RES_1;endcaseRES_0:case(data_in)1'b0: next_state = RES_0;1'b1: next_state = RES_1;endcaseRES_1:case(data_in)1'b0: next_state = RES_2;1'b1: next_state = RES_0;endcaseRES_2:case(data_in)1'b0: next_state = RES_1;1'b1: next_state = RES_2;endcasedefault: next_state = IDLE;endcase
end//(3)determine the output according to the current state and input
always @(posedge clk)beginif(!rstn)begindata_out <= 1'b0;endelse if((current_state==IDLE && data_in==1'b0)||(current_state==RES_0 && data_in==1'b0)||(current_state==RES_1 && data_in==1'b1))data_out <= 1'b1;else data_out <= 1'b0;
endendmodule

testbench

module T_head_tb();
reg clk,rstn;always #5 clk = ~clk;reg    data_in;
wire   data_out;initial beginclk     <= 1'b0;rstn    <= 1'b0;#15rstn    <= 1'b1;#20data_in <= 1'b1;#10data_in <= 1'b0;#20data_in <= 1'b1;#50$stop();
endT_head u_T_head(.clk      (clk)       ,.rstn     (rstn)      ,.data_in  (data_in)   ,.data_out (data_out)
);endmodule

波形

波形和我们分析和思考的一致,我们在tb中将状态机的所有状态都遍历了,data_out只在current_state为4‘b0010也就是RES_0状态时才拉高,也即满足题目要求:输入一串序列,data_out仅在序列能对3整除时拉高。


更多手撕代码题可以前往 数字IC手撕代码--题库

数字IC手撕代码-平头哥技术终面手撕真题相关推荐

  1. 微型计算机2013年10月下,微型计算机及接口技术2013年10月真题试题(04732)

    微型计算机及接口技术2013年10月真题试题及答案解析(04732) 微型计算机及接口技术2013年10月真题试题及答案解析(04732),本试卷总分100分. 一.单项选择题 (本大题共20小题,每 ...

  2. 微型计算机物理地址转换,微型计算机及接口技术2015年4月真题试题(04732)

    微型计算机及接口技术2015年4月真题试题及答案解析(04732) 微型计算机及接口技术2015年4月真题试题及答案解析(04732),本试卷总分100分. 一.单项选择题 (本大题共20小题,每小题 ...

  3. 微型计算机上的南桥芯片功能,微型计算机及接口技术2012年1月真题试题(04732)...

    微型计算机及接口技术2012年1月真题试题及答案解析(04732) 微型计算机及接口技术2012年1月真题试题及答案解析(04732),本试卷总分100分. 一.单项选择题 (本大题共20小题,每小题 ...

  4. 2021年广东省大数据技术与应用技能大赛 真题测试数据

    2021年广东省大数据技术与应用技能大赛 真题测试数据 前面两章讲过关于2021年广东省专业技能大赛--大数据技术与应用 真题题目及解析: 2021年广东省专业技能大赛--大数据技术与应用 真题题目及 ...

  5. 微型计算机2015年10月,微型计算机及接口技术2010年10月真题试题(04732)

    微型计算机及接口技术2010年10月真题试题及答案解析(04732) 微型计算机及接口技术2010年10月真题试题及答案解析(04732),本试卷总分100分. 一.单项选择题 (本大题共20小题,每 ...

  6. 微型计算机2009,微型计算机及接口技术2009年10月真题试题(04732)

    微型计算机及接口技术2009年10月真题试题及答案解析(04732) 微型计算机及接口技术2009年10月真题试题及答案解析(04732),本试卷总分100分. 一.单项选择题 (本大题共20小题,每 ...

  7. 微型计算机cpu每执行,微型计算机及接口技术2017年4月真题试题(04732)

    微型计算机及接口技术2017年4月真题试题及答案解析(04732) 微型计算机及接口技术2017年4月真题试题及答案解析(04732),本试卷总分100分. 一.单项选择题 (本大题共20小题,每小题 ...

  8. 计算机科学考试题目,附录A 计算机科学与技术学科综合考试人工智能真题

    附录A计算机科学与技术学科综合考试人工智能真题 1999年计算机科学与技术学科综合考试真题 课程Ⅳ人工智能原理 一.选择题(共4分) 人工智能作为一门学科,在()年诞生于().LISP语言是()年提出 ...

  9. 计算机科学与技术专业考博课程,北京大学考博计算机科学与技术专业介绍,考博真题,真题解析.pdf...

    北京大学考博计算机科学与技术专业介绍,考博真题,真题解析.pdf [全国百所名校定向保录] [才思教育由命题组领专业化辅导] 考博详解与指导 系所名称 信息科学技术学院 招生总数 118 其中推荐直博 ...

最新文章

  1. linux隐藏软件程序,如何使用GNOME Shell隐藏的屏幕录像工具
  2. 计算机基础access数据库操作题,2021年3月全国计算机等级考试二级Access数据库程序设计题库及答案讲解...
  3. Mybatis用#{}从传递过来的参数中取值
  4. Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)?...
  5. goquery php,golang:Goquery简单爬虫实例
  6. 【QT】QT从零入门教程(八):QT常用控件 [QLabel、QPushButton、QLineEdit、QTextEdit]
  7. 支持MySql的数据库自动分表工具DBShardTools发布
  8. java去除对象属性空格_JAVA 对象中去除空格
  9. 大数据专业考研书_2019年清华大学自动化系大数据工程专业考研经验分享
  10. 关于DRM、ChinaDRM与寰宇信任DTA:数字内容版权保护产业本土化之路
  11. (八)高德地图之添加marker标记点
  12. PhotoshopCC 2018(19.1.3)绿色精简/增强无需注册安装直接用
  13. IPS(Intrusion Prevention System)入侵防护系统原理
  14. 摘录的Tim Urban关于拖延症的总结
  15. 攻防世界MISC刷题1-50
  16. BMS(电池管理系统)第五课 ——核心!!!SOH算法开发
  17. python已打开页面获取信息_python+selenium实现自动登录网页获取信息(一)
  18. hg110路由器那位大神给编译一个挂3070网卡固件
  19. 字符串匹配之BM算法
  20. 开发者模式的微信公众号菜单链接其他开发者的小程序

热门文章

  1. mails plugin
  2. 计算机系统中bs三层指,基于BS三层结构模式的在线练习系统的设计与实现.pdf
  3. 如何实施 SCRUM
  4. 浅谈 ecmp, letflow,rps
  5. 怎么做三站合一网站?如何制作电脑网站,手机网站,微网站?
  6. 多模板DIY代付社区团购商城小程序开发
  7. 关于Qt绘制大图片无法显示的问题(缩放图片)
  8. java接口联调json传参,前端接口联调工具
  9. 2008系统无法启动服务器不可用,SQL Sever2008r2 数据库服务各种无法启动问题的解决办法(详解)...
  10. 读书百客:《饮酒·其五》赏析