数字IC手撕代码-平头哥技术终面手撕真题
前言:
本专栏旨在记录高频笔面试手撕代码题,以备数字前端秋招,本专栏所有文章提供原理分析、代码及波形,所有代码均经过本人验证。
目录如下:
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手撕代码-平头哥技术终面手撕真题相关推荐
- 微型计算机2013年10月下,微型计算机及接口技术2013年10月真题试题(04732)
微型计算机及接口技术2013年10月真题试题及答案解析(04732) 微型计算机及接口技术2013年10月真题试题及答案解析(04732),本试卷总分100分. 一.单项选择题 (本大题共20小题,每 ...
- 微型计算机物理地址转换,微型计算机及接口技术2015年4月真题试题(04732)
微型计算机及接口技术2015年4月真题试题及答案解析(04732) 微型计算机及接口技术2015年4月真题试题及答案解析(04732),本试卷总分100分. 一.单项选择题 (本大题共20小题,每小题 ...
- 微型计算机上的南桥芯片功能,微型计算机及接口技术2012年1月真题试题(04732)...
微型计算机及接口技术2012年1月真题试题及答案解析(04732) 微型计算机及接口技术2012年1月真题试题及答案解析(04732),本试卷总分100分. 一.单项选择题 (本大题共20小题,每小题 ...
- 2021年广东省大数据技术与应用技能大赛 真题测试数据
2021年广东省大数据技术与应用技能大赛 真题测试数据 前面两章讲过关于2021年广东省专业技能大赛--大数据技术与应用 真题题目及解析: 2021年广东省专业技能大赛--大数据技术与应用 真题题目及 ...
- 微型计算机2015年10月,微型计算机及接口技术2010年10月真题试题(04732)
微型计算机及接口技术2010年10月真题试题及答案解析(04732) 微型计算机及接口技术2010年10月真题试题及答案解析(04732),本试卷总分100分. 一.单项选择题 (本大题共20小题,每 ...
- 微型计算机2009,微型计算机及接口技术2009年10月真题试题(04732)
微型计算机及接口技术2009年10月真题试题及答案解析(04732) 微型计算机及接口技术2009年10月真题试题及答案解析(04732),本试卷总分100分. 一.单项选择题 (本大题共20小题,每 ...
- 微型计算机cpu每执行,微型计算机及接口技术2017年4月真题试题(04732)
微型计算机及接口技术2017年4月真题试题及答案解析(04732) 微型计算机及接口技术2017年4月真题试题及答案解析(04732),本试卷总分100分. 一.单项选择题 (本大题共20小题,每小题 ...
- 计算机科学考试题目,附录A 计算机科学与技术学科综合考试人工智能真题
附录A计算机科学与技术学科综合考试人工智能真题 1999年计算机科学与技术学科综合考试真题 课程Ⅳ人工智能原理 一.选择题(共4分) 人工智能作为一门学科,在()年诞生于().LISP语言是()年提出 ...
- 计算机科学与技术专业考博课程,北京大学考博计算机科学与技术专业介绍,考博真题,真题解析.pdf...
北京大学考博计算机科学与技术专业介绍,考博真题,真题解析.pdf [全国百所名校定向保录] [才思教育由命题组领专业化辅导] 考博详解与指导 系所名称 信息科学技术学院 招生总数 118 其中推荐直博 ...
最新文章
- linux隐藏软件程序,如何使用GNOME Shell隐藏的屏幕录像工具
- 计算机基础access数据库操作题,2021年3月全国计算机等级考试二级Access数据库程序设计题库及答案讲解...
- Mybatis用#{}从传递过来的参数中取值
- Anonymous Inner Class (匿名内部类) 是否可以extends(继承)其它类,是否可以implements(实现)interface(接口)?...
- goquery php,golang:Goquery简单爬虫实例
- 【QT】QT从零入门教程(八):QT常用控件 [QLabel、QPushButton、QLineEdit、QTextEdit]
- 支持MySql的数据库自动分表工具DBShardTools发布
- java去除对象属性空格_JAVA 对象中去除空格
- 大数据专业考研书_2019年清华大学自动化系大数据工程专业考研经验分享
- 关于DRM、ChinaDRM与寰宇信任DTA:数字内容版权保护产业本土化之路
- (八)高德地图之添加marker标记点
- PhotoshopCC 2018(19.1.3)绿色精简/增强无需注册安装直接用
- IPS(Intrusion Prevention System)入侵防护系统原理
- 摘录的Tim Urban关于拖延症的总结
- 攻防世界MISC刷题1-50
- BMS(电池管理系统)第五课 ——核心!!!SOH算法开发
- python已打开页面获取信息_python+selenium实现自动登录网页获取信息(一)
- hg110路由器那位大神给编译一个挂3070网卡固件
- 字符串匹配之BM算法
- 开发者模式的微信公众号菜单链接其他开发者的小程序
热门文章
- mails plugin
- 计算机系统中bs三层指,基于BS三层结构模式的在线练习系统的设计与实现.pdf
- 如何实施 SCRUM
- 浅谈 ecmp, letflow,rps
- 怎么做三站合一网站?如何制作电脑网站,手机网站,微网站?
- 多模板DIY代付社区团购商城小程序开发
- 关于Qt绘制大图片无法显示的问题(缩放图片)
- java接口联调json传参,前端接口联调工具
- 2008系统无法启动服务器不可用,SQL Sever2008r2 数据库服务各种无法启动问题的解决办法(详解)...
- 读书百客:《饮酒·其五》赏析