Перейти к содержанию
    

Начинаю работу с ПЛИС и VHDL. Имею несколько непонятностей. Часть вопросов будет совсем детской, но очень хочется разобраться.

 

1. Имеет ли смысл в VHDL типы variable и записи на подобии after 10 ns для синтезируемых прошивок ПЛИС, или это общие расширения языка? Может всегда надо использовать сигналы? потому что как применять переменны типа файл и флоат я вообще не представляю. А задержки присвоений сигналов были проигнорированы синтезатором если я правильно его понял.

 

2. Мне VHDL не дает применять знаки := ни с чем кроме переменных, имеет ли смысл применять := в законченных устройствах, или при грамотном написании все можно сделать и с помощью <=. Если можно приведите пример где грамотней было бы использовать := а не <= если такие есть.

 

3. Первый проект это фазовый дискриминатор, и ПЛИС считывает данные с 14 битной полярной АЦП, я сразу добавлением 0x2000 перевел числа из диапазона -8192..8191 в диапазон 0..16383, для простоты сложения и вычитания... стоит ли это делать или лучше было бы как-то рассказать VHDLу что это знаковые числа? Как?

 

4. Имеет ли смысл реализовывать деление на ПЛИС или лучше отдать это внешнему ДСП, я имею в виду, сколько тратят тактов уже написанные модули деления, и будет ли выигрыш их применения, если необходимо делать всего 2 редких деления.

 

5. generic – что это с точки зрения уже законченного устройства? Набор управляющих констант, или набор ограничений для последующего использования данного модуля? Если можно примеры как вы используете generic

 

6. Теперь вопрос уже по среде. ПЛИС xilinx spartan 3. среда разработки ихняя ISE 7.1. Пытался реализовать второй вариант со знаковым считыванием данных АЦП, написал

 

 

entity int_test is

Port ( clk : in std_logic;

rst :in std_logic;

in1 : in integer range -8192 to 8191;

in2 : in integer range -8192 to 8191;

out1 : out integer range -16384 to 16383;

max1 : out integer range -8192 to 8191);

end int_test;

 

 

architecture Behavioral of int_test is

signal MaxValue : integer range -8192 to 8191 :=-8192;

begin

process (clk)

begin

if clk='1' and clk'event then

out1<=in1+in2;

if rst='0' then

if MaxValue<in1 then

MaxValue<=in1;

end if;

else

MaxValue<=-8192;

end if;

end if;

end process;

 

max1<=MaxValue;

end Behavioral;

 

 

Синтезированная схема меня удовлетворила по виду. Но когда я попробовал промоделить, ModelSim сделал все входные сигналы по 16К бит, как будто это логические вектора с таким диапазоном индексов... это мой косяк или ModelSimа. Как вы решаете эту проблему, пока я не представляю себе возможность описать серьезное устройство без проверок в симуляторе.

 

 

Еще раз извиняюсь за детские вопросы, буду рад услышать на них ответы...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1. Имеет ли смысл в VHDL типы variable и записи на подобии after 10 ns для синтезируемых прошивок ПЛИС, или это общие расширения языка? Может всегда надо использовать сигналы? потому что как применять переменны типа файл и флоат я вообще не представляю. А задержки присвоений сигналов были проигнорированы синтезатором если я правильно его понял.

 

Нужно начать с того, что в VHDL есть конструкции синтезируемые и не синтезируемые. Как, например, Вы себе представляете задержку after 10 ns в железе? Конечно, ее реализация возможна, но очень многими способами. Отчасти поэтому ни один синтезатор эту конструкцию не синтезирует и в худшем случае просто проигнорирует, а в лучшем даст предупреждение.

 

Что касается variable - то это средство работы с локальными сигналами в процессах. Например, для использования в качестве промежуточных переменных - чтобы запись была более лаконичной и понятной. И variable вполне синтезируюся. :)

 

2. Мне VHDL не дает применять знаки := ни с чем кроме переменных, имеет ли смысл применять := в законченных устройствах, или при грамотном написании все можно сделать и с помощью <=. Если можно приведите пример где грамотней было бы использовать := а не <= если такие есть.

 

:= - присвоение используемое в теле процесса для variable. <= - параллельный оператор присваивания, используемый с signal'ами. Используется и то, и другое.

 

3. Первый проект это фазовый дискриминатор, и ПЛИС считывает данные с 14 битной полярной АЦП, я сразу добавлением 0x2000 перевел числа из диапазона -8192..8191 в диапазон 0..16383, для простоты сложения и вычитания... стоит ли это делать или лучше было бы как-то рассказать VHDLу что это знаковые числа? Как?

 

В каком коде выдает данные Ваш АЦП. От этого и нужно плясать. А вообще-то в VHDL есть для этой цели два базовых типа - signed и unsigned. :)

 

4. Имеет ли смысл реализовывать деление на ПЛИС или лучше отдать это внешнему ДСП, я имею в виду, сколько тратят тактов уже написанные модули деления, и будет ли выигрыш их применения, если необходимо делать всего 2 редких деления.

 

Реализация деления, как правило, занимает довольно много места. Если нет в этом крайней необходимости, то я предпочитаю эту операцию аппаратно не реализовывать, если только это не деление на степень двойки. :)

 

5. generic – что это с точки зрения уже законченного устройства? Набор управляющих констант, или набор ограничений для последующего использования данного модуля? Если можно примеры как вы используете generic

 

generic - это средство создания параметризованных блоков. Это могут быть как синтезируемые, так и не синтезируемые блоки. Иногда это бывает очень удобно. Например при моделировании вы можете жестко задать период тактового сигнала и везде писать, например, 20 ns. А можете ввести generic period ... и использовать его. Тогда при необходимости перехода с 20 на 40 нс вы измените только одну строчку, вместо множества. И т.п.

 

6. Теперь вопрос уже по среде. ПЛИС xilinx spartan 3. среда разработки ихняя ISE 7.1. Пытался реализовать второй вариант со знаковым считыванием данных АЦП, написал

 

Синтезированная схема меня удовлетворила по виду. Но когда я попробовал промоделить, ModelSim сделал все входные сигналы по 16К бит, как будто это логические вектора с таким диапазоном индексов... это мой косяк или ModelSimа. Как вы решаете эту проблему, пока я не представляю себе возможность описать серьезное устройство без проверок в симуляторе.

 

Честно говоря, я не совсем понял, что Вы имеете в виду под

сделал все входные сигналы по 16К бит

 

 

Еще раз извиняюсь за детские вопросы, буду рад услышать на них ответы...

 

Почитайте любую литературу по VHDL и многие вопросы прояснятся. :)

http://www.vhdl.org/comp.lang.vhdl/FAQ1.html

http://www.vhdl-online.de/tutorial/

 

И еще посмотрите вот этот краткий справочник по VHDL: http://www.eng.auburn.edu/department/ee/mgc/vhdl.html

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1. Спасибо, именно так я и понял. И если я правильно понял varibal integer и unsigned iteger - синтезируемые и в принципе локальный аналог сигнала. А какие еще типы синтезируемые?...

 

2. Получается это эквивалентные записи просто для разных типов? Я читал про последовательное блокирующие присвоение, и вроде как = - было блокирующие. Я так понял что <= просто привязать одно к другому сигналом... тут у меня пока путаница, пример и разницу в конструкции я видел, можно ли примеры когда целесообразно это применять... и если это просто эквивалентные записи как тогда с помощью <= реализовать

 

signal a_out: std_logic_vector(1 downto 0) :="00";

signal b_out: std_logic_vector(1 downto 0) :="00";

process (clk)

begin

if clk='1' and clk'event then

a_out<=b and c;

b_out<=a_out and d;

end if;

end process;

 

в этой конструкции как я понимаю с каждым клоком на б_оут будет защелкиваться то что было на a_out and d, a на a_out защелкиваться b and c. то есть аналоги FIFO

 

 

3, 6. АЦП выдает в стандартном знаковом формате, просто 14 бит. У меня стояла задача сравнения и вычитания и я присваивал эти значения сигналам, чтобы логика сравнения работала верно перевел данные в без знаковый формат с нулем по середине...

Использование integer я думаю такое как я описал в пункте 6. Но там у меня возникает следующая проблема

в описании входов стоит, например,

in1 :in ineteger range -10 to 10;

почему то в ModelSimе это представляется 20 битным вектором, не представляю как бороться...

 

4. понятно

 

5.понятно, а зачем используются не синтезируемые конструкции на практике? в исследовательских целях и удобства симуляции? или есть какой-то еще смысл?

 

 

 

большое спасибо за литературу, я сейчас читаю VHDL - язык описания электронной аппаратуры, Яицкого и Шабанова, и подозревал что это не очень хорошая книга, теперь понимаю что так оно и есть... почитаю предложенные вами.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1. Спасибо, именно так я и понял. И если я правильно понял varibal integer и unsigned iteger - синтезируемые и в принципе локальный аналог сигнала. А какие еще типы синтезируемые?...

 

signed,unsigned,integer,positive,natural,std_logic,std_logic_vector,std_ulogic,s

td_ulogic_vector,bit,bit_vector.

 

2. Получается это эквивалентные записи просто для разных типов? Я читал про последовательное блокирующие присвоение, и вроде как = - было блокирующие. Я так понял что <= просто привязать одно к другому сигналом... тут у меня пока путаница, пример и разницу в конструкции я видел, можно ли примеры когда целесообразно это применять... и если это просто эквивалентные записи как тогда с помощью <= реализовать

 

signal a_out: std_logic_vector(1 downto 0) :="00";

signal b_out: std_logic_vector(1 downto 0) :="00";

process (clk)

begin

if clk='1' and clk'event then

a_out<=b and c;

b_out<=a_out and d;

end if;

end process;

 

в этой конструкции как я понимаю с каждым клоком на б_оут будет защелкиваться то что было на a_out and d, a на a_out защелкиваться b and c. то есть аналоги FIFO

 

Когда Вы пишете на уровне RTL на VHDL нужно думать, как Ваши конструкции воспримет синтезатор и что он из этого сделает. В данном случае будет синтезировано два регистра, с выхода первого сигнал пойдет через комбинаторную схему на вход второго. Т.е. при изменении b или с результат сначала, действительно, будет зафиксирован в a_out, а потом уже повлияет (в следующем такте) на b_out. Если бы вы объявили a_out и b_out переменными в процессе, то результат на b_out был бы уже в первом такте.

Путаница, думаю, вызвана наличием такой сущности, как процесс. Нужно понимать, что процессы работают параллельно. При этом они работают параллельно с параллельными операторами присваивания "<=". При этом операторы внутри процесса выполняются последовательно, но "как бы" одновременно, если это касается работы с variable. Попробуйте на примере, это поможет понять разницу.

 

3, 6. АЦП выдает в стандартном знаковом формате, просто 14 бит. У меня стояла задача сравнения и вычитания и я присваивал эти значения сигналам, чтобы логика сравнения работала верно перевел данные в без знаковый формат с нулем по середине...

Использование integer я думаю такое как я описал в пункте 6. Но там у меня возникает следующая проблема

в описании входов стоит, например,

in1 :in ineteger range -10 to 10;

почему то в ModelSimе это представляется 20 битным вектором, не представляю как бороться...

 

Modelsim работает с integer так, как умеет. Т.е. он использует то точность представления, которую считает нужным использовать. Синтезатор имеет право давать другой результат представления. Если хотите точного представления данных - используйте тип данных signed.

 

5.понятно, а зачем используются не синтезируемые конструкции на практике? в исследовательских целях и удобства симуляции? или есть какой-то еще смысл?

 

В основном для удобства моделирования и верификации. Работу с файлом невозможно синтезировать, зато при моделировании Вы можете читать из файла эталонные данные для сравнения результатов или задания воздействий. И т.п.

 

большое спасибо за литературу, я сейчас читаю VHDL - язык описания электронной аппаратуры, Яицкого и Шабанова, и подозревал что это не очень хорошая книга, теперь понимаю что так оно и есть... почитаю предложенные вами.

 

Литературы много, нужно только почитать. :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

спасибо еще раз.

 

Беспокоит только 2 момента

 

1.

я писал пример

in ineteger range -10 to 10;

ModelSimе это представляется 20 битным вектором

 

 

в реальной программе, так как АЦП 14 бит, было

in1: in ineteger range -8192 to 8191;

и МоделCим представил входные данные вектором из

8192+8191=16383 битов, хотя если смотреть RTL то там честные 14 бит складываются, сравниваются, на выход подаются...

если я напишу

in1: in signed range -8192 to 8191;

это поможет? или это неисправимый косяк ModelSimа?

 

2.

я сделал примеры с := и с <=. И из них я понял что первый работает только с переменными, второй только с сигналами. И применение <= равносильно физическому соединению сигналов, как бы проводками, а := соответствует как бы описанию того что чему равно, и соответственно объединяется в случае если а:=b, b:=c, в итоге за один такт получаем и a и b оба ровны c

 

нюансы применения <= понятны

a <= c and b and d

сделает общее присвоение

a1 <= c and b

a2<= a1 and d

последовательное, с промежуточной защелкой результата в a2

(я имею ввиду если повесить на event клока, иначе разница будет только на время распространения сигнала и работы логики)

 

в случае :=

a1 := c and b

a2 := a1 and d

получаем равносильную запись с сигналами

a <= c and b and d

а как сделать последовательную, такую как

a1 <= c and b

a2<= a1 and d

или с переменными это невозможно?

 

И последние что пришло мне на ум. Всегда ли записи вида

If clk=’1’ and clk’event then

a1 <= in1

a2<= a1

a3<= a2

end if;

будут работать как FIFO, и последовательно продвигать значения in1 по списку? Или может быть гонка сигналов, и потери некоторых значений… если будут потери, как детерминировать этот процесс?

 

очень понравилось - http://www.eng.auburn.edu/department/ee/mgc/vhdl.html, позволит быстро доделать проект спасибо

Изменено пользователем Golikov A.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

спасибо еще раз.

 

Беспокоит только 2 момента

 

1.

я писал пример

in ineteger range -10 to 10;

ModelSimе это представляется 20 битным вектором

 

 

в реальной программе, так как АЦП 14 бит, было

in1: in ineteger range -8192 to 8191;

и МоделCим представил входные данные вектором из

8192+8191=16383 битов, хотя если смотреть RTL то там честные 14 бит складываются, сравниваются, на выход подаются...

если я напишу

in1: in signed range -8192 to 8191;

это поможет? или это неисправимый косяк ModelSimа?

 

Modelsim использует представление integer, как 32-х разрядного числа. То, что Вы пишете integer range ... to ... лишь говорит ему в каких пределах должно лежать значение переменной или сигнала, но не влияет на внутреннее представление, которое Вы наблюдаете на диаграмме. В то же время синтезатор прекрасно понимает подобные ограничения и делает честные 14 бит. В общем, не обращайте на это внимания. Или используйте типы а-ля vector с точным указанием их разрядности.

 

2.

я сделал примеры с := и с <=. И из них я понял что первый работает только с переменными, второй только с сигналами. И применение <= равносильно физическому соединению сигналов, как бы проводками, а := соответствует как бы описанию того что чему равно, и соответственно объединяется в случае если а:=b, b:=c, в итоге за один такт получаем и a и b оба ровны c

 

В общем, правильно. :) Только вычисляются и используются значения типа переменной строго последовательно, но за один шаг моделирования. Т.е. в случае а:=b, b:=c в первом такте вы получите неизменное значение а при изменившемся с. А изменится во втором такте. Но если вы напишете b:=c,a:=b, то результат будет иным. Попробуйте и убедитесь в этом сами.

 

в случае :=

a1 := c and b

a2 := a1 and d

получаем равносильную запись с сигналами

a <= c and b and d

а как сделать последовательную, такую как

a1 <= c and b

a2<= a1 and d

или с переменными это невозможно?

 

a2 := a1 and d

a1 := c and b

 

И последние что пришло мне на ум. Всегда ли записи вида

If clk='1' and clk'event then

a1 <= in1

a2<= a1

a3<= a2

end if;

будут работать как FIFO, и последовательно продвигать значения in1 по списку? Или может быть гонка сигналов, и потери некоторых значений… если будут потери, как детерминировать этот процесс?

 

Всегда. Именно так описываются регистры на VHDL. http://www-ee.eng.hawaii.edu/~msmith/ASICs...CH12/CH12.6.htm

 

очень понравилось - http://www.eng.auburn.edu/department/ee/mgc/vhdl.html, позволит быстро доделать проект спасибо

 

Пожалуйста. :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

я бы рад не обращать внимания но невозможно симулировать...

in1 : in integer range -16 to 16

 

он пишет

in1[-16..16]

и когда предлагает ввести число, хочет чтобы было введено 32 битное число, а не 5 битное как должно бы было быть.

 

И поэтому в моей записе

in1 : integer range -8192 to 8191

он хочет 16000 битные вектора, он жутко тормозит при каждом действии, и соответственно неправильно представляет введенные числа... вот в чем проблема.

 

Ну в общем понятно, надо бороть ModelSim, запись для VHDL я так понимаю правильная... а есть форма задания переменной интежер но с указанием диапазона в битах а не в числах?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Используйте тип signed. Например, так:

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

entity int_test is
    Port ( clk : in std_logic;
        rst :in std_logic;
        in1 : in signed(13 downto 0);
        in2 : in signed(13 downto 0);
        out1 : out signed(13 downto 0);
        max1 : out signed(13 downto 0)
    );
end int_test;

architecture Behavioral of int_test is
    signal MaxValue : signed(13 downto 0) :=conv_signed(-8192,14);
begin

process (clk)
begin
if clk='1' and clk'event then
    out1<=in1+in2;
    if rst='0' then
        if MaxValue<in1 then
            MaxValue<=in1;
        end if;
    else
        MaxValue<=conv_signed(-8192,14);
    end if;
end if;
end process;

max1<=MaxValue;
end Behavioral;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

есть вопрос от другого новичка

если один и тот же сигнал типа natural меняется в двух разных процессах.

Как разрешить этот конфликт. В частности указать что изменение сигнала в одном процессе приоритетнее чем в другом?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

есть вопрос от другого новичка

если один и тот же сигнал типа natural меняется в двух разных процессах.

Как разрешить этот конфликт. В частности указать что изменение сигнала в одном процессе приоритетнее чем в другом?

 

Эту проблему можно решить c помощью ключевого слова guarded. Но это не самое хорошее решение для синтезируемых схем. Подробнее можно посмотреть, например, здесь - http://www.kvantn.com.ua/resourse/All/VHDL/VHDL_37.html

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

использование Signed генерит быструю, но странную схему... Причем мне так и не удалось ее просимулировать. Симуляторы хором писали кучу ошибок, одной из которых было неизвестная конструкция TO_INTEGER, а подключение библиотеки NUMERIC сразу выносит файл из синтезируемых...

 

Причем в решении когда диапазон -n..n перевел в 0..2n чтобы правильно учитывался знак в сравнении, ненамного медленнее, но не требует мультиплексоров для сброса мин и макс значения, так как в этом случае они ровны "1111…" и "0000…" а не "1000…" и "0111…" ( вектора по 14 бит естественно).

 

Вот такие вот дела... так что всех тонкостей использования SIGNED я не осознал.

 

 

А вот вопрос возник такой:

 

 

process (D_RDY)

begin

if D_RDY='1' and D_RDY'event then

if RESET='1' then

AMPLETUDE <= MAX - MIN;

MIN <="11111111111111";

MAX <="00000000000000";

else

if (MIN > ADC_VAL+"10000000000000")

MIN <+ ADC_VAL+"10000000000000";

if (MAX < ADC_VAL+"10000000000000")

MAX <= ADC_VAL+"10000000000000";

ADC_OUT <= ADC_VAL;

end if;

end if;

end process;

 

Почему то MIN и MAX имеют задержку по присвоению значения в 1 так по сравнению с ADC_OUT. По схеме она появляется перед компараторами, можно ли как-то ее насильно убрать?

 

 

и второе когда AMPLETUDE была UNSIGNED а MAX и MIN были SIGNED,

AMPLETUDE <= MAX - MIN; вот такое присвоение так и не получилось, какие преобразования я не делал... В большинстве случаев мне писали про то что сумма должна иметь 2 типа или как-то так, или что неправильные подтипы... Как правильно делается такое преобразование?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

использование Signed генерит быструю, но странную схему... Причем мне так и не удалось ее просимулировать. Симуляторы хором писали кучу ошибок, одной из которых было неизвестная конструкция TO_INTEGER, а подключение библиотеки NUMERIC сразу выносит файл из синтезируемых...

 

Нужно было подключить стандартные пакеты:

 

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

 

Причем в решении когда диапазон -n..n перевел в 0..2n чтобы правильно учитывался знак в сравнении, ненамного медленнее, но не требует мультиплексоров для сброса мин и макс значения, так как в этом случае они ровны "1111…" и "0000…" а не "1000…" и "0111…" ( вектора по 14 бит естественно).

 

Вот такие вот дела... так что всех тонкостей использования SIGNED я не осознал.

 

Нужно экспериментировать. :)

 

 

А вот вопрос возник такой:

 

process (D_RDY)

begin

if D_RDY='1' and D_RDY'event then

if RESET='1' then

AMPLETUDE <= MAX - MIN;

MIN <="11111111111111";

MAX <="00000000000000";

else

if (MIN > ADC_VAL+"10000000000000")

MIN <+ ADC_VAL+"10000000000000";

if (MAX < ADC_VAL+"10000000000000")

MAX <= ADC_VAL+"10000000000000";

ADC_OUT <= ADC_VAL;

end if;

end if;

end process;

 

Почему то MIN и MAX имеют задержку по присвоению значения в 1 так по сравнению с ADC_OUT. По схеме она появляется перед компараторами, можно ли как-то ее насильно убрать?

 

Тут налицо синтаксические ошибки. К тому же я не понял логики. Что Вы хотите получить

 

и второе когда AMPLETUDE была UNSIGNED а MAX и MIN были SIGNED,

AMPLETUDE <= MAX - MIN; вот такое присвоение так и не получилось, какие преобразования я не делал... В большинстве случаев мне писали про то что сумма должна иметь 2 типа или как-то так, или что неправильные подтипы... Как правильно делается такое преобразование?

 

AMPLETUDE <= CONV_UNSIGNED(MAX - MIN,14);

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1. Подключено было....

 

2. Да это как бы и есть результат экспериментов, я решил оставить вариант с преобразованием знакового формата в безнаковый, это требует 1 лишнего сумматора, и убирает 2 мультиплексора и константные сигналы... в скорости проигрываю 2-3 МГц что на фоне 127 для меня несущественно...

 

3. ошибки?... ой.. ну я по памяти писал. На самом деле все просто, когда убирается ресет, каждое входное значение с АЦП по сигналу D_RDY выводится наружу в ADC_OUT, а также сравнивается на минимальное и максимальное. Тем самым через период будем иметь амплитуду и каждый такт текущее значение АЦП. Раз в период поднимается сигнал RESET и в этот момент минимуму присваивается самое большое число, максимуму самое маленькое, а амплитуда высчитывается как макс - мин.

 

ошибку я вижу только в

MIN <+ ADC_VAL+"10000000000000";

надо читать

MIN <= ADC_VAL+"10000000000000";

 

эта схема работает, за одним исключением

если с АЦП идут сигналы 0 1 2 3 4 5 6

то каждый клок на ADC_OUT 0 1 2 3 4 5 6

а на MIN или MAX z 0 1 2 3 4 5

то есть запаздывание на 1 такт, лично я не понял почему...

 

4. Да вот это я и не попробовал:)... спасибо, но это уже на будущее я думаю... в данной схеме это ситуацию сильно не изменит как мне кажется, 1 лишний сумматор ничтожно мало от имеющегося количества...

Изменено пользователем Golikov A.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1. Подключено было....

 

Тогда странно. :blink:

 

3. ошибки?... ой.. ну я по памяти писал. На самом деле все просто, когда убирается ресет, каждое входное значение с АЦП по сигналу D_RDY выводится наружу в ADC_OUT, а также сравнивается на минимальное и максимальное. Тем самым через период будем иметь амплитуду и каждый такт текущее значение АЦП. Раз в период поднимается сигнал RESET и в этот момент минимуму присваивается самое большое число, максимуму самое маленькое, а амплитуда высчитывается как макс - мин.

 

Самом деле так делать нельзя. В идеале схема должна быть синхронной, в то время как у Вас работой схемы управляет фронт сигнала готовности, при этом сигнал сброса обрабатывается как синхронный по отношению к сигналу готовности. Так быть не должно.

 

Правильно будет поставить синхронизатор для сигнала готовности, если он асинхронный. То же самое касается сигнала сброса. После этого работать с ними как с синхронными сигналами. В противном случае Вы рано или поздно столкнетесь с состязаниями сигналов и необъяснимыми сбоями.

 

ошибку я вижу только в

MIN <+ ADC_VAL+"10000000000000";

надо читать

MIN <= ADC_VAL+"10000000000000";

 

эта схема работает, за одним исключением

если с АЦП идут сигналы 0 1 2 3 4 5 6

то каждый клок на ADC_OUT 0 1 2 3 4 5 6

а на MIN или MAX z 0 1 2 3 4 5

то есть запаздывание на 1 такт, лично я не понял почему...

 

ADC_VAL является входом, при этом судя по всему синтезатор генерирует для него защелку на входе. Это же значение поступает напрямую на ADC_OUT и используется вместо входного значения в операциях сравнения. Если Вы дадите полный пример кода, тогда можно будет сказать с большей определенностью. :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...