在前面学习了组合逻辑现在开始学习时序逻辑,时序逻辑最基本的就是寄存器。
先从一个带时钟,复位,使能的8位输入输出寄存器开始吧
1、寄存器的结构
2、verilog代码
`timescale 1ns / 1ps
module register(
input rst,
input clk,
input ena,
input [7:0] data,
output [7:0] out
);
reg [7:0] dffrb;
always @(posedge clk or posedge rst)begin
if(rst)
dffrb <= 0;
else begin
if(ena)
dffrb <= data;
else
dffrb <= dffrb;
end
end
assign out = dffrb;
endmodule
3、testbench
`timescale 1ns / 1ps
module register_tb(
);
// Inputs
reg rst;
reg clk;
reg ena;
reg [7:0] data;
// Outputs
wire [7:0] out;
// Instantiate the module
register uut (
.rst(rst),
.clk(clk),
.ena(ena),
.data(data),
.out(out)
);
// Clock generation
initial begin
clk = 0;
forever #5 clk = ~clk;
end
// Stimulus
initial begin
// Test case 1
rst = 1;
ena = 0;
data = 8'b10101010;
#10;
// Test case 2
rst = 0;
ena = 1;
data = 8'b11001100;
#10;
// Test case 3
ena = 1;
data = 8'b00110011;
#10;
// Test case 4
ena = 1;
data = 8'b00111111;
#10;
// Test case 5
ena = 0;
data = 8'b00000010;
#10;
// Test case 6
ena = 0;
data = 8'b10000010;
#10;
$finish;
end
always @(posedge clk) begin
$display("Time=%t: rst=%b, clk=%b, ena=%b, data=%d, out=%d", $time, rst, clk, ena, data, out);
end
endmodule
可以看到输入输出不是立马相同的,需要相差半个时钟周期,即等待下一个上升沿到来才会进行跳变。
整体的数据维持位1个时钟周期。
4、RTL
5、综合
可以看到,每一位的寄存器都被综合为一个FDCE(D Flip-Flop with Clock Enable and AsynchronousReset 带使能和异步复位功能的D触发器)实现
6、实现
由8个FDCE实现