// Synchronizer.v
// 2016/06/29 by marsee
//
`default_nettype none
module Synchronizer #(
parameter integer NUMBER_OF_STAGES = 2,
parameter integer BIT_WIDTHS = 1
)(
input wire clk,
input wire [BIT_WIDTHS-1:0] inp,
output wire [BIT_WIDTHS-1:0] outp
);
integer i;
reg [BIT_WIDTHS-1:0] ff[NUMBER_OF_STAGES-1:0];
always @(posedge clk) begin : proc_gen_ff
for (i=0; i<=NUMBER_OF_STAGES-1; i=i+1) begin
if (i==0) begin
ff[i] <= inp;
end else begin
ff[i] <= ff[i-1];
end
end
end
assign outp = ff[NUMBER_OF_STAGES-1];
endmodule
`default_nettype wire
// Synchronizer_tb.v
// 2016/06/29 by marsee
//
`timescale 100ps / 1ps
module Synchronizer_tb;
parameter integer NUMBER_OF_STAGES = 2;
parameter integer BIT_WIDTHS = 1;
reg [BIT_WIDTHS-1:0] inp;
wire [BIT_WIDTHS-1:0] outp;
reg clk = 1'b0;
Synchronizer # (
.NUMBER_OF_STAGES(NUMBER_OF_STAGES),
.BIT_WIDTHS(BIT_WIDTHS)
) uut (
.clk(clk),
.inp(inp),
.outp(outp)
);
initial begin
inp = 0;
#1000
inp = -1;
#7000
inp = 0;
end
always #(500)
clk = ~clk;
endmodule
の場合のシミュレーション結果を示す。parameter integer NUMBER_OF_STAGES = 3;
parameter integer BIT_WIDTHS = 8;
日 | 月 | 火 | 水 | 木 | 金 | 土 |
---|---|---|---|---|---|---|
- | - | - | - | - | 1 | 2 |
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 | - | - | - | - | - | - |