DFF+gate
要求:实现下图电路。
module top_module (
input clk,
input in,
output out);
wire d;
assign d = in ^ out;
always@(posedge clk)
out <= d;
endmodule
Mux and DFF (Mt2015 muxdff)
要求:考虑下面的时序电路,其中使用了具有触发器和选择器的子模块的三个实例化,为该子模块编写Verilog代码(包含一个触发器和一个选择器)
module top_module (
input clk,
input L,
input r_in,
input q_in,
output reg Q);
always@(posedge clk)
if(L == 1'b1)
Q <= r_in;
else
Q <= q_in;
endmodule
Mux and DFF (Exams/2014 q4a)
要求:为下图电路的子模块编写Verilog代码(包含触发器和选择器)
module top_module (
input clk,
input w, R, E, L,
output Q
);
wire mux_out;
assign mux_out = E ? w : Q;
always@(posedge clk)
if(L == 1'b1)
Q <= R;
else
Q <= mux_out;
endmodule
DFFs and gates
要求:描述如下的电路,假设D触发器在开始之前初始复位为零。
module top_module (
input clk,
input x,
output z
);
reg q1,q2,q3;
wire d1,d2,d3;
assign d1 = q1 ^ x;
assign d2 = ~q2 & x;
assign d3 = ~q3 | x;
assign z = ~(q1 | q2 | q3);
always@(posedge clk)
begin
q1 <= d1;
q2 <= d2;
q3 <= d3;
end
endmodule
Creat circuit from truth table
要求:根据下图真值表实现JK触发器。
module top_module (
input clk,
input j,
input k,
output Q);
always@(posedge clk)
begin
case({j,k})
2'b00 : Q <= Q;
2'b01 : Q <= 1'b0;
2'b10 : Q <= 1'b1;
2'b11 : Q <= ~Q;
endcase
end
endmodule
Edgedetect
要求:对于 8 位向量中的每一位,检测输入信号何时从一个时钟周期的 0 变为下一个时钟周期的 1(类似于上升沿检测)。下面的波形图为in[1] 和 pedge[1] 的示意。
分析:
检测上升沿,即检测信号从0到1的变化;
对输入信号in打一拍得到in_reg,那么上升沿对应的位置应该是in为1且in_reg为0的地方。
module top_module (
input clk,
input [7:0] in,
output [7:0] pedge
);
reg [7:0] reg_in;
always@(posedge clk)
reg_in <= in;
integer i;
always@(posedge clk)
for(i = 0; i <= 7; i = i + 1)
begin
pedge[i] = in[i] & ~reg_in[i];
end
endmodule
Detect both edges(Edgedetect2)
要求:对于 8 位向量中的每一位,检测输入信号何时从一个时钟周期变为下一个时钟周期(检测任何边沿)。 下面的波形图为in[1] 和 anyedge[1] 的示意。
分析:
检测上升沿和下降沿,即检测信号从0到1或从1到0的变化;
对输入信号in打一拍得到in_reg,那么边沿对应的位置应该是in和in_reg对应的值不一样的位置。
module top_module (
input clk,
input [7:0] in,
output [7:0] anyedge
);
reg [7:0] reg_in;
always@(posedge clk)
reg_in <= in;
integer i;
always@(posedge clk)
for(i = 0; i <= 7; i = i + 1)
begin
anyedge[i] = in[i] ^ reg_in[i];
end
endmodule
Edgecapture
要求:对于 32 位向量中的每一位,在输入信号从一个时钟周期的 1 变为下一个时钟周期的 0 时进行捕捉。“捕获”表示输出将保持为 1,直到寄存器复位(同步复位)。
每个输出位的行为类似于 SR 触发器:输出位应在 1 到 0 转换发生后的周期设置(为 1)。当复位为高电平时,输出位应在正时钟沿复位(为 0)。如果上述两个事件同时发生,则复位优先。
分析:
在输入信号从一个时钟周期的 1 变为下一个时钟周期的 0 时进行捕捉,即捕获下降沿,捕获后保持输出为1,直到复位信号有效;
对输入信号in打一拍得到in_reg,那么下降沿对应的位置应该是in为0且in_reg为1的地方。
module top_module (
input clk,
input reset,
input [31:0] in,
output [31:0] out
);
reg [31:0] reg_in;
always@(posedge clk)
reg_in <= in;
always@(posedge clk)
if(reset == 1'b1)
out <= 32'd0;
else
out <= (~in & reg_in) | out;
endmodule
Dualedge
要求:构建一个功能类似于双边沿触发器的电路,FPGA中没有双边沿触发器,并且不接受always @(posedge clk or negedge clk)作为敏感列表。
分析:
先分别构建上升沿触发和下降沿触发电路,上升沿到来后clk为高电平,下降沿到来后clk为低电平,通过clk选择输出为上升沿或下降沿,可实现双边沿触发电路。
module top_module (
input clk,
input d,
output q
);
reg q1,q2;
always@(posedge clk)
q1 <= d;
always@(negedge clk)
q2 <= d;
assign q = clk ? q1 : q2;
endmodule
总结:本小节是一些基础的时序电路,其中边沿检测电路在实际工程中会经常需要用到。