Динамическая индикация на ПЛИС

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Родился
Сообщения: 5
Зарегистрирован: Чт дек 25, 2008 23:16:14

Сообщение od2elf »

ребят есть проблема очень похожая на вашу - разбираюсь с демокомплектом "basys" фирмы digilent, на котором стоит спартан xc3s100e tqg144
поставлена задача вывода информации на четырехразрядный семисегментный индикатор, например есть четыре счетчика срабатывающих по нажатию на клавиши - нужно вывести их содержимое.

вот код творения:

Код: Выделить всё

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

entity m is 
    Port (    clk :in std_logic; 
            btn : in  STD_LOGIC_VECTOR (3 downto 0); 
            sw : out std_logic_vector (3 downto 0); 
            seg : out STD_LOGIC_VECTOR (7 downto 0)); 
end m; 

architecture Behavioral of m is 
   signal cnt0: std_logic_vector (3 downto 0); 
    
   signal cnt1: std_logic_vector (3 downto 0):="0000"; 
   signal cnt2: std_logic_vector (3 downto 0):="0000"; 
   signal cnt3: std_logic_vector (3 downto 0):="0000"; 
   signal cnt4: std_logic_vector (3 downto 0):="0000"; 
    
   signal cnt: std_logic_vector (1 downto 0):="00"; 
    
begin 

btnCnt: process (btn) begin --обрабатываем кнопочки - считаем количество нажатий, считает криво, но это не важно 
   if  btn(0)'event and btn(0)='1' then 
      cnt1 <= cnt1 + 1;       
   end if; 
   if btn(1)'event and btn(1)='1' then 
      cnt2 <= cnt2 + 1; 
   end if; 
   if btn(2)'event and btn(2)='1' then 
      cnt3 <= cnt3 + 1; 
   end if; 
   if btn(3)'event and btn(3)='1' then 
      cnt4 <= cnt4 + 1; 
   end if;    
end process; 

clkDiv: process (clk) begin -- делим клок на 4 
   if rising_edge (clk) then 
      cnt <= cnt + 1; 
   end if; 
end process; 

with cnt select -- выбираем какой счетчик выводим 
   cnt0 <=    cnt1 when "00", 
            cnt2 when "01", 
            cnt3 when "10", 
            cnt4 when others; 

with cnt select -- выбираем в какой из четырех семисегментных индикаторов выводим 
   sw <= "0111" when "00", 
         "1011" when "01", 
         "1101" when "10", 
         "1110" when others; 

with cnt0 select -- дешифруем, не особо напрягаемся когда выводим больше девятки 
   seg <="01000000" when "0000", 
         "01111001" when "0001", 
         "00100100" when "0010", 
         "00110000" when "0011", 
         "00011001" when "0100", 
         "00010010" when "0101", 
         "00000010" when "0110", 
         "01111000" when "0111", 
         "00000000" when "1000", 
         "00010000" when "1001", 
         "01111111" when others; 
    
end Behavioral; 

проблема - циферки выводятся все сразу на все разряды сразу из-за чего происходит полная каша и разобраться сколько же нащелкано на клавиши не удается

код приведенный господином Sll вводит платку в ступор из которого самостоятельно выйти не может...

быть может кто подскажет в чем ошибка моего кода?
Реклама
SII
Вымогатель припоя
Сообщения: 635
Зарегистрирован: Пт янв 30, 2009 14:50:35
Откуда: Солнечногорск

Сообщение SII »

Почему мой код у Вас не работает, я, есно, угадать не могу -- но код точно рабочий. А вот у Вас явно слишком высокая частота регенерации изображения на индикаторе. Я встречал информацию, что она (частота) должна находиться в пределах примерно от 50 Гц и 1 кГц, ну а Вы делите опорную частоту (подозреваю, что 50 МГц) всего лишь на 4. На такой частоте светодиоды нормально работать вряд ли будут. Попробуйте делить примерно как я (чтобы получить на выходе в указанных пределах -- до 1 кГц).
Реклама
Родился
Сообщения: 5
Зарегистрирован: Чт дек 25, 2008 23:16:14

Сообщение od2elf »

спасибо, попробуем исправить =)
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»