The Nexperia datasheet I'm using labels parallel load as /PE and clock enable as CE. I've got them right.
I think I figured it out though. The clock pulses for every character I read from memory. My characters are 8 pixels wide, so I have another counter handling that. I only send characters during my horizontal draw period, so there is a gap in the clock pulses during horizontal refresh. As it happens, the signal I'm using to clock the flip flop chip occurs in that period. I only just now noticed on the datasheet that /PE has to be low during a rising clock edge to actually load the data. So that's the problem.
I have an idea to clock the flip flops in a way that deals with this properly, so I'll report back when I have progress.
If anyone's curious, what I'm building is a VGA controller for a homebrew 6502 computer I've built. The VGA is being done entirely with 7400 logic. Piles of counters, magnitude comparitors, latches, and gates. The only non 7400 logic chips in the build so far is my character ROM, and the dual ported RAM chip I'm using for video memory. I created a program for Windows for creating fonts and saving them in the format I require.
Currently, if I just hardwire character addresses into the thing, I get characters in the screen, so. VGA timing, my display circuit, and my method of decoding characters for display all work. This thing is on a mess of breadboards.
I'm now working on displaying contents from video memory. My characters are stored in ROM in groups of each pixel row, so the first 256 bytes holds the top rows of every character, the second row is in the next 256 bytes, and so on. My characters are 12 rows high, so I display each line of text 12 times, stepping through the rows in ROM to assemble the characters.
The troublesome circuit steps through video memory. It has to read the same 80 characters (my horizontal character resolution) 12 times so the characters can be displayed a scan line at a time. Then it has to read the next 80, and do it again.
So that's what I'm up to! I think I have the current issue solved in my head, but it will be a couple days before I can get at the bench.