Scrolling Text on 7 segment Display

Status
Not open for further replies.

yttuncel

Junior Member level 3
Joined
Nov 18, 2012
Messages
30
Helped
0
Reputation
0
Reaction score
0
Trophy points
1,286
Activity points
1,663
BASYS2 Text Scrolling

Hello,

I am near to end in my project but stuck at some point. I can not resolve the problem

After deciding VHDL is having a hard time shifting indexes of arrays, I decided to change my shifter module. Now it is properly compiling and the RTL schematic seems true, but unfortunately I used a rather non-innovative way to shift the scancodes.

I defined an 64bit std_logic_vector that can hold up to 8 scancodes, and then parsed the 4 MSBmost bytes of this vector, and directed them to seven segment controller, that muxes the inputs and decides which seven segment will be enabled. I am thinking that I have problems with clock, but seeing nothing on the display makes me think some part of the device is malfunctioning. I am sure my keyboard controller works fine, as I tried it outindividually, shifter looks fine as well( I also tried this one on FPGA but without slowing the clock down, but nevertheless I was able to see the last scancode I entered), I haven't thought of any way/method to try out 7 segment controller, but that seems fine too. I don't know what the problem is



Shifter.vhd

Code VHDL - [expand]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
library IEEE;
    use IEEE.STD_LOGIC_1164.ALL;
    use IEEE.STD_LOGIC_UNSIGNED.ALL;
    use IEEE.numeric_std.all;
    
    entity my_shifter is
            port(clk      : in  std_logic;
                    Scan_Dav : in  std_logic;
                    Data_in  : in  std_logic_vector (7 downto 0);
                    O1 : out std_logic_vector(7 downto 0);
                    O2 : out std_logic_vector(7 downto 0);
                    O3 : out std_logic_vector(7 downto 0);
                    O4 : out std_logic_vector(7 downto 0)
                    );
    end my_shifter;
    
    architecture bhv of my_shifter is
    
    signal bytes : std_logic_vector(63 downto 0);
    begin
        process (clk) begin
            if rising_edge(clk) then
                    --if Scan_Dav = '1' then
                        bytes <= bytes (bytes'high-8 downto 0) & Data_in;
                    --end if;
              end if;
        end process;
         O1 <= bytes(63 downto 56);
         O2 <= bytes(55 downto 48);
         O3 <= bytes(47 downto 40);
         O4 <= bytes(39 downto 32);
    end bhv;


clkdivide.vhd

Code VHDL - [expand]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
library IEEE;
    use IEEE.STD_LOGIC_1164.ALL;
    use IEEE.STD_LOGIC_ARITH.ALL;
    use IEEE.STD_LOGIC_UNSIGNED.ALL;
    
    entity clkdivide is
        Port (clkin: in std_logic;
                clkout:out std_logic );
    end clkdivide;
    
    architecture Behavioral of clkdivide is
        signal int_clock:std_logic;
        begin
            clkout<=int_clock;
        process(clkin)
            variable var:integer range 0 to 12500 :=0;
            begin
                if (clkin'event and clkin = '1') then
                    if var = 12500 then
                        int_clock <= not int_clock; 
                        var:=0;
                    else 
                        var:=var+1;
                    end if;
                end if;
        end process;
    end Behavioral;


SevenSegmentControl.vhd:

Code VHDL - [expand]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
library IEEE;
    use IEEE.STD_LOGIC_1164.ALL;
    use IEEE.STD_LOGIC_UNSIGNED.ALL;
    use IEEE.STD_LOGIC_ARITH.ALL;
    
    entity SevenSegmentController is
        port (
            CLK: in std_logic;
            DEC1, DEC2, DEC3, DEC4: in std_logic_vector(7 downto 0);
            SEGMENTS: out std_logic_vector(6 downto 0);
            ANODES: out std_logic_vector(3 downto 0)
        );
    end SevenSegmentController;
    
    architecture Behavioral of SevenSegmentController is
       signal DecoderInput: std_logic_vector(7 downto 0);
        signal CurrentDisplay: std_logic_vector(1 downto 0) := "00";
        signal Prescaler: std_logic_vector(15 downto 0) := (others => '0');
    begin
    
        Multiplex: process(CLK)
        begin
            if rising_edge(CLK) then
                if Prescaler(15) = '0' then
                    Prescaler <= Prescaler + 1;
                else
                    CurrentDisplay <= CurrentDisplay + 1;
                    Prescaler <= (others => '0');
                end if;
            end if;
        end process Multiplex;
    
        SevenSegmentDecoder: entity work.SevenSegment_Decoder(Behavioral)
            generic map ( INVERT_OUTPUT => '1' )
            port map ( number => DecoderInput, segment => SEGMENTS );   
            
        DecoderInput <= DEC1 when CurrentDisplay = "00" else
                            DEC2 when CurrentDisplay = "01" else
                             DEC3 when CurrentDisplay = "10" else
                             DEC4 when CurrentDisplay = "11";
                             
       ANODES <= "0111" when CurrentDisplay = "00" else
                     "1011" when CurrentDisplay = "01" else
                     "1101" when CurrentDisplay = "10" else
                     "1110" when CurrentDisplay = "11";              
    
    end Behavioral;



Text is not scrolling.
Any help is greatly appreciated.

EDIT: By adjusting clocks (I changed Keyboard Controller's clock input and changed the divider output as well) I managed to read text on seven segment display. However it is buggy. When I press P and O, I read "PPPOO..". Any suggestions?
 
Last edited:

Status
Not open for further replies.

Similar threads

Cookies are required to use this site. You must accept them to continue using the site. Learn more…