【数字IC手撕代码】Verilog异步复位同步释放|题目|原理|设计|仿真

芯片设计验证社区·芯片爱好者聚集地·硬件相关讨论社区·数字verifier星球
四社区联合力荐!近500篇数字IC精品文章收录
【数字IC精品文章收录】学习路线·基础知识·总线·脚本语言·芯片求职·EDA工具·低功耗设计Verilog·STA·设计·验证·FPGA·架构·AMBA·书籍

在这里插入图片描述

一、前言

本系列旨在提供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

解决办法

扫描二维码关注公众号,回复: 14406005 查看本文章

异步复位:对为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等了被寄存器存了两次才输出,避免了亚稳态的发生,设计成立

猜你喜欢

转载自blog.csdn.net/weixin_43698385/article/details/122909393
今日推荐