1
0
mirror of https://github.com/aolofsson/oh.git synced 2025-01-17 20:02:53 +08:00
oh/common/hdl/oh_pulse2pulse.v
Andreas Olofsson 19fa611bb9 Massive reorganization to impove reuse
- adding more chip code
- pushing memory stuff into common
- making common "oh_" naming class
-
2015-11-30 13:45:49 -05:00

54 lines
1.2 KiB
Verilog

// FUNCTION: Transfers a pulse on clkin domain to a pulse on clkout domain
// !!!WARNING: "din" pulse width must be greater than clkout width!!!
module oh_pulse2pulse(/*AUTOARG*/
// Outputs
dout,
// Inputs
nrstin, din, clkin, nrstout, clkout
);
//input clock domain
input nrstin; //input domain reset
input din; //input pulse (one clock cycle)
input clkin; //input clock
//output clock domain
input nrstout; //output domain reset
input clkout; //output clock
output dout; //output pulse (one clock cycle)
reg toggle_reg;
reg pulse_reg;
wire toggle;
//pulse to toggle
assign toggle = din ? ~toggle_reg : toggle_reg;
always @ (posedge clkin)
if(~nrstin)
toggle_reg <= 1'b0;
else
toggle_reg <= toggle;
//metastability synchronizer
oh_dsync #(1) sync(.dout (toggle_sync),
.din (toggle),
.clk (clkout)
);
//toogle to pulse
always @ (posedge clkout)
if(!nrstout)
pulse_reg <= 1'b0;
else
pulse_reg <= toggle_sync;
assign dout = pulse_reg ^ toggle_sync;
endmodule // oh_pulse2pulse