Входящий сигнал можно регулировать при помощи потенциометра на входе."?
- Вложения
-
- cxema.gif
- (28.15 КБ) 501 скачивание
Предыдущую схему не зачли как работу по микропроцессорам?sanya129 писал(а):Люди может ли кто более подробно описать работу сия схемы

Код: Выделить всё
----------------------------------------------------------------------------------
-- Company:
-- Engineer:
--
-- Create Date: 15:19:09 06/11/2012
-- Design Name:
-- Module Name: hcalc - Behavioral
-- Project Name:
-- Target Devices:
-- Tool versions:
-- Description:
--
-- Dependencies:
--
-- Revision:
-- Revision 0.01 - File Created
-- Additional Comments:
--
----------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
---- Uncomment the following library declaration if instantiating
---- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;
entity hcalc is
Port ( mclk : in STD_LOGIC; -- входная частота 50 МГц
sw : in STD_LOGIC_VECTOR (7 downto 0); -- 8 переключателей
btn : in STD_LOGIC_VECTOR (3 downto 0); -- 4 кнопки
led : out STD_LOGIC_VECTOR (7 downto 0); -- 8 светодиодов
an : out STD_LOGIC_VECTOR (3 downto 0); -- аноды индикатора
seg: out STD_LOGIC_VECTOR (6 downto 0));-- сегменты индикатора
end hcalc;
architecture Behavioral of hcalc is
type optype is (plus, minus, mult, result);
signal nextop : optype := result; -- объявляем 4 типа операций
signal accumulator : STD_LOGIC_VECTOR (15 downto 0) := (others => '0'); -- аккумулятор
signal opresult : STD_LOGIC_VECTOR (23 downto 0); -- регистр результата
signal mclkdivider : STD_LOGIC_VECTOR (19 downto 0); -- счетчик делителя частоты
signal outdata : STD_LOGIC_VECTOR (3 downto 0); -- промежуточный сигнал для отображения
-- регистры подавления дребезга контактов кнопки.
signal debounce1 : STD_LOGIC_VECTOR (3 downto 0) := (others => '0');
signal debounce2 : STD_LOGIC_VECTOR (3 downto 0) := (others => '0');
signal debounce3 : STD_LOGIC_VECTOR (3 downto 0) := (others => '0');
signal debounce4 : STD_LOGIC_VECTOR (3 downto 0) := (others => '0');
-- 7-segment font generator
constant dig_0:std_logic_vector := "0111111";
constant dig_1:std_logic_vector := "0000110";
constant dig_2:std_logic_vector := "1011011";
constant dig_3:std_logic_vector := "1001111";
constant dig_4:std_logic_vector := "1100110";
constant dig_5:std_logic_vector := "1101101";
constant dig_6:std_logic_vector := "1111101";
constant dig_7:std_logic_vector := "0100111";
constant dig_8:std_logic_vector := "1111111";
constant dig_9:std_logic_vector := "1101111";
constant dig_a:std_logic_vector := "1110111";
constant dig_b:std_logic_vector := "1111100";
constant dig_c:std_logic_vector := "1011000";
constant dig_d:std_logic_vector := "1011110";
constant dig_e:std_logic_vector := "1111001";
constant dig_f:std_logic_vector := "1110001";
begin
led <= sw; -- состояние переключателей сразу выводим на светодиоды для контроля.
-- Здесь делим входную частоту 50МГц на 2^20 степени. Период повторения около 21мс.
process (mclk)
begin
if mclk'event and mclk='1' then
mclkdivider <= mclkdivider+1;
if mclkdivider = 0 then -- Этот if имеет период повторения около 21мс.
debounce4 <= debounce3; -- с такой периодичностью состояние кнопок последовательно
debounce3 <= debounce2; -- сдвигается по этим регистрам.
debounce2 <= debounce1;
debounce1 <= btn;
-- когда отлавливается ситуация, что 3 такта подряд (63мс) есть установившееся нажатие на
-- кнопку, но перед этим не было ни одной нажатой выполняем "действие"
if debounce4 = 0 and debounce4 /= debounce3 and debounce3=debounce2 and debounce2=debounce1 and debounce1=btn then
-- по комбинации нажатых кнопок определяем тип операции
case btn is
when "1000" => nextop <= plus;
when "0100" => nextop <= minus;
when "0010" => nextop <= mult;
when "0001" => nextop <= result;
when others => nextop <= result; -- если разом было нажато несколько кнопок (что очень маловероятно, но возможно!)
end case;
-- Если в предыдущий(!) раз была заявлена операция - её выполняем и результат
-- сохраняем в регистре opresult. Только надо учитывать, что он 24-разрядный.
-- поэтому так как результат сложения и вычитания 16-ти разрядный - старшие разряды
-- заполняем нулями.
case nextop is
when plus => opresult <= x"00" & accumulator + sw;
when minus => opresult <= x"00" & accumulator - sw;
when mult => opresult <= accumulator * sw;
when others => opresult <= x"0000" & sw;
end case;
else
-- здесь результат предыдущей операции переносим в акуумулятор для использования в
-- следующей операции.
accumulator <= opresult (15 downto 0);
end if;
end if;
end if;
end process;
-- Здесь логика вывода значения аккумулятора на индикатор.
-- Используются 16-й и 17-й разряды делителя, которые меняются с частотой около 1кГц
-- 50000000 / 65536 = 762, в результате чего частота обновления составляет 190Гц.
-- Этим селектом выбираем анод разряда
with mclkdivider (17 downto 16) select
an <= (0=>'0', others=>'1') when "00",
(1=>'0', others=>'1') when "01",
(2=>'0', others=>'1') when "10",
(3=>'0', others=>'1') when "11",
(others=>'-') when others;
-- Этим соответствующий разряду код
with mclkdivider (17 downto 16) select
outdata <= accumulator (3 downto 0) when "00",
accumulator (7 downto 4) when "01",
accumulator (11 downto 8) when "10",
accumulator (15 downto 12) when "11",
(others => '-') when others;
-- А здесь выбранный двоичный код по таблице преобразуется в 7-ми сегментное начертание
with outdata (3 downto 0) select
seg <= not dig_0 when "0000",
not dig_1 when "0001",
not dig_2 when "0010",
not dig_3 when "0011",
not dig_4 when "0100",
not dig_5 when "0101",
not dig_6 when "0110",
not dig_7 when "0111",
not dig_8 when "1000",
not dig_9 when "1001",
not dig_a when "1010",
not dig_b when "1011",
not dig_c when "1100",
not dig_d when "1101",
not dig_e when "1110",
not dig_f when "1111",
(others => '-') when others;
end Behavioral;
ну понятно - методички открываем только перед сессией за неделю...бла....бла....бла....бла.. вроде ходил вроде посещал ..бла....бла....бла..
Обычно читать методичку имеет смысл только после того, как почитаешь еще что то другое.романыч писал(а):нифга понять не могу в их методичках
, то есть Вам помогли в ответ на Ваш вопрос , не так ли ? Или Вы тогда наврали ? Или Вы сейчас врёте ?1winner@mail.ru писал(а):Прошил, собрал, работает как и было необходимо, большое спасибо!
На правах "офтопа" :"И не отвращайся от просящего.."
некто во флейме некоего форума писал(а):Здравствуйте, уважаемые болтуны а также те, кто занимаются "тролингом" профессионально. Прошу помощи, накидать прошивку на вентилятор. Суть: в любом разделе постоянно циклично присутствует новая ветка, каждые 3 дня "ап" и так по кругу. Если подробно: питание "тролю" подали - на выходе 1 "пост" через 3 дня меняется на другой еще через 3 дня меняется на третий и так по кругу, пока не пропадет питание. Тем кто этим занимается накидать такое на вентилятор - дело нескольких недель, а мне, начинающему "тролю", поможете большое дело сделатьЗаранее спасибо за мастер-класс !
Сюда перенес.
admin