3.2.1 Latches and Flip-Flops
3.2.1.1 D flip-flop
问题陈述:
AD触发器是一种存储位并定期更新的电路,在时钟信号的(通常)上升沿。
当使用时钟控制的always 块时,逻辑合成器会创建 D 触发器AD触发器是“组合逻辑块后接触发器”的最简单形式,其中组合逻辑部分只是一条线。
创建一个 D 触发器。
Verilog代码:
module top_module (
input clk, // Clocks are used in sequential circuits
input d,
output reg q );//
always@(posedge clk)
begin
q<=d;
end
endmodule
3.2.1.2 D flip-flop
问题陈述:
创建 8 个 D 触发器。所有 DFF 都应由clk的上升沿触发。
Verilog代码:
module top_module (
input clk,
input [7:0] d,
output [7:0] q
);
integer i;
always@(posedge clk)
begin
for (i=0;i<=7;i++)
q[i]<=d[i];
end
endmodule
3.2.2.3 DFF with reset
问题陈述:
创建 8 个具有高电平有效同步复位的 D 触发器。所有 DFF 都应由clk的上升沿触发。
verilog代码:
module top_module (
input clk,
input reset, // Synchronous reset
input [7:0] d,
output [7:0] q
);
always@(posedge clk)
begin
if(!reset)
q<=d;
else
q<=8'b0;
end
endmodule
3.2.2.4 DFF with reset value
问题陈述:
创建 8 个具有高电平有效同步复位的 D 触发器。触发器必须重置为 0x34 而不是零。所有 DFF 都应由clk的下降沿触发。
Verilog代码:
module top_module (
input clk,
input reset,
input [7:0] d,
output [7:0] q
);
always @(negedge clk)begin
if(reset)
q=8'h34;
else
q<=d;
end
endmodule
3.2.2.5 DFF with asynchronous reset
问题陈述:
创建 8 个具有高电平有效异步复位的 D 触发器。所有 DFF 都应由clk的上升沿触发。
Verilog代码:
module top_module (
input clk,
input areset, // active high asynchronous reset
input [7:0] d,
output [7:0] q
);
always@(posedge clk or posedge areset)
begin
if(areset)
q<=8'b0;
else
q<=d;
end
endmodule
3.2.2.6 DFF with byte enable
问题陈述:
创建 16 个 D 触发器。有时只修改一组触发器的一部分很有用。字节使能输入控制 16 个寄存器中的每个字节是否应在该周期写入。byteena[1]控制高字节d[15:8],而byteena[0]控制低字节d[7:0]。
resetn是一个同步的低电平有效复位。
所有 DFF 都应由clk的上升沿触发。
Verilog代码:
module top_module (
input clk,
input resetn,
input [1:0] byteena,
input [15:0] d,
output [15:0] q
);
always@(posedge clk)
begin
if(!resetn)
q<=16'b0;
else
begin
if(byteena[0])
q[7:0]<=d[7:0];
if(byteena[1])
q[15:8]<=d[15:8];
end
end
endmodule
3.2.2.7 D Latch
问题陈述:
实现以下电路:
请注意,这是一个锁存器,因此预计会出现关于已推断锁存器的 Quartus 警告。
Verilog代码:
module top_module (
input d,
input ena,
output q);
always @(*) begin
if(ena)
q<=d;
end
endmodule
3.2.2.8 DFF
问题陈述:
实现以下电路:
Verilog代码:
module top_module (
input clk,
input d,
input ar, // asynchronous reset
output q);
always@(posedge clk or posedge ar)
begin
if(ar)
q<=1'b0;
else
q<=d;
end
endmodule
3.2.2.9 DFF
问题陈述:
实现以下电路:
Verilog代码:
module top_module (
input clk,
input d,
input r, // synchronous reset
output q);
always @(posedge clk )
begin
if(!r)
q<=d;
else
q<=1'b0;
end
endmodule
3.2.2.10 DFF+gate
问题陈述:
实现以下电路:
Verilog代码:
module top_module (
input clk,
input in,
output out);
always@(posedge clk)
begin
out<=in^out;
end
endmodule
3.2.2.11 Mux and DFF
问题陈述:
考虑下面的时序电路:
假设您要为此电路实现分层 Verilog 代码,使用其中具有触发器和多路复用器的子模块的三个实例化。为此子模块编写一个名为top_module的 Verilog 模块(包含一个触发器和多路复用器)。
Verilog代码:
module top_module (
input clk,
input L,
input r_in,
input q_in,
output reg Q);
wire D;
assign D=L? r_in:q_in;
always @(posedge clk)
begin
Q<=D;
end
endmodule
3.2.2.12 Mux and DFF
问题陈述:
考虑如下所示 的n位移位寄存器电路:
为该电路的一个阶段编写一个名为 top_module 的 Verilog 模块,包括触发器和多路复用器。
Verilog代码:
module top_module (
input clk,
input w, R, E, L,
output Q
);
wire o1,D;
assign o1=E? w:Q;
assign D=L?R:o1;
always@(posedge clk)
begin
Q<=D;
end
endmodule
3.2.2.13 DFFs and gates
问题陈述:
给定如图所示的有限状态机电路,假设 D 触发器在机器开始之前初始复位为零。
建立这个电路。
Verilog代码:
> module top_module (
input clk,
input x,
output z
);
wire D1,D2,D3,Q1,Q2,Q3;
assign D1=x^Q1;
assign D2=x&~Q2;
assign D3=x|~Q3;
assign z=~(Q1|Q2|Q3);
always@(posedge clk)
begin
Q1<=D1;
Q2<=D2;
Q3<=D3;
end
endmodule