Not bad.
Just took a look at a few source files. There's something I find a little odd about your code style though. You use no or very few "process" constructs and write many assignments with "when rising_edge(xxx)" directly in the architecture's body instead. I guess it's equivalent in the end, but it looks odd. Any reason for this style?
Finally someone noticed my unusual VHDL coding style
The main reason is I prefer to think in terms of circuits rather than a series of operations like in programming. To me
a <= expression when condition and rising_edge(clk)just means to create a flipflop fed by a combinational "expression", and with clock enable fed by "condition".
If you look at this code:
process(clk)
begin
if(rising_edge(clk)) then
if condition1 then
result <= func(a+x);
elsif condition2 then
result <= func(a+y);
end if;
end if;
end process;
It's ambiguous exactly what hardware it will generate; there will be a mux driven by a combinational function of condition1 and condition2, but it isn't clear if the mux will be before the adder, before func, or after func. There is also an implicit clock enable generated because "result" isn't assigned from all branches.
If I rewrite that snippet my way it would be:
muxXY <= x when condition1 else y;
sum1 <= a+muxXY;
result <= func(sum1) when (condition1 or condition2) and rising_edge(clk);
When you look at this code you can just visualize the circuit in your head, and you quickly realize you have a LONG combinational path of a mux feeding an adder feeding a combinational "func". You can also see that there are two paths, a data path and a clock enable path. The clock enable path is short and the data path is long, which you won't easily see with the process version. You can also more easily see exactly where your registers are this way and know what paths may be a timing problem before synthesis.
This style of coding and way of thinking was actually influenced by a professor at the university I went to; he always complained about computing science students in his class who design hardware as if they are writing code. His words were "when you write HDL you should imagine a circuit in your head, not an algorithm or a program".
I have just recently gotten into a habit of drawing a block diagram before writing any code, and by the time I actually write code it's simply a transcription of the diagram. Usually I will have a pretty good idea of how many LUTs a circuit will use before synthesizing it, and I can also design with specific FPGA primitives in mind like the SRL16 (an addressable shift register using 1/2 of a LUT). For example I had just finished designing and verifying an AXI skid buffer based on the SRL16 that uses about a half the number of LUTs compared to the Xilinx one and also fully registers all ports.
I would definitely recommend doing things this way if you are starting out with FPGA design; it should generalize well to verilog as well and you will be able to make designs running at 400MHz rather than <100MHz