3 changed files with 204 additions and 0 deletions
@ -0,0 +1,27 @@ |
|||||
|
[*] |
||||
|
[*] GTKWave Analyzer v3.3.98 (w)1999-2019 BSI |
||||
|
[*] Sat Jul 11 11:53:05 2020 |
||||
|
[*] |
||||
|
[dumpfile] "/home/maximilian/vga_uart_grabber_vhdl/string_sender.vcd" |
||||
|
[dumpfile_mtime] "Sat Jul 11 11:50:19 2020" |
||||
|
[dumpfile_size] 410742 |
||||
|
[savefile] "/home/maximilian/vga_uart_grabber_vhdl/string_sender.gtkw" |
||||
|
[timestart] 0 |
||||
|
[size] 1366 703 |
||||
|
[pos] -1 -1 |
||||
|
*-30.103638 200000000 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 |
||||
|
[treeopen] string_sender_tb. |
||||
|
[sst_width] 212 |
||||
|
[signals_width] 299 |
||||
|
[sst_expanded] 1 |
||||
|
[sst_vpaned_height] 179 |
||||
|
@28 |
||||
|
string_sender_tb.tb_i_clk |
||||
|
string_sender_tb.tb_i_reset_n |
||||
|
string_sender_tb.tb_o_send |
||||
|
@22 |
||||
|
string_sender_tb.tb_o_char[7:0] |
||||
|
@29 |
||||
|
string_sender_tb.tb_i_sent |
||||
|
[pattern_trace] 1 |
||||
|
[pattern_trace] 0 |
@ -0,0 +1,77 @@ |
|||||
|
library ieee; |
||||
|
use ieee.std_logic_1164.all; |
||||
|
use ieee.numeric_std.all; |
||||
|
|
||||
|
entity string_sender is |
||||
|
port ( |
||||
|
i_clk :in std_logic; |
||||
|
i_send_clk :in std_logic; |
||||
|
i_sent :in std_logic; |
||||
|
i_reset_n :in std_logic; |
||||
|
o_send :out std_logic; |
||||
|
o_char :out std_logic_vector(7 downto 0) |
||||
|
); |
||||
|
end; |
||||
|
|
||||
|
architecture string_sender_rtl of string_sender is |
||||
|
type z_sender_t is ( |
||||
|
idle, |
||||
|
wait_for_transmission, |
||||
|
sending |
||||
|
); |
||||
|
--Function to convert one char to std_logic_vector with 8 bit |
||||
|
function f_char_to_vector( |
||||
|
i_char : in character) |
||||
|
return std_logic_vector is |
||||
|
variable v_ret : std_logic_vector(7 downto 0); |
||||
|
begin |
||||
|
v_ret := std_logic_vector( |
||||
|
to_unsigned(natural(character'pos(i_char)),8) |
||||
|
); |
||||
|
return v_ret; |
||||
|
end function f_char_to_vector; |
||||
|
|
||||
|
begin |
||||
|
string_sender_main_proc: process(i_clk) |
||||
|
constant c_msg : string(1 to 13) := "Hello World!" & LF; |
||||
|
variable v_ind : integer range 0 to c_msg'length := 1; |
||||
|
variable v_old_clk : std_logic := '1'; |
||||
|
variable z_sender : z_sender_t := idle; |
||||
|
begin |
||||
|
if rising_edge(i_clk) then |
||||
|
if i_reset_n = '0' then |
||||
|
v_ind := 1; |
||||
|
v_old_clk := i_send_clk; |
||||
|
z_sender := idle; |
||||
|
o_send <= '0'; |
||||
|
o_char <= (others => '0'); |
||||
|
else |
||||
|
case z_sender is |
||||
|
when idle => |
||||
|
if (i_send_clk /= v_old_clk) then |
||||
|
v_old_clk := i_send_clk; |
||||
|
if (i_sent = '1') then |
||||
|
o_char <= f_char_to_vector(c_msg(v_ind)); |
||||
|
o_send <= '1'; |
||||
|
if v_ind = c_msg'length then |
||||
|
v_ind := 1; |
||||
|
else |
||||
|
v_ind := v_ind + 1; |
||||
|
end if; |
||||
|
z_sender := wait_for_transmission; |
||||
|
end if; |
||||
|
end if; |
||||
|
when wait_for_transmission => |
||||
|
if i_sent = '0' then |
||||
|
o_send <= '0'; |
||||
|
z_sender := sending; |
||||
|
end if; |
||||
|
when sending => |
||||
|
if (i_sent = '1') then |
||||
|
z_sender := idle; |
||||
|
end if; |
||||
|
end case; |
||||
|
end if; -- reset |
||||
|
end if; -- clk |
||||
|
end process string_sender_main_proc; |
||||
|
end; |
@ -0,0 +1,100 @@ |
|||||
|
library ieee; |
||||
|
use ieee.std_logic_1164.all; |
||||
|
use ieee.numeric_std.all; |
||||
|
|
||||
|
entity string_sender_tb is |
||||
|
end string_sender_tb; |
||||
|
|
||||
|
architecture string_sender_tb_rtl of string_sender_tb is |
||||
|
-- 10 MHz clock |
||||
|
constant c_CLK_PERIOD : time := 100 ns; |
||||
|
signal tb_i_clk : std_logic := '0'; |
||||
|
signal tb_i_send_clk : std_logic := '0'; |
||||
|
signal tb_i_sent : std_logic := '1'; |
||||
|
signal tb_i_reset_n : std_logic := '1'; |
||||
|
signal tb_o_send : std_logic := '0'; |
||||
|
signal tb_o_char : std_logic_vector(7 downto 0) := (others => '0'); |
||||
|
signal tb_done : std_logic := '0'; |
||||
|
begin |
||||
|
string_send_0: entity work.string_sender(string_sender_rtl) |
||||
|
port map ( |
||||
|
i_clk => tb_i_clk, |
||||
|
i_send_clk => tb_i_send_clk, |
||||
|
i_sent => tb_i_sent, |
||||
|
i_reset_n => tb_i_reset_n, |
||||
|
o_send => tb_o_send, |
||||
|
o_char => tb_o_char |
||||
|
); |
||||
|
-- Generate clock. |
||||
|
p_clock : process is |
||||
|
begin |
||||
|
if (tb_done = '0') then |
||||
|
tb_i_clk <= '0'; |
||||
|
wait for c_CLK_PERIOD/2; |
||||
|
tb_i_clk <= '1'; |
||||
|
wait for c_CLK_PERIOD/2; |
||||
|
elsif tb_done = '1' then |
||||
|
wait; |
||||
|
end if; |
||||
|
end process p_clock; |
||||
|
-- Generate send clock. |
||||
|
p_sclock : process is |
||||
|
begin |
||||
|
if (tb_done = '0') then |
||||
|
tb_i_send_clk <= '0'; |
||||
|
wait for 10*(c_CLK_PERIOD/2); |
||||
|
tb_i_send_clk <= '1'; |
||||
|
wait for 10*(c_CLK_PERIOD/2); |
||||
|
elsif tb_done = '1' then |
||||
|
wait; |
||||
|
end if; |
||||
|
end process p_sclock; |
||||
|
-- Process for stimuli. |
||||
|
p_stimuli : process is |
||||
|
begin |
||||
|
tb_i_reset_n <= '0'; |
||||
|
wait for 2*c_CLK_PERIOD; |
||||
|
tb_i_reset_n <= '1'; |
||||
|
wait for 1 ms; |
||||
|
tb_done <= '1'; |
||||
|
assert false report "end of test" severity note; |
||||
|
wait; |
||||
|
end process p_stimuli; |
||||
|
|
||||
|
p_ssp: process(tb_i_clk) |
||||
|
type z_ssp_t is ( |
||||
|
idle, |
||||
|
busy, |
||||
|
sending |
||||
|
); |
||||
|
variable v_cnt : integer range 0 to 20 := 0; |
||||
|
variable z_ssp : z_ssp_t := idle; |
||||
|
begin |
||||
|
if rising_edge(tb_i_clk) then |
||||
|
case z_ssp is |
||||
|
when idle => |
||||
|
if tb_o_send = '1' then |
||||
|
v_cnt := 0; |
||||
|
tb_i_sent <= '1'; |
||||
|
z_ssp := busy; |
||||
|
end if; |
||||
|
when busy => |
||||
|
if v_cnt = 10 then |
||||
|
v_cnt := 0; |
||||
|
tb_i_sent <= '0'; |
||||
|
z_ssp := sending; |
||||
|
else |
||||
|
v_cnt := v_cnt + 1; |
||||
|
end if; |
||||
|
when sending => |
||||
|
if v_cnt = 20 then |
||||
|
v_cnt := 0; |
||||
|
tb_i_sent <= '1'; |
||||
|
z_ssp := idle; |
||||
|
else |
||||
|
v_cnt := v_cnt + 1; |
||||
|
end if; |
||||
|
end case; |
||||
|
end if; |
||||
|
end process p_ssp; |
||||
|
end; |
Loading…
Reference in new issue