数字IC手撕代码
文章平均质量分 83
记录数字IC前端秋招手撕代码,涵盖基础手撕和秋招笔面试手撕真题。
不吃葱的酸菜鱼
数字IC前端/机器学习算法
展开
-
数字IC手撕代码---百题斩
本篇专栏记录数字IC秋招过程中的一些基础手撕代码,以及笔面试遇到的手撕代码真题。原创 2022-09-27 16:30:19 · 10598 阅读 · 2 评论 -
计算序列1的计数(verilog)
用分治思想,计算序列1的计数(verilog),对于8bit的序列,仅需要7个full adder原创 2023-04-08 22:15:10 · 2887 阅读 · 1 评论 -
用移位寄存器实现同步FIFO,带空满判断
如图所示,同步FIFO带有push信号和pop信号,push代表往队列里面压入一个数据,pop代表往队列外面排出一个数据。原创 2023-04-06 12:39:42 · 2809 阅读 · 2 评论 -
找到序列最高位的1和最高位的0并输出位置
前言:该题为睿思芯科笔试题,笔试时长20分钟。原创 2023-04-05 20:30:03 · 2518 阅读 · 4 评论 -
斐波那契数列verilog实现
前言:该题为rsxk笔试题,笔试时长20分钟。原创 2023-04-05 17:24:41 · 2548 阅读 · 1 评论 -
扰码器原理详解及verilog实现
扰码就是对原始的用户数据进行扰乱,得到随机化的用户数据。连续扰码两次就能得到原始数据,通常是发送电路在发送数据时先对数据进行随机扰乱,接收电路使用相同的扰乱算法就可以重新恢复出原始的数据。原创 2023-03-31 11:27:34 · 4885 阅读 · 2 评论 -
不用循环和分治,仅用“按位”操作,找到序列第一个1和最后一个1
找到序列第一个1,找到序列最后一个1。波形原创 2023-03-29 16:46:28 · 1607 阅读 · 0 评论 -
round robin arbiter 轮询仲裁器设计
前言仲裁器Arbiter是数字设计中非常常见的模块,应用也非常广泛。定义就是当有两个或两个以上的模块需要占用同一个资源的时候,我们需要由仲裁器arbiter来决定哪一个模块来占有这个资源。一般来说,提出占有资源的模块要产生一个请求(request),所有的请求送给仲裁器之后,仲裁器要返回一个许可(grant)。原创 2023-03-25 19:23:43 · 2855 阅读 · 0 评论 -
固定优先级仲裁器设计
前言仲裁器Arbiter是数字设计中非常常见的模块,应用也非常广泛。定义就是当有两个或两个以上的模块需要占用同一个资源的时候,我们需要由仲裁器arbiter来决定哪一个模块来占有这个资源。一般来说,提出占有资源的模块要产生一个请求(request),所有的请求送给仲裁器之后,仲裁器要返回一个许可(grant)。固定优先级仲裁器(fixed priority)固定优先级,每个模块的优先级是固定的,是提前分配好的,如果有两个模块同时产生request,那么优先级高的模块可以获得grant。原创 2023-03-25 16:00:57 · 1359 阅读 · 3 评论 -
数字IC手撕代码--芯源(三分频)
设计两个三分频时钟clk1和clk2,占空比分别为1/3和2/3,一个下降沿触发,一个上升沿触发,两个时钟相与得到占空比50%的三分频。用Verilog设计一个3分频器,要求50%占空比。波形结果是一个占空比50%的三分频。更多手撕代码题可以前往。原创 2023-03-20 15:41:22 · 939 阅读 · 2 评论 -
数字IC手撕代码--联发科(总线访问仲裁)
在tb里,先分别让A、B各请求总线一次,然后让他们出现请求冲突8次,最后再让A、B分别请求总线两次,从图中可以看到,在A、B请求冲突的时候,A_grant、B_grant拿到总线的比例是3:1,我们在module定义开头给了两个parameter,定义了A_grant、B_grant拿到总线的比例A_ratio和B_ratio,如果要修改模块代码,修改module传入的parameter的值即可。只有在冲突时,AB冲突响应比为3:1。计数器=0,1,2时响应A,计数器=3时响应B,于此同时将计数器置0。原创 2023-03-03 16:43:21 · 6062 阅读 · 5 评论 -
低功耗设计 Clock Gating
芯片功耗组成中,有高达 40%甚至更多是由时钟树消耗掉的。这个结果的原因也很直观,因为这些时钟树在系统中具有最高的切换频率,而且有很多时钟 buffer,而且为了最小化时钟延时,它们通常具有很高的驱动强度。那么减少时钟网络的功耗消耗,最直接的办法就是如果不需要时钟的时候,就把时钟关掉。这种方法就是大家熟悉的门控时钟:clock gating。如果让我们设计一个门控时钟的电路,我们会怎么设计呢?最直接的方法,不需要时钟的时。原创 2023-03-02 00:35:14 · 2787 阅读 · 0 评论 -
数字IC手撕代码--小米科技(除法器设计)
..持续更新更多手撕代码题可以前往。原创 2023-02-27 00:57:03 · 6647 阅读 · 0 评论 -
数字IC手撕代码--乐鑫科技(次小值与次小值出现的次数)
..持续更新更多手撕代码题可以前往。原创 2023-02-25 20:49:11 · 3844 阅读 · 1 评论 -
APB总线详解及手撕代码
APB总线端口如下:大体可以分为以下三组:系统信号:PCLK(系统时钟)、PRESETn(系统复位,低有效)master信号:PADDR(地址信号,确定读写的地址)、PSELx(片选信号,拉出来接给搭载APB总线的slave,选中slave时,PSELx信号拉高)、PNEABLE(使能信号,在PSELx拉高一个周期后,必定拉高)、PWRITE(写使能信号,PWRITE为高时写有效为低时读有效)、PWDATA(写数据)slave信号。原创 2023-02-21 11:32:10 · 7314 阅读 · 1 评论 -
数字IC手撕代码-同步FIFO
在设计系统时,会包含工作在不同时钟频率下的元件,例如处理器和外设。数据在这些元件之间传输时先进先出(FIFO first in first out)阵列起到了重要作用。FIFO是用于对在通信总线上传输的数据进行排列的简单存储结构。 因此,FIFO常用来传输跨不同时钟域的数据。 本节介绍简单的同步FIFO架构,读写使用同样的时钟,为我们后续写异步FIFO(读写时钟非同源)做铺垫。原创 2022-12-05 18:29:07 · 2004 阅读 · 3 评论 -
数字IC手撕代码-XX公司笔试真题(串并转换控制)
将数据进行串转并处理,输入 3780 个串行比特,每个数据占一个时钟周期,输入共占 3780 个时钟,要求并行输出 63 个 bit,共 60 个时钟输出完.其时序示意图如下: 第 1 个时钟并行输出 0,60,…,3720,做为 bus 整体输出 第 2 个时钟并行输出 1,61,…3721 第 60 个时钟并行输出 59,119,…3779 注意每次并行输出仅占一个时钟周期,60 个时钟周期便输出完. 输出与输入的相对时延关系任意即可。原创 2022-11-17 14:51:57 · 1269 阅读 · 8 评论 -
数字IC手撕代码-XX公司笔试真题(数据流pipeline加和)
输入为 i0,i1,i2,…,i253,i254,….占 1 个时钟周期, 输出 sum0 为 i0 +i2+….+i254 的加和值(隔点相加), sum1 为 i1+i3+….+i255,sum2 为 i2+i4+….+i256,如此下去,每个输出占一个时钟周期 Sum0 和 i0 的相对延时关系任意即可。假设输入 i0,i1,i254,…为 8 比特值, 输出 sum 请选择认为不会损失精度且合适的位宽,并用你认为的最省资源的方式用 verilog 语言实现上述要求。原创 2022-11-13 22:03:17 · 1637 阅读 · 5 评论 -
数字IC手撕代码-XX公司笔试真题(数据流最大值)
已知一段数据流 data 输入,在 datain_ena 为高时有效时,请将这段数据流的最大次大值 选出,在一段 datain_ena 结束之后给出相应的结果 max,submax 和结果使能 dataout_ena。原创 2022-11-13 19:44:30 · 803 阅读 · 1 评论 -
数字IC手撕代码-XX公司笔试真题(交织器/矩阵转置)
用 HDL 语言按照节省芯片面积的方式实现交织器,假定输入的数据 datain 顺序为 1、2、 3、…63,输入使能为 datain_ena,经交织器后输出的顺序要求为 1、10、19、28、37、 46、55、2、11、…即行列交织,按行的顺序进按列的顺序出,输入输出数据均按时钟沿变化。实现时可自己 定义 ram 使用。原创 2022-11-13 18:06:05 · 1150 阅读 · 2 评论 -
数字IC手撕代码-XX公司笔试真题(脉冲密度调制)
使用HDL实现脉冲密度调制(PDM),即根据输入12bit pdm_in,按下列要求输出不同占空比的方波: ① 当pdm_in>10,pdm_out即输出的波形占空比为4/pdm_in; ② 当pdm_in原创 2022-11-13 16:53:37 · 1293 阅读 · 2 评论 -
数字IC手撕代码-双端口RAM(dual-port-RAM)
这篇文章来介绍双端口RAM,目的是为后续的同步FIFO和异步FIFO打下基础,我们都知道其实FIFO就类似一个RAM,但是它对输入输出的信号做了处理,可以使得数据在跨时钟域的时候不会出错。一个伪双端口RAM,一个通道读,一个通道写,写通道有写数据、写地址和写使能,读通道有读数据、读地址和读使能,再加上输入时钟,构成输入输出的端口。对真双端口RAM的一个通道来说,当通道使能时,如果写使能,则把值写入到RAM的addra地址,过一个周期后,改地址被写入新的值,新的值被读出,所以有data_o_a/b有数据。原创 2022-10-02 23:28:07 · 2595 阅读 · 1 评论 -
数字IC手撕代码-乐鑫科技笔试真题(4倍频)
乐鑫科技考了好几次四倍频了,输入一个clk,要求输出一个clk_out,满足clk_out的频率是clk的四倍。原创 2022-10-02 23:02:11 · 1992 阅读 · 7 评论 -
数字IC手撕代码-兆易创新笔试真题
这样做的原理其实就是延长pulse的宽度,让pulse能够被clk采样,接着再利用双边沿检测的方法(打两拍取异或,edge_dect = Q2 ^ Q3)得到clk域的pulse,再对其进行计数即可。现有一时钟周期为20ns的时钟,他们的关系如下图所示,请写出计算该脉冲个数的verilog代码。ps:如果有人有更好的方案相邻1ns的两个5ns pulse都能检测到的话,可以在评论区讲解自己的方法。约束:这种方法使用的前提是相邻两个pulse之间的距离要大于clk一个时钟周期,否则会出现漏采样的现象。原创 2022-10-02 22:53:57 · 2018 阅读 · 8 评论 -
数字IC手撕代码-平头哥技术终面手撕真题
平头哥的手撕代码很有意思,平头哥技术终面手撕真题,题目描述如下:输入clk,每个时钟输入1比特的data_in,然后进来之后的序列是每次左移,也就是如果第一个时钟data_in=1,第二个时钟datain=0,第三个时钟data_in=1;则data_temp=101;然后data_out是在data_temp可以整除3的时候,输出1,其他时刻输出0;这道题乍一看,好像是什么移位寄存器的题,似乎不难;但实有点难度,涉及到一些数学的推导,下面我们来分析一下。首先,要声明的一点,这道题只能用写,为什么?原创 2022-10-02 22:45:37 · 3375 阅读 · 3 评论 -
数字IC手撕代码-泰凌微笔试真题
以上是泰凌微公司的笔试真题,手撕一个代码,题目描述如下:假设每个clock cycle输入是一个3-bit数据信号,现在需要按次序整形成5-bit数据信号输出,并给出valid信号。其中LSB First,请用Verilog/VHDL给出代码。该题目,仔细阅读就会发现,序列都是同一条序列,分割方式不同;说白了其实就是一个位宽转换题,然后加握手信号。实现一个含握手的3-5bit的位宽转换模块。这个题目,华子也考过类似的,或者说很多公司爱考这玩意。下面解释下,题目中出现的概念。原创 2022-10-02 22:40:04 · 1773 阅读 · 7 评论 -
数字IC手撕代码-流水握手(利用握手解决流水线断流、反压问题)
看看在不同状态下,流水线是否会出现数据传输错误或者数据丢失的情况。把整个模块包装成一个module后,我们这个就相当于一个流水处理一段长延时组合逻辑的IP。对于我们这个IP来说,valid_i和ready_o同时为高时,数据有效,即a2\b2=2,3,6时数据是有效的,一开始数据有效了两拍,分别是2和3,过了三拍后,数据输出valid_o拉高两拍,因为ready_i为1,所以下游可以接收数据,所以valid_o拉高两周期把输出的数据传完后就拉低了。输入数据有效两周期后,原创 2022-10-02 22:01:59 · 4781 阅读 · 8 评论 -
数字IC手撕代码-握手信号(READY-VALID)
握手信号,就是为了模块之间的数据交互正确才衍生出来的信号。其无非就是三种可能当我第一次接触握手信号的时候,其实是很清楚上面的三条握手原则的,但是具体的,master和slave之间的握手信号该怎么写代码却迷迷糊糊。就利用这篇文章简单的讲一下master和slave之间是怎么通过握手信号来解决数据交互问题的。同时也为下一篇文章《》打下基础。下一篇文章会讲解好,回到本篇文章来。对于master来说,master发出一个数据,如果,master就会把传送给slave的,即告诉slave数据有效可以接收!原创 2022-10-01 21:15:39 · 6398 阅读 · 22 评论 -
数字IC手撕代码-有限状态机FSM-饮料机
有限状态机(Finite state machine)是为研究有限内存的计算过程和某些语言类而抽象出的一种。有限状态自动机拥有,每个状态可以迁移到零个或多个状态,输入字串决定执行哪个状态的迁移。有限状态自动机可以表示为一个有向图,也就是我们常说的在写FSM之前要先画。原创 2022-10-01 20:50:42 · 1721 阅读 · 0 评论 -
数字IC手撕代码-数据位宽转换器(宽-窄,窄-宽转换)
数据位宽转换器,一般常用于模块接口处,比如一个电路模块的输出数据位宽大于另一个模块的输入数据位宽,此时就需要进行数据位宽转换。比如SATA控制器中,内部数据位宽为32bit,但外部物理收发器PHY的接口通常为16bit,或者8bit,在不使用FIFO进行缓存的情况下,可以使用数据位宽转换器,在clk2的上升沿,我们读入32bit数据,在clk2x的上升沿我们输出16bit数据,由于clk1的频率是clk2的两倍,我们假设一个原时钟clk1,通过二分频,把原时钟变为时钟clk2,原创 2022-10-01 19:24:49 · 2658 阅读 · 4 评论 -
数字IC手撕代码-串转并、并转串
串转并的使用环境非常多,在接口处用到最多,在某些模块的输入仅允许串行输入时,而总线上的数时并行的,那就需要通过串并转换,把并行的数据转换成串行的数据,包括在输出的时候,需要把串行的数据转换成并行的数据,才能送到总线中,使用方法都是用一个计数器来计数实现。由此我们就实现了串并转换,其中valid信号表示有效信号,当输入有效的时候,输入的valid信号就拉高,输出有效的时候,输出valid就拉高,这有利于我们看波形,同时也有利于模块和外部通信。原创 2022-09-29 20:55:49 · 2827 阅读 · 3 评论 -
数字IC手撕代码-半加器、全加器
门电路其实很好画,知道了信号之间的与非关系,就很好处理了,比如半加器的cout就是A和B的与,直接用一个两输入与门就能连接。而sum是A和B的异或,用一个异或门就可以得到,当然也不排除公司故意不让你用异或门的情况。这个不要背表达式,如果背表达式,正式手撕代码的时候很容易忘记,然后写错(虽然全加器很简单。)我们推导一下表达式。全加器的门电路就不画了,原理和半加器是一致的,信号有点多容易弄混,所以画的时候细心一点,就没什么问题。cout的值也好分析,cout是加和出来的进位,也就是说,原创 2022-09-28 16:50:29 · 1901 阅读 · 0 评论 -
数字IC手撕代码-序列检测(移位寄存器写法)
一说到序列检测,你脑子里要立马跳出两种解法,一种是状态机写法, 一种是移位寄存器写法,看过一个面经,面试官让手撕一个 五位01序列的序列检测,作者用状态机写的,写完被批评代码太复杂,再写一个简单的方法(也即移位寄存器方法)最后没写出来。移位寄存器写法的序列检测,会比状态机写法的简单很多,只需要给一组寄存器,用来存储输入数据,再和指定序列比较就行了。,如果连续来的八个信号正好是我们要检测的序列1100_1101,那么data里存的就是这个信号,判断data就和我们要检测的信号相等。具体代码很简单,代码如下。原创 2022-09-28 10:31:16 · 2163 阅读 · 0 评论 -
数字IC手撕代码-序列检测(状态机写法)
一说到序列检测,你脑子里要立马跳出两种解法,一种是状态机写法, 一种是移位寄存器写法,看过一个面经,面试官让手撕一个 五位01序列的序列检测,作者用状态机写的,写完被批评代码太复杂,再写一个简单的方法(也即移位寄存器方法)最后没写出来。虽然第二种方法更简单更好用,但是我们两种方法都得会。序列检测有什么用?如果让你实现一个电子锁,输入密码,密码正确就开,密码错误就不开,你会如何写代码?用if-else嵌套嘛,如果第一个数对了,再去判断第二个数,完了再判断第三个数,判断第四个。原创 2022-09-28 10:28:27 · 2270 阅读 · 0 评论 -
数字IC手撕代码-格雷码的编码与解码
格雷码的主要特点是相邻编码值中只有一个比特发生改变,如下表所示。从表中可以看到,相邻编码值中只有一个比特发生改变,那么这个特性有什么用呢?这非常重要!当今格雷码被广泛应用于 使用两个不同时钟的异步FIFO(First In First Out,先入先出存储器)中。当数值从一个时钟域传递到另一个时钟域时,单比特翻转的特性就会变得极为重要。在异步FIFO中,写地址和度地址是根据读写操作,发生连续的改变,其地址是用二进制计数器进行表示的。以4比特计数器为例,该计数器从0计数,数到15,到达15后归零。原创 2022-09-28 09:45:55 · 904 阅读 · 0 评论 -
数字IC手撕代码-异步复位同步释放
当异步复位信号到来时,寄存器 reg_1 会被直接拉低,这是不会产生问题的,当rstn下降沿和clk上升沿同时到来时,如果rstn比clk先到来一瞬间,且原来的reg_1信号为1,reg_1会被拉低为0,后一瞬间,clk来了,因为前一瞬间的reg_1值被拉低了,所以在clk到来时,一定有set_up不满足要求...总结:异步复位为0 的时候不做处理,当rstn从0变1的时候,打两拍随clk同步拉高,此时寄存器输入的D已经稳定很长时间,可以避免亚稳态的发生。这八个字包含两个步骤,异步复位,同步释放。原创 2022-09-27 16:39:57 · 2082 阅读 · 0 评论 -
数字IC手撕代码-边沿检测(上升沿、下降沿、双边沿)
在使用FIFO进行数据读写的时候,我们会用到边沿检测,比如当FIFO内的数据被读空了,这样 empty 信号就会从0→1,产生一个上升沿,当这个上升沿到来的时候代表FIFO内孔,我们就可以对FIFO进行一个写操作(把写使能拉高,往FIFO写数据),所以边沿检测是十分常用的东西,下面我们来讲讲边沿检测的原理、代码以及对应仿真。比如我们要检测信号 signal 的上升沿,我们使用两个寄存器,级联记录 signal 的值,这样由于寄存器延迟一拍的特性,第二个寄存器永远会延迟第一个寄存器。结果和我们设计的一致。原创 2022-09-27 16:25:40 · 2730 阅读 · 3 评论 -
数字IC手撕代码-分频器(任意小数分频)
分频就是生成一个新时钟,该新时钟的频率是原有时钟频率的整数分之一倍,新周期是原有周期的整数倍。再简单来说,让你手撕一个四分频电路,就是写代码生成一个周期是原来四倍的时钟,如果手撕一个三分频电路,就是写代码生成一个周期是原来三倍的时钟。如上图所示,就是一个四分频电路的波形,四分频后,新的clk_out的频率是原来的1/4,也即周期是原来的4倍,从图中可以看到,clk每过4个周期,clk_out过1个周期。原创 2022-09-27 15:18:50 · 2050 阅读 · 0 评论 -
数字IC手撕代码-分频器(任意奇数分频)
分频就是生成一个新时钟,该新时钟的频率是原有时钟频率的整数分之一倍,新周期是原有周期的整数倍。再简单来说,让你手撕一个四分频电路,就是写代码生成一个周期是原来四倍的时钟,如果手撕一个三分频电路,就是写代码生成一个周期是原来三倍的时钟。如上图所示,就是一个四分频电路的波形,四分频后,新的clk_out的频率是原来的1/4,也即周期是原来的4倍,从图中可以看到,clk每过4个周期,clk_out过1个周期。原创 2022-09-27 15:08:59 · 3164 阅读 · 2 评论 -
数字IC手撕代码-分频器(任意偶数分频)
分频就是生成一个新时钟,该新时钟的频率是原有时钟频率的整数分之一倍,新周期是原有周期的整数倍。再简单来说,让你手撕一个四分频电路,就是写代码生成一个周期是原来四倍的时钟,如果手撕一个三分频电路,就是写代码生成一个周期是原来三倍的时钟。如上图所示,就是一个四分频电路的波形,四分频后,新的clk_out的频率是原来的1/4,也即周期是原来的4倍,从图中可以看到,clk每过4个周期,clk_out过1个周期。同理三分频也一样,但是奇数分频会比偶数分频复杂一些,在奇数分频部分会讲。原创 2022-09-27 15:00:48 · 3649 阅读 · 2 评论