3.2.1.17 Edge capture register
问题描述
对于32bits向量中的每一位,当输入信号由1变为0时进行检测(即下降沿检测)
其中检测表示在复位信号(同步)到达前,输出将保持1。 每一个输出位就像一个RS触发器,即当对应位出现1 to 0的变化时,输出位将置1
而当reset信号为高电平,输出位将在下一个时钟的上升沿被复位。如果信号的下降沿和reset事件在同一时刻发生,将优先执行复位操作
在下图示例波形的最后4个时钟周期中,reset事件比set事件早一个周期出现,因此这里没有前述冲突。 为清楚起见,in[1]和out[1]在波形中分别单独显示
分析:我们将这道题和3.2.1.15 Detect an edge比较一下
①本题多了一个reset的高电平有效的同步复位信号
②本题是下降沿检测
③3.2.1.15题pedge的高电平只维持一个时钟周期,而本题在复位信号到达之前out会保持高电平(红色画圈处,类似于SR触发器,体现了题目'capture'捕获一词)
代码:
module top_module (
input clk,
input reset,
input [31:0] in,
output [31:0] out
);
reg [31:0] pre_in;
always @(posedge clk) begin
pre_in<=in;
if(reset) //reset的优先级高,我们先判断它
out<=0;
else
out<=pre_in&~in | out; //这个|out体现了捕获的操作
end
endmodule
3.2.1.18 Dual-edge triggered flip-flop
问题描述
您熟悉在时钟上升沿或时钟下降沿触发的触发器。在时钟的两个边沿触发双边触发触发器。但是,FPGA 没有双边触发触发器,并且始终不接受 @(posedge clk 或 negedge clk)作为合法的敏感度列表。这一点可以参考 【 Verilog 】always@()的敏感源中为什么不能双边沿触发?为什么不能双时钟触发?
构建一个功能类似于双边触发触发器的电路:
(注意:它不一定完全等效:触发器的输出没有毛刺,但模拟这种行为的更大组合电路可能会。但我们将在这里忽略这个细节。)
提示:
您无法在 FPGA 上创建双边触发触发器。但是您可以同时创建正沿触发和负沿触发触发器。
这个问题是一个中等难度的电路设计问题,但只需要基本的 Verilog 语言特性。(这是电路设计问题,而不是编码问题,这就有可综合的要求。)在尝试编码之前先用手画出电路图可能会有所帮助。
分析:双边沿触发器了解到的只有mux型和xor型
①mux型:
优点:逻辑简单
缺点:触发器有延时,可能q1、q2还未更新就已经执行了assign q = clk? q1:q2,使输出波形产生毛刺
代码:
// mux型双边沿触发器
module top_module (
input clk,
input d,
output q
);
reg q1,q2;
always @(posedge clk) begin
q1 <= d; //记录上升沿触发的状态
end
always @(negedge clk) begin
q2 <= d; //记录下降沿触发的状态
end
assign q = clk?q1:q2;
endmodule
②xor型:
优点:无毛刺产生
缺点:需要使用三个异或门,电路复杂
代码:
module top_module(
input clk,
input d,
output q);
reg p, n;
// clk的上升沿
always @(posedge clk)
p <= d ^ n;
// clk的下降沿
always @(negedge clk)
n <= d ^ p;
//在上升沿时候,p=d^n, 则q=d^n^n=d;
//在下降沿时候,n=d^p, 则q=p^d^p=d;
//加载一个新值时会取消旧值。
assign q = p ^ n;
// 这样写是无法综合的
/*always @(posedge clk, negedge clk) begin
q <= d;
end*/
endmodule