Pages are part of a larger address space, Segments are an address space.
And both are tools to organize a virtual address space which can be mapped onto real memory.
It may be important to keep in mind that terms like Segment or Page aren't as hard defined as one may assume. Like next to any other term. Just take Byte. Today it's automatic assumed to be 8 bit, but that' not entirely true. It has been used for many different units of 5 to 10 Bits. Same for Segment or Page - just think the usage of Page in the context of a 6502 to denote a 256 byte region aligned at a 256 byte border.
Bottom line, we need to be careful when assuming about terms, as one term can carry various meaning.
The Long Read
I came to understand the difference between paging and segmentation to be that the former refers to fixed blocks while the later can point anywhere.
No, not really, as a Page can as well point anywhere in real memory (keep in mind, this is all about virtualization), as well as Segments can be of fixed size.
To do so, the segments are essentially a map from segment number to a (typically longer) base offset.
The same way as a Page is - or not. Both are about mapping virtual address (of a system or a process space) space to real memory or some pointer for retrieval of its region.
I'm reading an article on the Z8000 and they talk about the segment register (only one, or did I miss something?).
Erm, no, each and every address could use a different segment. Also, we're not talking Z8000 but Z8001.
However, it appears this 7-bit number is simply tacked onto the front of the 16-bit offset to produce a 23-bit address.
No, the segment number is separate from the address. The segment number is fixed and will never be calculated or manipulated by the CPU (*1,*2). Only the 16 bit address is calculated in address operations. Of course, from the point of view of a simple memory controller, just providing 8 MiB (*3) of memory addressd by 7+16 bits, yes. But then there is case of using a MMU, like the Z8010 - or a diskrete one as well. It uses the 7 bit segment number issued by the CPU to map it to some arbitrary real memory chunk. Maybe adding process IDs or issuening segment fault interrupts for unassigned (swaped out) pages or alike.
So if my original understanding is correct, isn't this really paging?
No. The basic difference between Paging and Segmentation is that Segments are closed address spaces. They carry no relation between each other. Each Segment is an address space of it's own. Pages on the other hand are parts of a common (single) address space.
Or as practical example, incrementing an address pointer, pointing to the last byte of a segment, by one will make it point to the first byte of the same segment. While incrementing a pointer pointing to the last byte of a page by one will let it point to the first byte of the next page - unless it was the last page in the address space. In this case it will be pointing to the first byte of page 0
Is there a mapping going on that I'm missing, or is my original definition incorrect?
I think you just mixed in the idea how the 8086 implemented segmentation with the fact that some segmented systems can have segments of varying size. Both are implementation details and not basic differences (*4).
*1 - And will be presented on the bus right away, even before the effective 16 bit address is calculated.
*2 - Of course user code may manipulate segment numbers as part of a 32 bit operation. How useful this is may be is up to each user - or better how far the OS can tolerate it (*5).
*3 - Or 48 MiB if address space information is used as well.
*4 - After all, pages can as well have different sizes :)
*5 - Here the fixed 64 KiB segment size does allow to view consecutive segments (by number) to be seen as continuous memory - but no CPU instruction will support this, meaning that all pointer operations have to be done in user code.