VHDL, выход Спартан-3АН

У меня есть этот дизайн, который в основном представляет собой многофункциональный каландр со следующими функциями:

  1. отображает дату в этом [формате год/месяц/день: часы: минуты: секунды]
  2. Секундомер.
  3. Тревога .
  4. Опция повтора, когда будильник активен, и вы можете изменить период повтора или отключить будильник.
  5. события, которые будут сохранены в выбранную дату и время, и когда это произойдет, будет включена тревога.

это то, что я сделал для расчета часов [часы: минуты: секунды]

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity Clock is
port (clk : in std_logic;
      seconds : out integer ;
      minutes : out integer;
      hours : out integer
     );
end Clock;

architecture Behavioral of Clock is
        signal sec,min : integer range 0 to 60 := 0 ;
        signal hour : integer range 0 to 24 := 0 ;
begin
        seconds <= sec;
        minutes <= min;
        hours <= hour;

        process (clk)
        begin
            if (clk'event and clk='1') then
                sec <=sec+1 ;
                if (sec=60) then 
                    min <= min+1 ;
                    sec <= 0 ;
                    if (min=60) then 
                        hour <= hour +1;
                        min<=0;
                        if ( hour = 24) then
                            hour <= 0;
                        end if;
                    end if ;
                end if;
            end if;
        end process ;

end Behavioral;

и этот код, чтобы сделать остальную информацию о дате [Год/месяц/день]...

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity calender is
   port (
        clk : in std_logic;
      LYear     : in  std_logic;
      O_DAYS_IN_MONTH : out unsigned(4 downto 0)
      );
end entity calender;

architecture Behavioral of calender is

    signal hours :integer;
    signal Mday,day : integer range 1 to 31:=1;
    signal month: integer range 1 to 12:=1;
    signal year : integer range 2010 to 2030 :=2010;

begin
    u0 : entity work.Clock port map ( clk => clk , hours => hours );

    process ( clk,hours )
    begin 
        if (clk'event and clk='1') then
            if ( hours = 23 ) then 
                day <= day +1 ;
                if ( day = Mday ) then 
                    day <= 1;
                    month <= month +1 ;
                    if ( month = 13 ) then 
                        month <= 1 ;
                        year <= year +1;
                        if ( year = 2030 ) then 
                            year <= 2010;
                        end if;
                    end if;
                end if;
            end if;
        end if;
    end process;

    process ( month , LYear)
    begin
        if ( month = 9  or month = 4 or month = 6 or  month = 11) then 
            Mday <= 30;
        elsif ( month = 2 and LYear = '0') then 
            Mday <= 28 ;
        elsif ( month = 2 and LYear = '1') then 
            Mday <= 29;
        else 
            Mday <= 31;
        end if;
    end process;

   O_DAYS_IN_MONTH <= to_unsigned( Mday ,O_DAYS_IN_MONTH'length) ;                   

end architecture Behavioral;

Я также самостоятельно закодировал секундомер, который выходит на 7-сегментном спартанском 3, который выглядит следующим образом ...

library IEEE;                                                       
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity stop_watch is
port(
        clr: in std_logic;
        strt: in std_logic;
        clk : in std_logic;
        anode : out std_logic_vector (3 downto 0);
        seg : out std_logic_vector (7 downto 0)
        ); 
end stop_watch ;

architecture Behavioral of stop_watch is
    signal dig1,dig2,dig3,dig4:std_logic_vector (7 downto 0);
    signal clk10hz,clk1khz:std_logic;
begin


    process (clr,strt,clk10hz)
        variable d1,d2,d4:integer range 0 to 10;
        variable d3:integer range 0 to 6;
     begin
        if(clr='1')then
            d1:=0;
            d2:=0;
            d3:=0;
            d4:=0;
        elsif(clk10hz'event and clk10hz='1') then
            if(strt='0')then
                d1:=d1;
                d2:=d2;
                d3:=d3;
                d4:=d4;
            else
                d1:= d1+1;
                if(d1=10)then
                    d1:=0;
                    d2:=d2+1;
                end if;
                if(d2=10)then
                    d3:=d3+1;
                    d2:=0;
                end if;
                if(d3=6)then
                    d4:=d4+1;
                    d3:=0;
                end if; 
                if(d4=10)then
                    d4:=0;
                end if;
            end if;
        end if; 


        case d1 is 
            when 0 => dig1 <="10000001";
            when 1 => dig1 <="11001111";
            when 2 => dig1 <="10010010";
            when 3 => dig1 <="10000110";
            when 4 => dig1 <="11001100";
            when 5 => dig1 <="10100100";
            when 6 => dig1 <="10100000";
            when 7 => dig1 <="10001111";
            when 8 => dig1 <="10000000";
            when 9 => dig1 <="10001100";
            when 10 => dig1 <="10000001";
        end case;

        case d2 is
            when 0 => dig2 <="00000001";
            when 1 => dig2 <="01001111";
            when 2 => dig2 <="00010010";
            when 3 => dig2 <="00000110";
            when 4 => dig2 <="01001100";
            when 5 => dig2 <="00100100";
            when 6 => dig2 <="00100000";
            when 7 => dig2 <="00001111";
            when 8 => dig2 <="00000000";
            when 9 => dig2 <="00001100";
            when 10 => dig2 <="00000001";
        end case;

        case d3 is 
            when 0 => dig3 <="10000001";
            when 1 => dig3 <="11001111";
            when 2 => dig3 <="10010010";
            when 3 => dig3 <="10000110";
            when 4 => dig3 <="11001100";
            when 5 => dig3 <="10100100";
            when 6 => dig3 <="10100000";
        end case;

        case d4 is
            when 0 => dig4 <="00000001";
            when 1 => dig4 <="01001111";
            when 2 => dig4 <="00010010";
            when 3 => dig4 <="00000110";
            when 4 => dig4 <="01001100";
            when 5 => dig4 <="00100100";
            when 6 => dig4 <="00100000";
            when 7 => dig4 <="00001111";
            when 8 => dig4 <="00000000";
            when 9 => dig4 <="00001100";
            when 10 => dig4 <="00000001";
        end case;
    end process;


    process (clk)
        Variable Count: integer range 0 to 5000000 :=0;
    begin
        if (Clk'event and Clk ='1') then
            count := count+1;
            if ( count < 2500000 ) then
                clk10Hz <= '0';
            elsif (count = 2500000) then
                clk10Hz <= '1';
            elsif (count = 5000000) then
                clk10Hz <= '0' ; count := 0;
            end if; 
        end if;
    end process ;


    process (clk1Khz)
        variable cnt : integer range 0 to 3:= 0;
    begin
        if (clk1Khz'event and clk1Khz='1') then
            case cnt is
                when 0 => anode <="1110";
                    seg<= dig1;
                    cnt:=cnt+1;
                when 1 => anode <="1101";
                    seg<= dig2;
                    cnt:=cnt+1;
                when 2 => anode <="1011";
                    seg<= dig3;
                    cnt:=cnt+1;
                when 3 => anode <="0111";
                    seg <= dig4;
                    cnt:=0;
                end case;
        end if;
   end process;


    process (clk)
        Variable Count: integer range 0 to 50000 :=0;
    begin
        if (Clk'event and Clk ='1') then
            count := count+1;
            if ( count < 25000 ) then
                clk1Khz <= '0';
            elsif (count = 25000) then
                clk1Khz <= '1';
            elsif (count = 50000) then
                clk1Khz <= '0' ; count := 0;
            end if; 
        end if;
    end process ;


end     Behavioral; 

Теперь моя проблема..

Я должен вывести всю эту информацию на ЖК-дисплей в спартанском 3-AN, с которым у меня совершенно нет опыта, я знаю, что мой код еще не закончен, и мне все еще нужно делать некоторые деления часов, как я сделал в код секундомера, и я знаю, что деление часов будет изменено при взаимодействии с ЖК-дисплеем, поэтому я не стал писать его в своем коде, напишите сейчас. Если кто-нибудь может дать мне какую-либо информацию о том, как обращаться с ЖК-дисплеем, как отображать символы, как переходить от символа к другому, чтобы я мог изменить его, когда событие происходит с клавиатуры.

Вы можете сказать, что у меня нет опыта работы с этим ЖК-дисплеем в Spartan 3AN, я пытался увидеть руководство пользователя для платы, предоставленной xilinx, и я понял некоторые вещи из нее, но до сих пор не знаю, как ее использовать. Если есть какое-либо руководство, которое может помочь, этого будет более чем достаточно для меня.


person M.Sherin    schedule 17.12.2014    source источник
comment
В руководстве пользователя более-менее есть все, что нужно. Попробуйте прочитать его еще раз и начните пробовать. Если вам нужна дополнительная информация об интерфейсе, попробуйте поискать в Google HD44780 (эквивалентный и очень распространенный чип контроллера ЖК-дисплея).   -  person sonicwave    schedule 17.12.2014
comment
Вам не нужно изобретать велосипед. Например. opencores перечисляет несколько контроллеров LCD, таких как этот opencores.org/project,16x2_lcd_controller   -  person Paebbels    schedule 17.12.2014
comment
sonicwave ... ладно , тогда я попробую еще раз , если ничего не получится , тогда я поищу тот поиск , о котором вы говорили , спасибо приятель .   -  person M.Sherin    schedule 17.12.2014
comment
Paebbels ... он запрашивает у меня вход в систему, который требует проверки, которая займет 1-2 дня:/, но спасибо, приятель, посмотрит на нее после проверки o/   -  person M.Sherin    schedule 17.12.2014
comment
Если вы посмотрите на вопрос под названием Странное поведение VHDL здесь, в Stackoverflow, вы найдете код для почти рабочего драйвера. при условии. Ответ Галланда и его комментарии объясняют, что нужно исправить. Это было обнаружено при поиске в stackoverflow с использованием [vhdl] lcd, есть 28 результатов, я просмотрел 3/4, прежде чем найти его. Контроллер opencores использует 128-битные std_logic_vectors в качестве буферов строк, в то время как связанный вопрос SO просто записывает последовательные символы.   -  person    schedule 17.12.2014