从真值表创建电路
JK 触发器具有以下真值表。仅使用 D 型触发器和门实现 JK 触发器。注:Qold 是时钟正沿前 D 触发器的输出。
Module Declaration
module top_module ( input clk, input j, input k, output Q);
答案:
module top_module ( input clk, input j, input k, output Q); always @(posedge clk)begin if({j,k}==2'b00)begin Q<=Q; end else if({j,k}==2'b01)begin Q<=0; end else if({j,k}==2'b10)begin Q<=1; end else begin Q<=!Q; end end endmodule
边沿检测(上升沿)
对于 8 位向量中的每一位,检测输入信号何时从一个时钟周期内的 0 变为下一个时钟周期的 1(类似于正沿检测)。输出位应在发生 0 到 1 转换后的周期设置。
这里有一些例子。为了清楚起见,分别显示了 in[1] 和 pedge[1]。
Module Declaration
module top_module ( input clk, input [7:0] in, output [7:0] pedge );
答案:
module top_module ( input clk, input [7:0] in, output [7:0] pedge ); reg [7:0] in_d1,in_d2; assign pedge = in_d1&(~in_d2); always @(posedge clk)begin in_d1 <= in; in_d2 <= in_d1; end endmodule
边沿检测(双沿检测)
对于 8 位向量中的每一位,检测输入信号何时从一个时钟周期变为下一个时钟周期(检测任何边沿)。输出位应在发生 0 到 1 转换后的周期设置。
这里有一些例子。为了清楚起见,分别显示了 in[1] 和 anyedge[1]
Module Declaration
module top_module ( input clk, input [7:0] in, output [7:0] anyedge );
答案:
module top_module ( input clk, input [7:0] in, output [7:0] anyedge ); reg [7:0] in_d1,in_d2; assign anyedge = (in_d1&(~in_d2)) | ((~in_d1)& in_d2); always @(posedge clk)begin in_d1 <= in; in_d2 <= in_d1; end endmodule
边沿捕获
对于 32 位向量中的每一位,当输入信号在一个时钟周期内从 1 变为下一个时钟周期时捕获。“捕获”表示输出将保持为 1,直到寄存器复位(同步复位)。
每个输出位的行为就像一个 SR 触发器:输出位应在 1 到 0 转换发生后的周期设置(为 1)。当复位为高电平时,输出位应在时钟正沿复位(为 0)。如果上述两个事件同时发生,则重置优先。在下面示例波形的最后 4 个周期中,‘reset’ 事件比 ‘set’ 事件早一个周期发生,因此这里没有冲突。
在下面的示例波形中,为清楚起见,再次分别显示了复位、输入 [1] 和输出 [1]。
Module Declaration
module top_module ( input clk, input reset, input [31:0] in, output [31:0] out );
答案:
module top_module ( input clk, input reset, input [31:0] in, output [31:0] out ); reg [31:0] in_d1,in_d2; always @(posedge clk)begin in_d1 <= in; in_d2 <= in_d1; end always @(posedge clk)begin if(reset==1) out <= 0; else if((|((~in) & in_d1)) == 1) out <= (~in) & in_d1 | out; else out <= out; end endmodule
双沿触发器
您熟悉在时钟的正沿或时钟的负沿触发的触发器。双边沿触发触发器在时钟的两个边沿触发。但是,FPGA 没有双边沿触发的触发器,并且始终不接受@(posedge clk 或 negedge clk)作为合法的敏感列表。
构建一个功能类似于双边沿触发触发器的电路:
Module Declaration
module top_module ( input clk, input d, output q );
答案:
module top_module ( input clk, input d, output q ); reg q1,q2; assign q = (clk)?q1:q2; always @ (posedge clk)begin q1 <= d; end always @ (negedge clk)begin q2 <= d; end endmodule