Do not scroll in characters that are currently displayed
This commit is contained in:
@@ -10,7 +10,8 @@ entity scrolling_buffer is
|
||||
buffer_write : in std_logic;
|
||||
buffer_data : in std_logic_vector(4 downto 0);
|
||||
next_char : in std_logic;
|
||||
hex_char : out std_logic_vector(4 downto 0)
|
||||
hex_char : out std_logic_vector(4 downto 0);
|
||||
elements : out std_logic_vector(4 downto 0)
|
||||
);
|
||||
end entity scrolling_buffer;
|
||||
|
||||
@@ -34,12 +35,14 @@ begin
|
||||
ptr_last <= -1;
|
||||
ptr_write <= 0;
|
||||
ring_buffer <= (others => (others => '0'));
|
||||
elements <= (others => '0');
|
||||
else
|
||||
if buffer_write = '1' then
|
||||
ring_buffer(ptr_write) <= buffer_data;
|
||||
|
||||
if ptr_last /= BUFFER_SIZE - 1 then
|
||||
ptr_last <= ptr_write;
|
||||
elements <= std_logic_vector(to_unsigned(ptr_write + 1, 5));
|
||||
end if;
|
||||
|
||||
if ptr_write = BUFFER_SIZE - 1 then
|
||||
|
||||
@@ -15,7 +15,8 @@ entity scrolling_controller is
|
||||
seg_off : out std_logic;
|
||||
seg_shift : out std_logic;
|
||||
seg_write : out std_logic;
|
||||
seg_clear : out std_logic
|
||||
seg_clear : out std_logic;
|
||||
buffer_elements : in std_logic_vector(4 downto 0)
|
||||
);
|
||||
end entity scrolling_controller;
|
||||
|
||||
@@ -29,6 +30,8 @@ architecture Behavioral of scrolling_controller is
|
||||
signal sig_seg_write : std_logic;
|
||||
signal sig_seg_clear : std_logic;
|
||||
|
||||
signal shift_state : integer range 1 to 16;
|
||||
|
||||
begin
|
||||
|
||||
process(clk)
|
||||
@@ -77,7 +80,7 @@ begin
|
||||
sig_seg_clear <= '0';
|
||||
cnt_start <= '0';
|
||||
next_char <= '0';
|
||||
else -- cnt_cone = '1'
|
||||
else -- cnt_done = '1'
|
||||
state <= s_update;
|
||||
sig_seg_shift <= '0';
|
||||
sig_seg_write <= '0';
|
||||
@@ -114,14 +117,25 @@ begin
|
||||
seg_shift <= '0';
|
||||
seg_write <= '0';
|
||||
seg_clear <= '1';
|
||||
shift_state <= 16;
|
||||
else
|
||||
if sig_seg_data_in = '1' then
|
||||
seg_data <= hex_char(3 downto 0);
|
||||
seg_off <= hex_char(4);
|
||||
seg_write <= '0';
|
||||
|
||||
if sig_seg_data_in = '1' and shift_state <= unsigned(buffer_elements) then
|
||||
seg_write <= sig_seg_write;
|
||||
end if;
|
||||
|
||||
if sig_seg_shift = '1' then
|
||||
if shift_state = 16 then
|
||||
shift_state <= 1;
|
||||
else
|
||||
shift_state <= shift_state + 1;
|
||||
end if;
|
||||
end if;
|
||||
|
||||
seg_data <= hex_char(3 downto 0);
|
||||
seg_off <= hex_char(4);
|
||||
seg_shift <= sig_seg_shift;
|
||||
seg_write <= sig_seg_write;
|
||||
seg_clear <= sig_seg_clear;
|
||||
end if;
|
||||
end if;
|
||||
|
||||
@@ -32,6 +32,7 @@ architecture Behavioral of wb_scrolling is
|
||||
signal buffer_clear : std_logic;
|
||||
signal buffer_write : std_logic;
|
||||
signal buffer_data : std_logic_vector(4 downto 0);
|
||||
signal buffer_elements : std_logic_vector(4 downto 0);
|
||||
|
||||
signal seg_data : std_logic_vector(3 downto 0);
|
||||
signal seg_off : std_logic;
|
||||
@@ -68,7 +69,8 @@ architecture Behavioral of wb_scrolling is
|
||||
buffer_write : in std_logic;
|
||||
buffer_data : in std_logic_vector(4 downto 0);
|
||||
next_char : in std_logic;
|
||||
hex_char : out std_logic_vector(4 downto 0)
|
||||
hex_char : out std_logic_vector(4 downto 0);
|
||||
elements : out std_logic_vector(4 downto 0)
|
||||
);
|
||||
end component;
|
||||
|
||||
@@ -85,7 +87,8 @@ architecture Behavioral of wb_scrolling is
|
||||
seg_off : out std_logic;
|
||||
seg_shift : out std_logic;
|
||||
seg_write : out std_logic;
|
||||
seg_clear : out std_logic
|
||||
seg_clear : out std_logic;
|
||||
buffer_elements : in std_logic_vector(4 downto 0)
|
||||
);
|
||||
end component;
|
||||
|
||||
@@ -122,7 +125,8 @@ begin
|
||||
buffer_write => buffer_write,
|
||||
buffer_data => buffer_data,
|
||||
next_char => next_char,
|
||||
hex_char => hex_char
|
||||
hex_char => hex_char,
|
||||
elements => buffer_elements
|
||||
);
|
||||
|
||||
controller: scrolling_controller
|
||||
@@ -138,7 +142,8 @@ begin
|
||||
seg_off => seg_off,
|
||||
seg_shift => seg_shift,
|
||||
seg_write => seg_write,
|
||||
seg_clear => seg_clear
|
||||
seg_clear => seg_clear,
|
||||
buffer_elements => buffer_elements
|
||||
);
|
||||
|
||||
seven_segment: seven_segment_display
|
||||
|
||||
@@ -66,7 +66,7 @@ BEGIN
|
||||
data(24) <= '1'; -- buffer_write
|
||||
data(20 downto 16) <= '0' & x"D"; -- buffer_data
|
||||
data(8) <= '0'; -- buffer_clear
|
||||
data(0) <= '1'; -- on_off
|
||||
data(0) <= '0'; -- on_off
|
||||
generate_sync_wb_single_write(slvi,slvo,clk,data);
|
||||
wait for CLK_PERIOD;
|
||||
|
||||
@@ -94,6 +94,14 @@ BEGIN
|
||||
generate_sync_wb_single_write(slvi,slvo,clk,data);
|
||||
wait for CLK_PERIOD;
|
||||
|
||||
data <= (others => '0');
|
||||
data(0) <= '1'; -- on_off
|
||||
generate_sync_wb_single_write(slvi,slvo,clk,data);
|
||||
wait for CLK_PERIOD;
|
||||
data <= (others => '0');
|
||||
data(0) <= '0'; -- on_off
|
||||
generate_sync_wb_single_write(slvi,slvo,clk,data);
|
||||
|
||||
wait for 100 us;
|
||||
|
||||
data <= (others => '0');
|
||||
@@ -128,6 +136,72 @@ BEGIN
|
||||
generate_sync_wb_single_write(slvi,slvo,clk,data);
|
||||
wait for CLK_PERIOD;
|
||||
|
||||
wait for 100 us;
|
||||
|
||||
data <= (others => '0');
|
||||
data(24) <= '1'; -- buffer_write
|
||||
data(20 downto 16) <= '0' & x"B"; -- buffer_data
|
||||
data(8) <= '0'; -- buffer_clear
|
||||
data(0) <= '0'; -- on_off
|
||||
generate_sync_wb_single_write(slvi,slvo,clk,data);
|
||||
wait for CLK_PERIOD;
|
||||
|
||||
data <= (others => '0');
|
||||
data(24) <= '1'; -- buffer_write
|
||||
data(20 downto 16) <= '0' & x"A"; -- buffer_data
|
||||
data(8) <= '0'; -- buffer_clear
|
||||
data(0) <= '0'; -- on_off
|
||||
generate_sync_wb_single_write(slvi,slvo,clk,data);
|
||||
wait for CLK_PERIOD;
|
||||
|
||||
data <= (others => '0');
|
||||
data(24) <= '1'; -- buffer_write
|
||||
data(20 downto 16) <= '0' & x"D"; -- buffer_data
|
||||
data(8) <= '0'; -- buffer_clear
|
||||
data(0) <= '0'; -- on_off
|
||||
generate_sync_wb_single_write(slvi,slvo,clk,data);
|
||||
wait for CLK_PERIOD;
|
||||
|
||||
data <= (others => '0');
|
||||
data(24) <= '1'; -- buffer_write
|
||||
data(20 downto 16) <= '1' & x"0"; -- buffer_data
|
||||
data(8) <= '0'; -- buffer_clear
|
||||
data(0) <= '0'; -- on_off
|
||||
generate_sync_wb_single_write(slvi,slvo,clk,data);
|
||||
wait for CLK_PERIOD;
|
||||
|
||||
data <= (others => '0');
|
||||
data(24) <= '1'; -- buffer_write
|
||||
data(20 downto 16) <= '0' & x"C"; -- buffer_data
|
||||
data(8) <= '0'; -- buffer_clear
|
||||
data(0) <= '0'; -- on_off
|
||||
generate_sync_wb_single_write(slvi,slvo,clk,data);
|
||||
wait for CLK_PERIOD;
|
||||
|
||||
data <= (others => '0');
|
||||
data(24) <= '1'; -- buffer_write
|
||||
data(20 downto 16) <= '0' & x"A"; -- buffer_data
|
||||
data(8) <= '0'; -- buffer_clear
|
||||
data(0) <= '0'; -- on_off
|
||||
generate_sync_wb_single_write(slvi,slvo,clk,data);
|
||||
wait for CLK_PERIOD;
|
||||
|
||||
data <= (others => '0');
|
||||
data(24) <= '1'; -- buffer_write
|
||||
data(20 downto 16) <= '0' & x"F"; -- buffer_data
|
||||
data(8) <= '0'; -- buffer_clear
|
||||
data(0) <= '0'; -- on_off
|
||||
generate_sync_wb_single_write(slvi,slvo,clk,data);
|
||||
wait for CLK_PERIOD;
|
||||
|
||||
data <= (others => '0');
|
||||
data(24) <= '1'; -- buffer_write
|
||||
data(20 downto 16) <= '0' & x"E"; -- buffer_data
|
||||
data(8) <= '0'; -- buffer_clear
|
||||
data(0) <= '0'; -- on_off
|
||||
generate_sync_wb_single_write(slvi,slvo,clk,data);
|
||||
wait for CLK_PERIOD;
|
||||
|
||||
wait for 100 us;
|
||||
|
||||
assert false report "Simulation terminated!" severity failure;
|
||||
|
||||
Reference in New Issue
Block a user