FDRSE: D flip-flop with clock Enable, and synchronous Reset/Set
FDRSE is a D-type flip-flop with an active-high clock enable (CE), and synchronous active-high reset (R) and set (S) inputs. The R, S, and CE inputs are examined in priority order during the low-to-high transition of the clock (C) input. If R is asserted, Q is set to 0. Otherwise, if S is asserted, Q is set to 1. Otherwise, if CE is asserted, Q is loaded with the data on the D input. Otherwise, Q retains its previous value. |
Verilog
module FDRSE( input R, S, CE, D, C, output reg Q); always @(posedge C) if(R) Q <= 0; else if(S) Q <= 1; else if(CE) Q <= D; endmodule
VHDL
library IEEE; use IEEE.std_logic_1164.all; entity FDRSE is port ( R, S, CE, D, C : in std_logic; Q : out std_logic); end entity FDRSE; architecture A of FDRSE is begin process (C) is begin if rising_edge(C) then if R = '1' then Q <= '0'; elsif S = '1' then Q <= '1'; elsif CE = '1' then Q <= D; end if; end if; end process; end architecture A;
Testbench
DUT { module FDRSE(input R, S, CE, D, C, output Q) create_clock C [R, S, CE, D, C] -> [Q] } [1, 0, 1, 1, .C] -> [0] // sync reset [0, 1, 1, 0, .C] -> [1] // sync set [0, 0, 0, 0, .C] -> [1] // no CE, holds at 1 [0, 0, 1, 0, .C] -> [0] // CE, 1->0 [0, 0, 0, 1, .C] -> [0] // no CE, holds at 0 [0, 0, 1, 1, .C] -> [1] // CE, 0->1 [1, 1, 1, 1, .C] -> [0] // sync reset, overrides S