2016-02-23 15:42:32 -05:00
|
|
|
//##################################################################
|
|
|
|
//# ***DUAL DATA RATE OUTPUT***
|
|
|
|
//#
|
|
|
|
//# * Equivalent to "SAME_EDGE" for xilinx
|
|
|
|
//# * din1/din2 presented together on rising edge of clk
|
|
|
|
//# * din1 follows rising edge
|
|
|
|
//# * din2 follows falling edge
|
|
|
|
//##################################################################
|
|
|
|
|
2016-02-22 23:47:27 -05:00
|
|
|
module oh_oddr (/*AUTOARG*/
|
|
|
|
// Outputs
|
|
|
|
out,
|
|
|
|
// Inputs
|
|
|
|
clk, ce, din1, din2
|
|
|
|
);
|
2016-02-23 15:42:32 -05:00
|
|
|
|
2016-02-22 23:47:27 -05:00
|
|
|
//parameters
|
|
|
|
parameter DW = 32;
|
|
|
|
|
|
|
|
//signals
|
|
|
|
input clk; // clock input
|
|
|
|
input ce; // clock enable input
|
|
|
|
input [DW-1:0] din1; // data input1
|
|
|
|
input [DW-1:0] din2; // data input2
|
|
|
|
output [DW-1:0] out; // ddr output
|
|
|
|
|
2016-02-23 15:42:32 -05:00
|
|
|
//regs("sl"=stable low, "sh"=stable high)
|
|
|
|
reg [DW-1:0] q1_sl;
|
|
|
|
reg [DW-1:0] q2_sl;
|
|
|
|
reg [DW-1:0] q2_sh;
|
|
|
|
|
2016-02-22 23:47:27 -05:00
|
|
|
//Generate different logic based on parameters
|
|
|
|
always @ (posedge clk)
|
2016-02-23 15:42:32 -05:00
|
|
|
begin
|
|
|
|
q1_sl[DW-1:0] <= #(0.1) din1[DW-1:0];
|
|
|
|
q2_sl[DW-1:0] <= #(0.1) din2[DW-1:0];
|
|
|
|
end
|
|
|
|
|
2016-02-22 23:47:27 -05:00
|
|
|
always @ (negedge clk)
|
2016-02-23 15:42:32 -05:00
|
|
|
q2_sh[DW-1:0] <= #(0.1) q2_sl[DW-1:0];
|
2016-02-22 23:47:27 -05:00
|
|
|
|
2016-02-23 15:42:32 -05:00
|
|
|
assign out[DW-1:0] = clk ? q1_sl[DW-1:0] :
|
|
|
|
q2_sh[DW-1:0];
|
2016-02-22 23:47:27 -05:00
|
|
|
|
|
|
|
endmodule // oh_oddr
|
|
|
|
|
|
|
|
|