ребят есть проблема очень похожая на вашу - разбираюсь с демокомплектом "basys" фирмы digilent, на котором стоит спартан xc3s100e tqg144
поставлена задача вывода информации на четырехразрядный семисегментный индикатор, например есть четыре счетчика срабатывающих по нажатию на клавиши - нужно вывести их содержимое.
вот код творения:
проблема - циферки выводятся все сразу на все разряды сразу из-за чего происходит полная каша и разобраться сколько же нащелкано на клавиши не удается
код приведенный господином Sll вводит платку в ступор из которого самостоятельно выйти не может...
быть может кто подскажет в чем ошибка моего кода?
поставлена задача вывода информации на четырехразрядный семисегментный индикатор, например есть четыре счетчика срабатывающих по нажатию на клавиши - нужно вывести их содержимое.
вот код творения:
Код: Выделить всё
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 вводит платку в ступор из которого самостоятельно выйти не может...
быть может кто подскажет в чем ошибка моего кода?
