mirror of
https://github.com/aolofsson/oh.git
synced 2025-01-17 20:02:53 +08:00
60 lines
1.6 KiB
Coq
60 lines
1.6 KiB
Coq
|
module IDDR (/*AUTOARG*/
|
||
|
// Outputs
|
||
|
Q1, Q2,
|
||
|
// Inputs
|
||
|
C, CE, D, R, S
|
||
|
);
|
||
|
|
||
|
//Default parameters
|
||
|
parameter DDR_CLK_EDGE = "OPPOSITE_EDGE";
|
||
|
parameter INIT_Q1 = 1'b0;
|
||
|
parameter INIT_Q2 = 1'b0;
|
||
|
parameter [0:0] IS_C_INVERTED = 1'b0;
|
||
|
parameter [0:0] IS_D_INVERTED = 1'b0;
|
||
|
parameter SRTYPE = "SYNC";
|
||
|
|
||
|
output Q1; // IDDR registered output (first)
|
||
|
output Q2; // IDDR registered output (second)
|
||
|
input C; // clock
|
||
|
input CE; // clock enable, set to high to clock in data
|
||
|
input D; // data input from IOB
|
||
|
input R; // sync or async reset
|
||
|
input S; // syn/async "set to 1"
|
||
|
|
||
|
//trick for string comparison
|
||
|
localparam [152:1] DDR_CLK_EDGE_REG = DDR_CLK_EDGE;
|
||
|
|
||
|
reg Q1_pos;
|
||
|
reg Q1_reg;
|
||
|
|
||
|
reg Q2_pos;
|
||
|
reg Q2_neg;
|
||
|
|
||
|
always @ (posedge C)
|
||
|
if(CE)
|
||
|
Q1_pos <= D;
|
||
|
|
||
|
always @ (posedge C)
|
||
|
if(CE)
|
||
|
Q1_reg <= Q1_pos;
|
||
|
|
||
|
always @ (negedge C)
|
||
|
if(CE)
|
||
|
Q2_neg <= D;
|
||
|
|
||
|
always @ (posedge C)
|
||
|
if(CE)
|
||
|
Q2_pos <= Q2_neg;
|
||
|
|
||
|
//Select behavior based on parameters
|
||
|
assign Q1 = (DDR_CLK_EDGE_REG == "SAME_EDGE_PIPELINED") ? Q1_reg :
|
||
|
(DDR_CLK_EDGE_REG == "SAME_EDGE") ? Q1_pos :
|
||
|
1'b0;
|
||
|
|
||
|
assign Q2 = (DDR_CLK_EDGE_REG == "SAME_EDGE_PIPELINED") ? Q2_pos :
|
||
|
(DDR_CLK_EDGE_REG == "SAME_EDGE") ? Q2_pos :
|
||
|
1'b0;
|
||
|
|
||
|
endmodule // IDDR
|
||
|
|