Hi!
I see two points:
1. Addresses are usually count bytewise, but in a 32 bit system a memory location
contain 4 bytes, consecutive addresses are increased by 4.
I would set the UART to 0x00001004, 0x00001008, 0x0000100c or something like that.
2. Your address decoding is incomplete, so you get the same effect like
on 8 bit home computers (these times the address decoders where expensive): Your devices are shown
several times in the memory map.
If your case statement does really compares all 32 address bits, than there might be another place in the ZPU which
does incomplete address decoding.
To explore such things I use a simulator like ghdl/gtkwave or modelsim.
regards,
Bert