* blink should display incrementing binary numbers at LED1-LED8 of the GateMate FPGA Starter Kit. * Increment is done with circa 9.5 Hzblink_with_pll
| @ -0,0 +1,52 @@ | |||||
| -- This design should display incrementing binary numbers | |||||
| -- at LED1-LED8 of the GateMate FPGA Starter Kit. | |||||
| library ieee ; | |||||
| use ieee.std_logic_1164.all; | |||||
| use ieee.numeric_std.all; | |||||
| entity blink is | |||||
| port ( | |||||
| clk_i : in std_logic; -- 10 MHz clock | |||||
| rst_n_i : in std_logic; -- SW3 button | |||||
| led_n_o : out std_logic_vector(7 downto 0) -- LED1..LED8 | |||||
| ); | |||||
| end entity blink; | |||||
| architecture rtl of blink is | |||||
| signal s_clk_cnt : unsigned(19 downto 0); | |||||
| signal s_clk_en : boolean; | |||||
| signal s_led : unsigned(led_n_o'range); | |||||
| begin | |||||
| process (clk_i, rst_n_i) is | |||||
| begin | |||||
| if (not rst_n_i) then | |||||
| s_clk_cnt <= (others => '0'); | |||||
| elsif (rising_edge(clk_i)) then | |||||
| s_clk_cnt <= s_clk_cnt + 1; | |||||
| end if; | |||||
| end process; | |||||
| s_clk_en <= s_clk_cnt = (s_clk_cnt'range => '1'); | |||||
| process (clk_i, rst_n_i) is | |||||
| begin | |||||
| if (not rst_n_i) then | |||||
| s_led <= (others => '0'); | |||||
| elsif (rising_edge(clk_i)) then | |||||
| if (s_clk_en) then | |||||
| s_led <= s_led + 1; | |||||
| end if; | |||||
| end if; | |||||
| end process; | |||||
| led_n_o <= not std_logic_vector(s_led); | |||||
| end architecture; | |||||
| @ -0,0 +1,26 @@ | |||||
| DESIGN_NAME := blink | |||||
| RTL_SRC := ../rtl/${DESIGN_NAME}.vhd | |||||
| SIM_SRC := tb_${DESIGN_NAME}.vhd | |||||
| VHD_STD := 08 | |||||
| .PHONY: all compile sim clean | |||||
| all: sim | |||||
| compile: tb_${DESIGN_NAME} | |||||
| tb_${DESIGN_NAME}: ${RTL_SRC} ${SIM_SRC} | work | |||||
| @echo "Analyze testbench & design ..." | |||||
| ghdl -a --std=${VHD_STD} -fpsl --workdir=work ${RTL_SRC} ${SIM_SRC} | |||||
| @echo "Elaborate testbench & design ..." | |||||
| ghdl -e --std=${VHD_STD} -fpsl --workdir=work $@ | |||||
| sim: tb_${DESIGN_NAME} | |||||
| @echo "Run testbench ..." | |||||
| ghdl -r tb_${DESIGN_NAME} --assert-level=error | |||||
| work: | |||||
| mkdir $@ | |||||
| clean: | |||||
| @echo "Cleaning simulation files ..." | |||||
| rm -rf tb_${DESIGN_NAME} *.o *.json work/ | |||||
| @ -0,0 +1,45 @@ | |||||
| library ieee ; | |||||
| use ieee.std_logic_1164.all; | |||||
| use ieee.numeric_std.all; | |||||
| use std.env.all; | |||||
| entity tb_blink is | |||||
| end entity tb_blink; | |||||
| architecture sim of tb_blink is | |||||
| signal s_clk : std_logic := '1'; | |||||
| signal s_rst_n : std_logic := '0'; | |||||
| signal s_led_n : std_logic_vector(7 downto 0); | |||||
| begin | |||||
| dut : entity work.blink | |||||
| port map ( | |||||
| clk_i => s_clk, | |||||
| rst_n_i => s_rst_n, | |||||
| led_n_o => s_led_n | |||||
| ); | |||||
| s_rst_n <= '1' after 1.2 us; | |||||
| s_clk <= not s_clk after 500 ns; | |||||
| -- Let's test the first 8 values of LED output | |||||
| process is | |||||
| begin | |||||
| wait until s_rst_n; | |||||
| wait until rising_edge(s_clk); | |||||
| for i in 0 to 7 loop | |||||
| report "LED: " & to_hstring(not s_led_n); | |||||
| assert to_integer(unsigned(not s_led_n)) = i | |||||
| report "LED error, got 0x" & to_hstring(s_led_n) & ", expected 0x" & to_hstring(to_unsigned(255-i, 8)) | |||||
| severity failure; | |||||
| wait until s_led_n'event; | |||||
| end loop; | |||||
| stop(0); | |||||
| end process; | |||||
| end architecture; | |||||
| @ -0,0 +1,21 @@ | |||||
| DESIGN_NAME := blink | |||||
| SRC_FILES := ../rtl/blink.vhd | |||||
| VHD_STD := 08 | |||||
| .PHONY: all syn | |||||
| all: ${DESIGN_NAME}_synth.vhd syn | |||||
| syn: ${DESIGN_NAME}.v | |||||
| ${DESIGN_NAME}.o: ${SRC_FILES} | |||||
| ghdl -a --std=${VHD_STD} ${SRC_FILES} | |||||
| ${DESIGN_NAME}_synth.vhd: ${SRC_FILES} | |||||
| ghdl --synth --std=$(VHD_STD) ${SRC_FILES} -e ${DESIGN_NAME} > $@ | |||||
| ${DESIGN_NAME}.v: ${DESIGN_NAME}.o | |||||
| yosys -m ghdl -p 'ghdl --std=${VHD_STD} --no-formal ${DESIGN_NAME}; synth_gatemate -nomx8 -vlog $@' | |||||
| clean : | |||||
| echo "# Cleaning files" | |||||
| rm -f *.o work*.cf ${DESIGN_NAME}.v ${DESIGN_NAME}_synth.vhd | |||||