Simulate D Flip-Flop

J, 27 23 bytes

-4 bytes thanks to Bubbler!

;@(<@({.\);.1~1,2</\}.)

Try it online!

CLK is the left argument; D is the right one. When CLK doesn't start with 01, the starting bits are the same as the first bit of D.

                       ;.1  - cut 
                          ] - the right argument (D)
   (          )             - where
         2 /\               - the previous element 
             [              - of the left argument (CLK)
          <                 - is smaller than the next one 
       }.                   - drop
      1                     - the first item
    1,                      - prepend with 1 (for cutting)
               (     )      - for each cut group
                   $        - make a list   
                #           - of the same length as the group
                    {.      - with elements same as the first one  
                 <@         - and box the list
  ;                         - unbox the sublists and flatten them
[:                          - function composition

K (oK), 27 23bytes

-4 bytes thanks to ngn!

{,/&\'|\'(0,&1_>':x)_y}

Try it online!


APL (Dyalog Extended), 16 bytes

∊⊣⊣\¨⍤⊂⍨1,1↓2</⊢

Try it online!

A dyadic tacit function whose right arg is CLK and left arg is D. Accepts both as Boolean vectors. The starting bit of Q follows that of D.

How it works

∊⊣⊣\¨⍤⊂⍨1,1↓2</⊢  ⍝ Input: left←D, right←CLK
            2</⊢  ⍝ Detect rising edges of CLK
        1,1↓      ⍝ Treat the very first tick as a rising edge
 ⊣    ⊂⍨          ⍝ Partition D into regions where
                  ⍝   each rising edge marks the start of each region
  ⊣\¨⍤            ⍝ On each region, overwrite all elements with the first one
∊                 ⍝ Enlist; form a simple vector

JavaScript (ES6),  40  39 bytes

Takes input as (clock)(data), where clock and data are arrays of binary digits.

C=>D=>D.map(c=>C[i]<C[++i]?p=c:p,i=p=0)

Try it online!