一、前言
本系列旨在提供100%准确的数字IC设计/验证手撕代码环节的题目,原理,RTL设计,Testbench和参考仿真波形,每篇文章的内容都经过仿真核对。快速导航链接如下:
1.奇数分频
2.偶数分频
3.半整数分批
4.小数/分数分频
5.序列检测器
6.模三检测器
7.饮料机
8.异步复位,同步释放
9.边沿检测(上升沿,下降沿,双边沿)
10.全加器,半加器
11.格雷码转二进制
12.单bit跨时钟域(打两拍,边沿同步,脉冲同步)
13.奇偶校验
14.伪随机数生成器[线性反馈移位寄存器]
15.同步FIFO
16.无毛刺时钟切换电路
应当说,手撕代码环节是面试流程中既重要又简单的一个环节,跟软件类的岗位相比起来,数字IC的手撕代码题目固定,数量有限,属于整个面试中必得分的一个环节,在这个系列以外,笔者同样推荐数字IC求职者使用“HdlBits”进行代码的训练
链接如下
HDLBits — Verilog Practice
二、异步复位同步释放题目
使用Verilog代码,完成异步复位同步释放电路的设计
三、异步复位同步释放的原理
一个带异步复位端DFF的工作流程
假如一个DFF的复位值是0,那么rst_n=0的信号到来时,该DFF进行复位,当rst_n=1的信号到来时,该DFF正常工作。
可能出现的问题
当rst_n的信号重新回到1的时间和clk上升沿到来的信号非常接近的时候,DFF可能会输出亚稳态,造成信号无法识别是1还是0
解决办法
异步复位:对为0的复位信号不做处理,让其正常异步复位
同步释放:对为1的复位信号打两拍,使其拉高时对齐时钟边沿,以此来避免亚稳态的发生
异步复位同步释放的时序图
四、RTL设计
module rst_asy(clk,rst_n,rst_out); input clk; input rst_n; output reg rst_out; reg rst_r1; always@(posedge clk or negedge rst_n) if(!rst_n) begin rst_out<= 1'b0; rst_r1 <= 1'b0; end else begin rst_r1 <= rst_n; rst_out <= rst_r1; end endmodule
五、Testbench代码
`timescale 1ns /1ps module rst_asy_tb(); reg clk ; reg rst_n; wire rst_out; rst_asy u1(.clk(clk),.rst_n(rst_n),.rst_out(rst_out)); always #5 clk = !clk; initial begin clk = 0; rst_n = 1; #7 rst_n = 0; #5 rst_n = 1; #30 $stop; end endmodule
六、仿真分析
rst_n重新拉高后,rst_out等了被寄存器存了两次才输出,避免了亚稳态的发生,设计成立