There are a couple of problems with your code. If you are really a Prolog/clpfd beginner, you might consider starting with something a bit easier.
The idea of CLP programs is to first set up the constraints (which are deterministic), and then do the search for solutions (which is nondeterministic). In your code, valid_row/1 and all_diff/1 can be considered constraints, but valid/3 is nondeterministic, and makes lots of choices.
So the first change you should make is to move your call to valid/3 to the very end.
Then you should change valid/3 so that it systematically enumerates all possible variable assignments. With your current code, and a 3x3 matrix, the first few solutions that
foreach(between(1,Height,X),foreach(between(1,Height,Y),valid(Rows,X,Y)))
generates are
[[A, 0, C], [0, 0, 0], [G, 0, I]]
[[A, 0, C], [0, 0, 0], [G, 0, 0]]
[[A, 0, C], [0, 0, 0], [G, 0, I]]
[[A, 0, C], [0, 0, 0], [G, 0, I]]
[[A, 0, 0], [0, 0, F], [G, 0, I]]
...
That's bad, because they still contain variables, and they are not even mutually exclusive. Both of which means that you are visiting the same assignments over and over again. Rewrite it such that every time it succeeds, all variables are set to 0/1, and all solutions are different. Then you will be sure to traverse the search space only once, and you might have a chance to find a solution in reasonable time.