With all of that said, I'm a hardware guy and love FPGAs... Keep the videos coming!
I'm a software guy and I love FPGAs too In VHDL you can even use variables, procedures, functions and loops. But you have to keep in mind that it needs A LOT of logic units, because a loop is kind of unrolled and synthesized in parallel, same for procedures and functions. You have to sequence it with state machines from time to time, when it gets to big or when the timing requirements are not met anymore because of too long logic chains. Hardware guys don't like my VHDL code
I am a hardware/VHDL/Altera guy and I absolutely do not like the style VHDL is usually (at least what I have seen too many times in my work, so excuse my mini-rant) written.
Why everybody seems to insist on writing "clk'event and clk='1'" instead of more clear function "rising_edge(clk)"? Another thing is that most (V)HDL designers seem to be fans of cryptic magic numbers expressed in most inconvenient base and use them everywhere in the code which makes it unnecessarily difficult/impossible to maintain and reuse. For example, try to change clock frequency of a design which has clock cycle counts embedded that way in the code to produce a certain timing in seconds. Another thing is that use of variables (depending on the context, variables can be a "wire" or a "reg" in verilog terms) as "local signals" in processes seem to be non-existing, which would make it easy to duplicate/reuse the process without inventing new signal names or doing other refactoring and cluttering the design.
Most of the time the functions, procedures, records etc in VHDL do not actually make any more complex logic result, but they make the code much more readable and reusable if used properly.
Oh, and one simple pitfall of the FPGA design is that any external asynchronous signal, i.e. a signal which has no guaranteed timing referenced to a clock which FPGA logic is internally using, must be synchronized (using a chain of DFF's) separately to the internal clock. Failing to do that can cause much head-scratching (been there, done that!), as the system might react in completely unexpected way to that. If one looks at IO structures of a MCU, there usually is this kind of structure, so with MCUs one can live happily without ever stomping on this issue.
Regarding the timing stuff, TimeQuest timing analyzer is extremely useful part of Altera Quartus and is worth of getting familiar with (but you can definitely do "led-blinkers" without ever caring about it!). One should at least tell the clock frequency to it which the chip operates, so it can give a pretty good judgement if the design works or not. It can automatically derive PLL output clocks from PLL input clocks with "derive_pll_clocks" magic word in the .sdc file.
And finally, the SignalTap is extremely useful and versatile, I have even used a simple FPGA board and SignalTap as an substitute for a real logic analyzer, worked just fine
Regards,
Janne