数字IC设计
文章平均质量分 63
记录数字IC设计相关知识,适用于对数字IC设计/FPGA开发感兴趣的读者,也可以用于备战秋招笔试面试
FPGA硅农
数字IC设计,FPGA开发
展开
-
【数字IC/FPGA】使用Verdi对比两个波形
新建容器,依次点击Window --> Dock to --> New Container Window。至此,我们可以看到两个波形被放入了同一个容器,下图中,右下角的分栏符号可以进一步调整窗口的布局。然后在该容器内通过【Tools】 —> 【New WaveForm…然后依次点击【Window】 —> 【Dock to】,选择之前创建的新的容器cmp。如此操作,就可以实现在左边窗口中点击不同的时间,右边的波形也会有同步的变化。在另一个波形窗口加载信号,就可以进行比较了,如下图所示。原创 2024-07-27 13:50:27 · 543 阅读 · 2 评论 -
【数字IC设计/FPGA】FIFO与流控机制
简单来说就是控制数据流停止发送。常见的流控机制分为带内流控和带外流控。原创 2023-10-21 18:35:07 · 1389 阅读 · 1 评论 -
【数字IC设计】VCS门级网表仿真
本文参考自。除了RTL仿真以外,在IC设计过程中还会进行门级网表的仿真。当设计代码功能仿真通过之后,我们便使用Design Compiler工具对其进行逻辑综合,将RTL代码转化为由与、或、非等门电路和触发器组成的电路,称为门级网表(netlist)。门级网表中包含了电路的实际信息,例如逻辑门单元的扇入扇出系数,延迟等等。对门级网表进行仿真可以发现由于引入这些实际信息所暴露出的错误,因此是必要的。本文以一个alu设计为例,演示门级网表仿真的流程。原创 2023-10-15 18:52:01 · 2489 阅读 · 2 评论 -
【数字IC设计】DC自动添加门控时钟
数字电路的工作动态功耗主要是由于带来的,为了降低芯片内部功耗,的方案应用而生。作为低功耗设计的一种方法,门控时钟是指。在下图中,展示了加入门控时钟前后电路的变化,由图可知,采取门控时钟技术后,。因此,插入门控时钟并不总是能带来面积上的收益,需要综合数据位宽来考虑。这里的决定因素就是D的,若D的位宽很小,那么可能插入的CG面积比原来的MUX大很多,而且节省的功耗又很少,得不偿失。只有当D的位宽超过了一定的bit数后,插入CG的收益才会比较大。关于这个临界值,不同的工艺可能不同,但是。原创 2023-10-14 10:59:03 · 1509 阅读 · 0 评论 -
Verdi实现信号的平移
在Verilog/System verilog中,可以实现延迟指定时间的功能,而在使用verdi查看信号波形并进行分析时,同样也可以实现类似的功能。:这种信号平移是有其应用场景的,例如,在某些仿真模型中,为了模拟实际的信号延迟,信号的实际跳变沿往往和时钟的上升沿不是完全对齐的,而是存在一定时间的错开,这样,在将该信号与clk相与时,就会出现毛刺,从而干扰后续的分析)下面,以时钟信号clk为例,展示verdi对信号进行的实现方法。原创 2023-09-16 10:45:31 · 1968 阅读 · 0 评论 -
【数字IC/FPGA】Verilog中的force和release
可以看到,第200-400ns,加法器实际的输入a和b被固定为33和66,其值不再与testbench中的a, b绑定。另外,图中的紫色三角形分别表示该信号被force和release的时刻,被force强制指定的值,在显示的时候,前面会有一个^符号,例如上图中的^如上所示,正常情况下,u_adder模块的a和b端口由testbench中的a和b信号驱动,然而,在时间为200ns处,u_adder模块的输入u_adder.a和u_adder.b被强制固定为33和66,如下代码所示。在Verilog中,将。原创 2023-09-09 14:49:44 · 3347 阅读 · 0 评论 -
约束综合中的逻辑互斥时钟(Logically Exclusive Clocks)
逻辑互斥时钟是指设计中活跃(activate)但不彼此影响的时钟。常见的情况是,两个时钟作为一个多路选择器的输入,并根据sel信号决定哪一个时钟被激活。一个处理逻辑互斥时钟的重要指导思想就是逻辑互斥时钟不应该在mux以外的地方发生交互。如上图所示,设计中共有两个时钟,分别是CLKA和CLKB,两个时钟是多路选择的,某一时刻,只有一个时钟对电路起作用。一种约束的方法是使用约束,即假定SEL恒为0或者1,然后进行时序分析。flop-1发起时钟flop-2捕获时钟CLKACLKACLKBCLKA。原创 2023-08-13 19:12:37 · 1002 阅读 · 0 评论 -
【数字IC设计】VCS仿真DesignWare IP
DesignWare是SoC/ASIC设计者最钟爱的设计IP库和验证IP库。它包括一个独立于工艺的、经验证的、可综合的虚拟微架构的元件集合,包括逻辑、算术、存储和专用元件系列,超过140个模块。DesignWare和 Design Compiler的结合可以极大地改进综合的结果,并缩短设计周期。原创 2023-07-30 15:17:00 · 4470 阅读 · 0 评论 -
Verdi分析有限状态机
该图给出了状态机的整体信息,包括输入、输出信号,时钟信号的名称及其极性,复位条件以及状态信号、初始状态和状态表。按住shift,选中S1, S11和S110三个状态,然后点击Tools–>Partial FSM。最后,点击FSM,选中State Animation,然后点击Analysis Report…为了简单起见,我们以一个序列检测器为例,介绍nState的使用过程。栏则给出了每一个状态在仿真中出现的次数。此时,会显示所勾选的三项的相关信息,如下图所示。用于有限状态机(FSM)。方框中的状态机,得到。原创 2023-07-15 14:30:00 · 1627 阅读 · 0 评论 -
VCS和Verdi联合仿真的Makefile脚本编写
命令生成filelist.f,该文件记录了所有参与仿真的RTL文件的路径,在上面的makefile脚本中,我们可以通过。makefile脚本编写如上图所示。则用于调用verdi工具显示波形,最后,命令用于对过程中所产生的文件进行清楚。是必要的,否则会报错,具体可参见文章。make verdi并添加波形。命令用于编译RTL代码,原创 2023-07-13 13:45:00 · 1261 阅读 · 0 评论 -
UVM仿真环境搭建
本实验使用环境为:Win10平台下的Modelsim SE-64 2019.2。原创 2023-02-25 20:30:30 · 2954 阅读 · 1 评论 -
【数字IC/FPGA】小数分频
由于Verilog只能在时钟的上升沿或者下降沿改变电路的状态,因此精确的小数分频是无法通过Verilog实现的,我们只能实现的小数分频,即某段时间内,该时钟的周期平均为TT为小数)。我们以8.6分频为例,来阐述小数分频的实现方法。T8.6对应于MN(即M8N6),另一方面,T也可以表示为TMabb将M通分至分母ab,则TMaM1bab这里我们发现组成小数分频使用了a个M分频和b个M1分频的整数分频电路。上述方法被称作”原创 2023-02-06 23:09:01 · 1978 阅读 · 0 评论 -
Verilog实现超前进位加法器
超前进位加法器原创 2023-02-01 12:03:38 · 2156 阅读 · 0 评论 -
【数字IC设计】Design Compiler入门
本博客演示DC综合的流程,适合小白入门。原创 2022-12-12 20:08:16 · 3191 阅读 · 0 评论 -
System Verilog断言
断言通常被称为序列监视器或者序列检验器,是对设计应当如何执行特定行为的描述,是一种嵌入设计检查。如果检查的属性(property)不是我们期望的表现,那么在我们期望事件序列的故障上会产生警告或者错误提示。断言用来检查模拟序列行为或者激励生成的正确性,断言作为功能验证的一种重要手段,可以脱离测试用例而覆盖测试点,所以断言覆盖率可以是功能覆盖率的一部分,完善的断言能为全面的功能覆盖率尺度打下良好的基础。断言两个重要的时间点:采样时刻和匹配时刻,断言在 preponed 域采样,在observed 域执行检查原创 2022-12-06 10:38:21 · 2805 阅读 · 1 评论 -
Verilog消除毛刺
当需要消除高电平的毛刺时,采用与门,当需要消除低电平的毛刺时,采用或门。若毛刺宽度介于N和N+1个周期,则需要N+2级触发器采样,然后再进行与(或)。原创 2022-09-03 11:33:21 · 6043 阅读 · 4 评论 -
ASIC和FPGA设计流程
ASIC和FPGA设计流程原创 2022-08-04 16:53:31 · 1344 阅读 · 0 评论 -
按键消抖的Verilog实现
当按键被按下时,由于机械开关的局限性,其对应的电平不会马上稳定,而是会在一段时间内发生抖动。为了正确的识别按键信息,我们必须进行按键消抖的处理。原创 2022-07-23 21:21:48 · 3026 阅读 · 0 评论 -
数字IC手撕代码--投票表决器
设计一个投票表决器,输入为一个5bit的向量,为1表示赞同,为0表示不赞同,当赞同人数大于非赞同人数时,表决器输出为1,否则为0。思路:一种方法是统计向量中1的个数,若大于等于3,则输出1,否则输出0。另一种方法是考虑所有可能的情况,事实上,只要有三个位的值为1,则表决器就输出1,因此可据此进行枚举(C53=10C_5^3=10C53=10),得到最终的结果。测试平台结果对于N输入的表决器(N为奇数),我们同样可以采用类似的方法:1.通过加法器求1的个数,若和大于(N-1)/2,则输出为12.原创 2022-07-01 15:48:11 · 676 阅读 · 0 评论 -
数字IC手撕代码--交通灯
要求实现一个交通红绿灯,具有红黄绿三个小指示灯和一个行人按钮,正常情况下,机动车道指示灯按照60时钟周期绿灯,5个时钟周期黄灯,10个时钟周期红灯循环。当行人按钮按下,如果剩余绿灯时间大于10个时钟,则缩短为10个时钟,小于10个时钟则保持不变。模块的信号接口图如下:请使用VerilogHDL语言实现,并编写testbench验证功能。设计测试平台结果正常情况下,绿灯60个周期,黄灯5个周期,红灯10个周期绿灯且大于10个周期的时候,行人按下绿灯且小于等于10个周期的时候,行人按下...原创 2022-06-28 15:41:35 · 725 阅读 · 0 评论 -
【数字IC/FPGA】检测最后一个匹配序列的位置
编写一个模块,输入一个64比特的比特流,识别匹配出101101的最后的位置,并输出位置信息。结果输入比特流为data={20’d0,12’b101101101101,32’d0},因此,最后匹配的序列的位置应该是20+6=26,符合预期。...原创 2022-06-26 10:48:35 · 341 阅读 · 0 评论 -
非整数倍数据位宽转换:8to12
实现数据位宽转换电路,实现8bit数据输入转换为12bit数据输出。其中,先到的数据应置于输出的高bit位。电路的接口如下图所示。valid_in用来指示数据输入data_in的有效性,valid_out用来指示数据输出data_out的有效性;clk是时钟信号;rst_n是异步复位信号。分析:8和12的最小公倍数为24,所以输入3个数据为一个周期(data_cnt)。第一个周期,输入8bit数据,当第二个周期数据来临时,取其高4位和第一个数据拼接,作为输出,而余下的4bit保留,第三个周期来临时,将原创 2022-06-13 10:02:27 · 948 阅读 · 0 评论 -
非整数倍数据位宽转换:24to128
实现数据位宽转换电路,实现24bit数据输入转换为128bit数据输出。其中,先到的数据应置于输出的高bit位。电路的接口如下图所示。valid_in用来指示数据输入data_in的有效性,valid_out用来指示数据输出data_out的有效性;clk是时钟信号;rst_n是异步复位信号。分析:我们设置一个128bit位宽的寄存器,每新来一个24bit的数据,都将该数据移入。则当前5个周期(0,1,2,3,4)结束后,已经移入24*5=120bit数据,在下一个数据到来时(data_cnt==5)原创 2022-06-13 09:56:45 · 690 阅读 · 0 评论 -
跨时钟域同步-结绳法
结绳法的主要思想是利用数据的边沿做时钟,将脉冲延长,直到采集到数据,然后复位。上图是结绳法的电路示意图,这里需要注意的是,clkB域需要等待三个clkB才会在最后一个寄存器输出并完成输入端的复位。所以如果Din_clkA变化较快,即持续时间小于三个clkB(Din_clkA的频率大于clkB的1/3),那么Din_clkA的变化将无法采样到。代码实现`timescale 1ns / 1ps///////////////////////////////////////////////////////.原创 2022-05-26 16:59:24 · 957 阅读 · 1 评论 -
数字IC面试手撕代码(十四)
题目描述设计一个自动贩售机,输入货币有三种,为0.5/1/2元,饮料价格是1.5元,要求进行找零,找零只会支付0.5元。注意rst为低电平复位,下面是该设计的相关信号及其含义:本题和文章最大的不同是,之前的文章采用米勒状态机进行设计,而本文则通过摩尔状态机进行设计。采用摩尔状态机时,状态数应该为S0_0:已投入0元S0_5:已投入0.5元S1_0:已投入1元S1_5:已投入1.5元S2_0:已投入2元S2_5:已投入2.5元S3_0:已投入3元(2+1=3)这里和米勒状态机最大的区别原创 2022-05-25 12:31:05 · 365 阅读 · 0 评论 -
数字IC面试手撕代码(十三)
题目设置一个计数器,从0开始计数,一直计数到3,然后回到1,根据计数器的值,来决定乘以多少,再设置一个valid信号,标志输入数据d有效,首先,复位时valid应该为1,其次,当计数器的值为3的时候,valid也应该为1,当valid为1时,我们还需要寄存输入数据d,即d_r<=d,同时拉高input_grant一个周期。代码module top( input logic clk, input logic rst, input logic [7:0] d, ou原创 2022-05-03 14:47:50 · 731 阅读 · 0 评论 -
数字IC面试手撕代码(十二)
题目输入一个01序列,当valid为高时输入比特有效,现已知输入序列中1的占比为1/2,对输入序列进行处理,使得输出序列中1的占比为1/4。(假设序列长度能被4整除)代码实现module top( input logic clk, input logic rst, input logic bit_in, input logic bit_valid, output logic bit_out, output logic bit_ovalid);logi原创 2022-05-03 14:16:21 · 743 阅读 · 0 评论 -
【FPGA/数字IC】UART、IIC和SPI总线介绍
UARTUART(通用异步接收发送器):也就是我们通常所说的串口,主要用于调试。UART的主机和从机,至少需要三根线,分别是RX,TX和GND,其中TX用于发送数据,RX用于接收数据,因此是全双工的UART协议也很简单,主要包括空闲位,起始位,数据位,奇偶校验位和停止位,空闲位为高电平,表示当前无数据传输,起始位为一个一位的低电平信号,数据位一般是5,6,7,8位,由双方事先约定好,然后是奇偶校验位,用于数据出错的检测,但由于出错的概率很小,因此现在一般都不需要,最后停止位是一位的高电平信号。SPI原创 2022-04-26 21:17:08 · 2912 阅读 · 2 评论 -
数字IC面试手撕代码(十一)
题目:设计一个序列发生器,它能产生如下序列:010110111011110111110111111…思路:设计两个状态S0,S1,以及两个计数器count和state_count,S0状态只持续一个周期,S1状态当且仅当state_count==count且当前状态为S1时跳转到S0,而state_count在状态为S1时递增,直到值等于count为止,因此count衡量了S1周期持续的长度,由上述序列的规律可知,count应该在每次S1状态结束时加1。代码module sequence_gen(原创 2022-04-17 21:41:21 · 1062 阅读 · 0 评论 -
数字IC面试手撕代码(十)
PWM可以实现波形周期和占空比的可调,有着广泛的应用。下面是实现的具体思路:设计一个计数器,该计数器从0开始计数,一直计数到pwm_cnt-1后,又回到0,这里,pwm_cnt其实就是分频数,用于调节输出波形的周期,此外,当计数器的值小于pwm_duty时,波形输出为1,否则为0(倒过来也可),可以看出,通过pwm_duty的调节,我们可以控制输出波形的占空比。代码module pwm( input logic clk, input logic rst, input logic原创 2022-04-17 18:38:04 · 581 阅读 · 0 评论 -
【数字IC/FPGA】时序约束--时序例外
多周期路径之前的时钟周期约束,我们都是按照一个周期来进行时序检查,也就是数据的发起沿和捕获沿差一个周期,如下图所示:默认情况下,保持时间的检查是以建立时间的检查为前提,即总是在建立时间的前一个时钟周期确定保持时间检查。如上图所示,数据在时刻1的边沿被发起,建立时间的检查是在时刻2进行,而保持时间的检查是在时刻1,因此保持时间的检查是在建立时间检查的前一个时钟沿。 但在实际的工程中,经常会碰到数据被发起后,由于路径过长或者逻辑延迟过长要经过多个时钟周期才能到达捕获寄存器。又或者在数据发起的几个周期后原创 2022-04-15 20:15:14 · 2006 阅读 · 0 评论 -
【数字IC/FPFA】时序约束--时钟约束
时钟周期约束,顾名思义,就是我们对时钟的周期进行约束,这个约束是我们用的最多的约束了,也是最重要的约束。下面我们以vivado中的时钟约束为例,介绍时钟约束的相关内容。Create_clock在Vivado中我们通过使用create_clock来创建时钟周期约束。使用方法如下:create_clock -name <name> -period <period> -waveform {<rise_time> <fall_time>} [get_ports原创 2022-04-09 20:04:01 · 7611 阅读 · 0 评论 -
数字IC/FPGA相关内容汇总
手撕代码手撕代码(一):找出最大值和次大值手撕代码(二):序列发生器手撕代码(三):自动售货机手撕代码(四):奇偶校验手撕代码(五):保留最高位的1手撕代码(六):实时求最大值和次大值手撕代码(七):判断是否为3的倍数手撕代码(八):无符号整数除法手撕代码(九):数据包检测数字IC设计/FPGA基础知识建立时间和保持时间两级DFF同步格雷码异步复位同步释放同步FIFO设计与实现(一)同步FIFO设计与实现(二)异步FIFO的设计与实现跨时钟域–握手状态机实现序列检测器原创 2022-04-07 15:56:52 · 824 阅读 · 0 评论 -
【数字IC/FPGA】时序约束--IO约束
本文介绍输出输出路径的时序约束。约束输入路径如图所示,触发器UFF0在设计的外部,并向设计内部的触发器UFF1提供数据。数据通过输入端口INP1连接两个触发器。为了对触发器DFF1的建立时间和保持时间进行约束,则工具必须要知道位于FPGA外部的延迟信息。set input delay指令的作用就是告诉工具FPGA外部的延迟信号。我们首先列出数据的到达时间:Data Arrival Time=launch edge+Tclk2q+Tc1Data \;Arrival \;Time=launch\原创 2022-04-07 14:10:18 · 1556 阅读 · 0 评论 -
【数字IC/FPGA】基本门电路
MOS管MOS管分为NMOS管和PMOS管,NMOS管和PMOS管有分别分为耗尽型的和增强型的,如下图:增强型NMOS管增强型PMOS管注意VGS(TH)为负数V_{GS}(TH)为负数VGS(TH)为负数耗尽型NMOS管注意VGS(OFF)V_{GS}(OFF)VGS(OFF)为负数耗尽型PMOS管注意VGS(OFF)V_{GS}(OFF)VGS(OFF)为正数COMS反相器结构如上图所示,CMOS反相器由一个增强型NMOS管和增强型PMOS管构成,栅端(G)原创 2022-03-30 17:24:05 · 2012 阅读 · 0 评论 -
【数字IC/FPGA】占空比50%任意整数分频
在之前的一篇博客中,我们讨论了如何实现偶数分频和奇数分频,但是并没有考虑占空比是否为50%,本文的目标是实现任意整数分频,且占空比为50%。具体的方法如下:偶数分频时设计一个计数器,从0计到N-1,然后又回到0,信号在计数器等于N/2-1(=(N-1)/2)和N-1的时候翻转。该信号即为占空比为50%的分频时钟。奇数分频时设计两个计数器cnt_p和cnt_n,分别在时钟的上升沿和下降沿改变,并且计数范围为0-N-1,同时设计两个信号clk_p和clk_n,clk_p在时钟上升沿改变,clk_n在下原创 2022-03-23 15:31:29 · 1890 阅读 · 2 评论 -
【数字IC/FPGA】移位相加乘法器
在硬件设计中,乘法器是非常重要的一个器件,乘法器的种类繁多,常见的有并行乘法器、移位相加乘法器和查找表乘法器,并行乘法器的实现非常简单,在Verilog中只需要通过assign dout=a*b实现即可,若要进行有符号的乘法,只需在变量前加上$signed。查找表乘法器实际上是先将乘法的计算结果提前算好,这样就可以在计算时通过查表的方式直接得到结果,一般用于位宽较小的情况。移位相加乘法器是一种耗费较少资源的算法,其思想是将乘法转化为加法和移位运算,不足之处是计算过程的延时较长,一般用于对性能要求不高的场合。原创 2022-03-23 13:39:38 · 6340 阅读 · 1 评论 -
【数字IC设计/FPGA】推挽输出和开漏输出
推挽输出如上图所示,在MOS管构成的推挽输出中,只有一个mos管会导通:当PMOS管导通时,输出为高电平,当NMOS管导通时,输出为低电平。下图则是三极管构成的推挽输出结构:当输出控制端为高电平时,NPN管导通,输出为高电平;当输出控制端为低电平时,PNP管导通,输出为低电平。推挽输出的优点1.输出的高低电平和电源电压基本没有压差。2.高低电平的驱动能力强。3.电平切换速度快。缺点:不支持线与。这里线与的意思为:两个输出端(包括两个以上)直接互连就可以实现“AND”的逻辑功能。如图原创 2022-03-22 17:01:17 · 5990 阅读 · 0 评论 -
数字IC面试手撕代码(九)
题目正常情况下,数据包由起始码(16bit)、数据段(n字节,n<256)、**结束码(16bit)**三部分构成。起始码为0xFF00,结束码为0xFF01。在一个完整的数据包中,数据段部分不会出现起始码和结束码。请设计一个电路,在码流中检测完整且有效的数据包,并输出当前数据包的有效长度n。分析一个完整的数据包,需要满足两个要求,第一个是长度小于256,另一个是数据包中不能出现起始码和结束码。因此,我们需要设置一个2bit的error信号,当它取01时,表示在数据包中检测到起始码,发生错误,当原创 2022-03-22 13:36:57 · 1197 阅读 · 2 评论 -
【数字IC/FPGA】电平同步、脉冲同步、边沿同步
电平同步电平同步一般用于由慢时钟域向快时钟域传输单bit信号,具体方法也很简单,就是打两拍。如上图所示,慢时钟域CLOCK1的单bit信号经过慢时钟打一拍后(这很重要),输出到快时钟域,快时钟域通过DFF打两拍,得到同步后的单bit信号。核心代码logic a_ff1;logic a_ff2;always@(posedge clkb,negedge rst_n)if(~rst_n) {a_ff2,a_ff1}<=2'b00;else {a_ff2,a_ff1}<原创 2022-03-20 21:42:13 · 3650 阅读 · 1 评论