HDLBits答案(10)_D触发器、同步与异步复位、脉冲边沿检测
D触发器、同步与异步复位、脉冲边沿检测
HDLBits链接
D触发器
定义:
D触发器是一个具有记忆功能的,具有两个稳定状态的信息存储器件,触发器具有两个稳定状态,即"0"和"1",在一定的外界信号作用下,可以从一个稳定状态翻转到另一个稳定状态。在这里解释边沿触发的D触发器,D触发器在时钟脉冲CP的前沿(正跳变0→1)发生翻转,触发器的次态(下一个状态)取决于CP的脉冲上升沿到来之前D端的状态,即次态Q=D。因此,它具有置0、置1两种功能。由于在CP=1期间电路具有维持阻塞作用(即触发器的输出不变),所以在CP=1期间,D端的数据状态变化,不会影响触发器的输出状态,故边沿D触发器受干扰的可能性就降低了。
功能表:
D | CLK | Q | QN |
---|---|---|---|
0 | 时钟上升沿 | 0 | 1 |
1 | 时钟上升沿 | 1 | 0 |
× | 0 | last Q | last QN |
× | 1 | last Q | last QN |
同步复位与异步复位
同步复位:
顾名思义,同步复位就是指复位信号只有在时钟上升沿到来时,才能有效。否则,无法完成对系统的复位工作。用Verilog描述如下:
always @ (posedge clk) beginif (!Rst_n)...
end
异步复位:
指无论时钟沿是否到来,只要复位信号有效,就对系统进行复位。用Verilog描述如下:
always @ (posedge clk or negedge Rst_n) beginif (!Rst_n)...
end
D触发器巩固练习
题目描述1:
创建一个D触发器。
Solution1:
module top_module (input clk, input d,output reg q );always @(posedge clk) beginq <= d;endendmodule
[David说]:时序的always块常使用非阻塞赋值。
题目描述2:
创建8个D触发器,每个都由时钟的上升沿触发。
Solution2:
module top_module (input clk,input [7:0] d,output [7:0] q
);always @(posedge clk) beginq <= d;endendmodule
题目描述3:
创建8个d触发器与主动高同步复位。所有D触发器由clk的上升沿触发。
Solution3:
module top_module (input clk,input reset, // Synchronous resetinput [7:0] d,output [7:0] q
);always @(posedge clk) beginif(!reset)q <= d;elseq <=8'd0;endendmodule
题目描述4:
创建8个D触发器与主动高同步复位。触发器必须被重置为0x34,而不是0。所有D触发器应由clk的下降沿触发。
Solution4:
module top_module (input clk,input reset,input [7:0] d,output [7:0] q
);always @(negedge clk) beginif(!reset)q <= d;elseq <= 8'h0x34;endendmodule
题目描述5:
创建8个D触发器与主动高异步复位。所有D触发器应由clk的上升沿触发。
Solution5:
module top_module (input clk,input areset, // active high asynchronous resetinput [7:0] d,output [7:0] q
);always @(posedge clk or posedge areset) beginif(areset) beginq <= 8'd0;endelse beginq <= d;endendendmodule
[David说]:使用posedge areset
时,只能使用if(areset)
首先进行判断而不能用if(!areset)
,否则会报错。
题目描述6:
创建一个16D触发器,有时我们仅需要修改部分触发器中的值。字节使能信号控制当前时钟周期中16个寄存器中哪个字节需被修改。byteena[1]
控制高字节d[15:8]
,而byteena[0]
控制低字节d[7:0]。
resetn
是一个同步,低复位信号。
所有的D触发器由时钟的上升沿触发。
Solution6:
module top_module (input clk,input resetn,input [1:0] byteena,input [15:0] d,output [15:0] q
);always @(posedge clk) beginif(resetn) beginif(byteena[1])q[15:8] <= d[15:8];elseq[15:8] <= q[15:8];if(byteena[0])q[7:0] <= d[7:0];elseq[7:0] <= q[7:0];endelse beginq <= 16'd0;endendendmodule
题目描述7:
实现下面的电路(锁存器)
Solution7:
module top_module (input d, input ena,output q);always@(*)beginif(ena)beginq = d;endendendmodule
题目描述8:
实现下面的电路
Solution8:
module top_module (input clk,input d, input ar, // asynchronous resetoutput q);always @(posedge clk or posedge ar) beginif(ar) beginq<=1'b0;endelse beginq<=d;endendendmodule
题目描述9:
实现下面的电路
Solution9:
module top_module (input clk,input d, input r, // synchronous resetoutput q);always @(posedge clk) beginif(!r) beginq<=d;endelse beginq<=1'b0;endendendmodule
题目描述10:
实现下面的电路
Solution10:
module top_module (input clk,input in, output out);always @(posedge clk) beginout <= (in ^ out);endendmodule
题目描述11:
考虑下图的电路:
假设要为这个电路实现分层的Verilog代码,使用一个子模块的三个实例,该子模块中有一个触发器和多路选择器。为这个子模块编写一个名为top_module的Verilog模块(包含一个触发器和多路选择器)
Solution11:
module top_module (input clk,input L,input r_in,input q_in,output reg Q);always @(posedge clk) beginQ <= L?r_in:q_in;endendmodule
题目描述12:
考虑下图的n-bit移位寄存器
为该电路的一个阶段编写一个Verilog模块顶层模块,包括触发器和多路选择器。
Solution12:
module top_module (input clk,input w, R, E, L,output Q
);always @(posedge clk) begincase({E,L})2'b00:Q<=Q;2'b01:Q<=R;2'b10:Q<=w;2'b11:Q<=R;endcaseendendmodule
题目描述13:
给定如图所示的有限状态机电路,假设D触发器在机器开始之前被初始重置为零
Solution13:
module top_module (input clk,input x,output z
); reg Q1,Q2,Q3;always @(posedge clk) beginQ1 <= (x ^ Q1);Q2 <= (x & ~Q2);Q3 <= (x | ~Q3);endassign z = ~(Q1|Q2|Q3);endmodule
题目描述14:
JK触发器有下面的真值表。只使用D触发器和逻辑门实现JK触发器。注:Qold是时钟上升沿前的D触发器的输出。
J | K | Q |
---|---|---|
0 | 0 | Qold |
0 | 1 | 0 |
1 | 0 | 1 |
1 | 1 | ~Qold |
Solution14:
module top_module (input clk,input j,input k,output Q); always @(posedge clk) begincase({j,k})2'b00:Q<=Q;2'b01:Q<=1'b0;2'b10:Q<=1'b1;2'b11:Q<=~Q;endcaseendendmodule
脉冲边沿检测
原理:
脉冲边沿的特性:两侧电平发生了变化。
若检测的是下降沿,那就是高电平变低电平。
若检测的是上升沿,那就是低电平变高电平。
若检测脉冲边沿,只需将前后进来的信号做异或运算,即两个电平不相同则是发生边沿。
思路:
设计寄存器用来接收被检测的信号;若{先进reg,后进reg}=2'b10
,则是下降沿;
若{先进reg,后进reg}=2'b01
,则为上升沿。
注:使用多个寄存器可以更好的检测边沿,防止干扰脉冲。具体看下例:
always @ (posedge clk or negedge rst_n) beginif(!rst_n) beginrs232_rx0 <= 1'b0;rs232_rx1 <= 1'b0;rs232_rx2 <= 1'b0;rs232_rx3 <= 1'b0;endelse beginrs232_rx0 <= rs232_rx;rs232_rx1 <= rs232_rx0;rs232_rx2 <= rs232_rx1;rs232_rx3 <= rs232_rx2;end
end
//这种方法可以滤除20-40ns的毛刺
assign neg_rs232_rx = rs232_rx3 & rs232_rx2 & ~rs232_rx1 & ~rs232_rx0;
易分析,后进信号rs232_rx0
,rs232_rx1
,必须都为0,且先进信号rs232_rx3
,rs232_rx2
都必须为1,neg_rs232_rx
才会为1。则此时判断为下降沿。
边沿检测巩固练习
题目描述1:
对于8位向量中的每一位,检测输入信号何时从一个时钟周期的0变化到下一个时钟周期的1(正边缘检测)。输出位应该在发生0到1转换后的周期,如下示意图所示:
Solution1:
module top_module (input clk,input [7:0] in,output [7:0] pedge
);reg [7:0] temp_in;always @(posedge clk) begintemp_in <= in;pedge <= ~temp_in & in;endendmodule
题目描述2:
对于8位向量中的每一位,检测输入信号何时从一个时钟周期变化到下一个时钟周期(检测脉冲边沿)。输出位应该在发生转换后的周期。
Solution2:
module top_module (input clk,input [7:0] in,output [7:0] anyedge
);reg [7:0] temp_in;always @(posedge clk) begintemp_in <= in;anyedge <= temp_in ^ in;endendmodule
题目描述3:
对于32位向量中的每一位,当输入信号从一个时钟周期的1变化到下一个时钟周期的0时捕获(捕捉下降沿),“捕获”意味着输出将保持1直到被reset(同步重置)。
每个输出位的行为就像一个SR触发器:输出位应该在发生1到0转换后的周期被设置(为1)。当复位为高时,输出位应该在正时钟边缘复位(为0)。如果上述两个事件同时发生,则reset具有优先级。
在下面示例波形的最后4个周期中,“reset”事件比“set”事件早一个周期发生,因此这里不存在冲突。
Solution3(1):
module top_module (input clk,input reset,input [31:0] in,output [31:0] out
);reg [31:0] temp_in;reg [31:0] state;integer i;always @(posedge clk) begintemp_in <= in;for(i=0;i<32;i++) begincase({temp_in[i] & ~in[i],reset})2'b10:out[i]<=1'b1;2'b11:out[i]<=1'b0;2'b01:out[i]<=1'b0;default:out[i]<=out[i];endcaseendendendmodule
Solution3(2):
module top_module (input clk,input reset,input [31:0] in,output [31:0] out
);reg [31:0] temp_in;always @(posedge clk) begintemp_in <= in;endalways @(posedge clk) beginif(reset)beginout<=32'b0;endelse beginout<=temp_in & ~in | out;endendendmodule
题目描述4:
时钟双沿触发器(不可使用下面形式的代码,不可综合)
always @(posedge clk or negedge clk)
Solution4(1):
module top_module (input clk,input d,output q
);reg q1,q2;always @(posedge clk) beginq1<=d;endalways @(negedge clk) beginq2<=d;endassign q = clk?q1:q2; endmodule
Solution4(2):
module top_module (input clk,input d,output q
);reg q1,q2;always @(posedge clk) beginq1<= d ^ q2;endalways @(negedge clk) beginq2<= d ^ q1;endassign q = q1 ^ q2; endmodule
我们知道任何一个数异或一个数再异或同一个数,将得到本身。这就是最简单的加密与解密原理。
Solution2相较于Solution1少了使用clk信号进行选择,可以避免产生毛刺。推荐使用Solution2进行双边检测。
总结
- 学习了D触发器与同步异步复位的概念
- 学会了实际工程中常用的边沿检测电路
HDLBits答案(10)_D触发器、同步与异步复位、脉冲边沿检测相关推荐
- 【转】同步与异步复位以及相关的亚稳态状况与设计可靠性
异步复位相比同步复位: 1. 通常情况下(已知复位信号与时钟的关系),最大的缺点在于异步复位导致设计变成了异步时序电路,如果复位信号出现毛刺,将会导致触发器的误动作,影响设计的稳定性. 2. ...
- verilog异步复位jk触发器_异步复位同步释放原理
关键词:同步释放,recovery,removal 在数字IC设计中肯定会涉及到异步复位的问题,因为需要对电路进行复位操作.这种复位设计主要依靠前端设计以及工具来检查,从数字IC后端的角度上讲,只要在 ...
- verilog异步复位jk触发器_同步复位和异步复位常见问题总结
总结同步和异步复位使用中的常见问题. 同步复位 问题1: 综合工具并不能轻易区分出同步复位信号和其他数据信号,综合出来的电路不唯一,某些电路结构在网表仿真时可能出现x态. 该段代码可能综合出两种电路结 ...
- 刷完这套题,我才发现Verilog原来如此简单----HDLBits答案系列---- Latches and Flip-Flops
写在前面 全部答案汇总:刷完这套题,我才发现Verilog原来如此简单----HDLBits答案汇总 今天更新Circuits章节中Sequential Logic的1个小节:Latches and ...
- 异步复位同步释放原理
深度揭秘异步复位同步释放原理 文章右侧广告为官方硬广告,与吾爱IC社区无关,用户勿点.点击进去后出现任何损失与社区无关. 明天就放端午小长假了,提前祝大家节日快乐.腾讯官网已经给小编公众号开通了赞赏功 ...
- 【数电】74161的同步与异步级联
首先先提一下上一篇 7474触发器 异步三进制加法计数器,在最后我写到一个小经验:如果用的是时钟的上升沿触发,异步连接时都是上级的Q反接下一级的时钟 后面我在复习数电考试的时候才发现原来老师之前就给做 ...
- Verilog中同步复位和异步复位比较
[Verilog] 同步复位和异步复位比较 同步复位 sync 异步复位 async 特点 复位信号只有在时钟上升沿到来时才能有效. 无论时钟沿是否到来,只要复位信号有效,就进行复位. Verilo ...
- 【 FPGA 】关于FPGA中复位的设计问题(包含异步复位,同步释放方案)
目录 复位的目的 同步复位 异步复位 优缺点比较 异步复位,同步释放(撤离) 复位的目的 复位的基本目的是使器件进入到可以稳定工作的确定状态,这避免了器件在上电后进入到随机状态导致跑飞了.在实际设计过 ...
- 复位最佳方式:异步复位,同步释放
异步: always @(posedge clk or negedge rst_n ) if(!rst_n) (优点:占用较少逻辑单元 缺点:可能会产生竞争冒险) 同步: always @(poseg ...
最新文章
- Android_(消息提示)多种使用Toast的消息提示
- 机器学习实战笔记(Python实现)-02-k近邻算法(kNN)
- Linux下安装Elasticsearch2.x
- matlab制作以太网数据接收上位机_Python制作串口通讯上位机
- MobX 上手指南,写 Vue 的感觉?
- CentOS7 安装ownCloud
- FPGA时钟激励编写(方法一)
- 清浮动,防止上下margin重叠(浏览器顶部空白崩溃)
- bootstrap-table真实交互数据_mysql存储引擎InnoDB详解,从底层看清InnoDB数据结构
- JSK-8 字符串长度【入门】
- c#读取生成excel表格文件xls、xlsx格式文件
- 《Android 面试指南》
- gitbook mac 版本的安装
- 中国第一个计算机病毒什么时候,新中国成立以来的第一例电脑病毒小球病毒是在1988年发现...
- 使用NOPI做Excepl导入导出
- 华为HCIE云计算培训笔记第一天
- iozone文件系统测试工具
- PhotoShop中蒙版介绍
- 怎样删除计算机中的来宾用户密码,win7怎么删除来宾账户_win7如何删除来宾账户...
- 阿里,淘宝,天猫,京东2012年的大概销售额
热门文章
- sap.ui.viewModifications view extension
- SAP UI5 Label related stuff and accessibility研究
- binding.filter(filter) will trigger OData request to backend
- BCP timeout prevention - 每秒刷新一次 Fiori
- How to get ABAP code coverage result
- IBASE handle free after save - buffer table cleared
- 使用代码创建具有organization unit的opportunity
- Product API buffer
- SAP ABAP实用技巧介绍系列之ABAP取中文字符串的字节长度
- ContextLoaderListener.contextInitialized - how is WebApplicationContext created