Line 2... |
Line 2... |
--! http://www.fpga4fun.com/SerialInterface.html
|
--! http://www.fpga4fun.com/SerialInterface.html
|
library ieee;
|
library ieee;
|
use ieee.std_logic_1164.all;
|
use ieee.std_logic_1164.all;
|
use ieee.std_logic_unsigned.all;
|
use ieee.std_logic_unsigned.all;
|
use ieee.std_logic_arith.all;
|
use ieee.std_logic_arith.all;
|
|
use ieee.numeric_std.all;
|
|
|
--! Use CPU Definitions package
|
--! Use CPU Definitions package
|
use work.pkgDefinitions.all;
|
use work.pkgDefinitions.all;
|
|
|
entity baud_generator is
|
entity baud_generator is
|
Line 29... |
Line 30... |
half_cycle := '0' & cycle_wait(cycle_wait'high downto 1);
|
half_cycle := '0' & cycle_wait(cycle_wait'high downto 1);
|
genTick <= '0';
|
genTick <= '0';
|
elsif rising_edge(clk) then
|
elsif rising_edge(clk) then
|
-- Just decremented the cycle_wait by one because genTick would be updated on the next cycle
|
-- Just decremented the cycle_wait by one because genTick would be updated on the next cycle
|
-- and we really want to bring genTick <= '1' when (wait_clk_cycles = cycle_wait)
|
-- and we really want to bring genTick <= '1' when (wait_clk_cycles = cycle_wait)
|
if wait_clk_cycles = (cycle_wait - conv_std_logic_vector(1, (nBitsLarge-1))) then
|
if wait_clk_cycles = (cycle_wait - conv_std_logic_vector(1, nBitsLarge)) then
|
genTick <= '1';
|
genTick <= '1';
|
wait_clk_cycles := (others => '0');
|
wait_clk_cycles := (others => '0');
|
else
|
else
|
wait_clk_cycles := wait_clk_cycles + conv_std_logic_vector(1, (nBitsLarge-1));
|
wait_clk_cycles := wait_clk_cycles + conv_std_logic_vector(1, nBitsLarge);
|
-- If we're at half of the cycle
|
-- If we're at half of the cycle
|
if wait_clk_cycles = half_cycle then
|
if wait_clk_cycles = half_cycle then
|
genTick <= '0';
|
genTick <= '0';
|
end if;
|
end if;
|
end if;
|
end if;
|
|
|
|
-- Avoid creation of transparent latch (By default the VHDL will create an register for vectors that are assigned only in one
|
|
-- ocasion of a (if, case) instruction
|
|
half_cycle := '0' & cycle_wait(cycle_wait'high downto 1);
|
end if;
|
end if;
|
end process;
|
end process;
|
|
|
baud <= genTick;
|
baud <= genTick;
|
baud_oversample <= genTickOverSample;
|
baud_oversample <= genTickOverSample;
|
Line 55... |
Line 60... |
begin
|
begin
|
if rst = '1' then
|
if rst = '1' then
|
wait_clk_cycles := (others => '0');
|
wait_clk_cycles := (others => '0');
|
|
|
-- Divide cycle_wait by 4
|
-- Divide cycle_wait by 4
|
cycle_wait_oversample := '0' & cycle_wait(cycle_wait'high downto 1);
|
--cycle_wait_oversample := '0' & cycle_wait(cycle_wait'high downto 1);
|
cycle_wait_oversample := '0' & cycle_wait_oversample(cycle_wait_oversample'high downto 1);
|
--cycle_wait_oversample := '0' & cycle_wait_oversample(cycle_wait_oversample'high downto 1);
|
|
cycle_wait_oversample := "00" & cycle_wait(cycle_wait'high downto 2); -- Shift right by 2
|
|
|
|
|
-- Half of cycle_wait_oversample
|
-- Half of cycle_wait_oversample
|
half_cycle := '0' & cycle_wait_oversample(cycle_wait_oversample'high downto 1);
|
half_cycle := '0' & cycle_wait_oversample(cycle_wait_oversample'high downto 1); -- Shift right by 1
|
genTickOverSample <= '0';
|
genTickOverSample <= '0';
|
elsif rising_edge(clk) then
|
elsif rising_edge(clk) then
|
-- Just decremented the cycle_wait by one because genTick would be updated on the next cycle
|
-- Just decremented the cycle_wait by one because genTick would be updated on the next cycle
|
-- and we really want to bring genTick <= '1' when (wait_clk_cycles = cycle_wait)
|
-- and we really want to bring genTick <= '1' when (wait_clk_cycles = cycle_wait)
|
if wait_clk_cycles = (cycle_wait_oversample - conv_std_logic_vector(1, (nBitsLarge-1))) then
|
if wait_clk_cycles = (cycle_wait_oversample - conv_std_logic_vector(1, nBitsLarge)) then
|
genTickOverSample <= '1';
|
genTickOverSample <= '1';
|
wait_clk_cycles := (others => '0');
|
wait_clk_cycles := (others => '0');
|
else
|
else
|
wait_clk_cycles := wait_clk_cycles + conv_std_logic_vector(1, (nBitsLarge-1));
|
wait_clk_cycles := wait_clk_cycles + conv_std_logic_vector(1, nBitsLarge);
|
-- If we're at half of the cycle
|
-- If we're at half of the cycle
|
if wait_clk_cycles = half_cycle then
|
if wait_clk_cycles = half_cycle then
|
genTickOverSample <= '0';
|
genTickOverSample <= '0';
|
end if;
|
end if;
|
end if;
|
end if;
|
|
|
|
-- Avoid creation of transparent latch (By default the VHDL will create an register for vectors that are assigned only in one
|
|
-- ocasion of a (if, case) instruction
|
|
cycle_wait_oversample := "00" & cycle_wait(cycle_wait'high downto 2);
|
|
half_cycle := '0' & cycle_wait_oversample(cycle_wait_oversample'high downto 1);
|
end if;
|
end if;
|
end process;
|
end process;
|
|
|
end Behavioral;
|
end Behavioral;
|
|
|