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

zenia

Участник
  • Постов

    23
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный

Информация о zenia

  • Звание
    Участник
    Участник
  • День рождения 05.02.1981

Контакты

  • Сайт
    Array

Информация

  • Город
    Array
  1. вопрос тогда другой, если записать следующее signal run : unsigned(5 downto 0); process(clk) begin if run /= 0 then run <= run - 1; end if; end process; то значения run будет неопределенное, если ввести еще один сигнал то получим, что то путевое, signal run, bag : unsigned(5 downto 0); process(clk) begin if run /= 0 then bag <= run - 1; end if; end process; только декремента как такового не получиться, от сигнала run один раз отнимут 1-у и все. подскажите, как сделать декремент двоичного сигнала, и почему в VHDL не работает run <= run - 1; а вот в верилоге это работает
  2. после else в сигнал data_out , в младший его разряд записывают level, а что бы не было неопределенностей в в остальных разрядах перед этим просто дописываем 0-и во все разряды. signal run, level : unsigned(5 downto 0); да там ошибся. насчет ss да выразился не корректно, насчет "наоборот" , выходной сигнал имеет следующую форму - развернутые 0-и, потом level, и опять 0-и и level, и тд, у меня получается - level , далее развернутые 0и, и тд это показано на прикрепленном файле добавил clk в программу signal run, level : unsigned(5 downto 0); signal data_out : unsigned(31 downto 0); -- вх. сигнал signal ss : natural := 0; process(clk) begin if clk'event and clk='0' then ss <= TO_INTEGER (UNSIGNED(run)); -- преобразуем run в 10-е число if ss /= 0 then -- декремент ss ss <= ss - 1; data_out <= (others=>'0');--- записываем 0-и else -- если получили, что ss = 0 то записываем level data_out <= (others=>'0'); data_out(5 downto 0)<= level; end if; end if; как я понимаю свою проблему- ss изначально присвоен 0, в первом такте этот 0ль берется для анализа, ss <= TO_INTEGER (UNSIGNED(run)) - записывается в следующий такт. Отсюда получается вначале идет level, а потом развернутые 0-и. Как сделать наоборот я еще не придумал.
  3. Формирую выходную последовательность, состоящая из 2-к run и level, где run - количество 0-й стоящих перед level. signal run, level : unsigned(0 to 5); signal data_out : unsigned(31 downto 0); -- вх. сигнал signal ss : natural := 0; process(clk) begin ss <= TO_INTEGER (UNSIGNED(run)); -- преаброзуем run в 10-е число if ss /= 0 then -- проверяем, не равно ли это число 0-ю, если да то обнуляет его с каждым тактом ss <= ss - 1; data_out <= (others=>'0');--- записываем 0-и else -- если получили, что ss = 0 то записываем level data_out <= (others=>'0'); data_out(5 downto 0)<= level; end if; результаты получаться с точностью до наоборот, поясните в чем дело??? и как сделать, что бы нормально работало. run.doc
  4. имеете в виду дополнительно поставить if вот так : process(clk ) begin if clk'event and clk = '0' then if i = 2**ADDR_WIDTH-1 then i <= 0; else i <= i + 1; end if; end if; ram1(i) <= run; end process;
  5. а это как??? сигнал который подаеться на порт я так задаю signal data_in : unsigned(31 downto 0); process begin data_in <= "10011111111100001111111111111111"; wait for 50ns; data_in <= "00000000000000010000000000001100"; wait for 50ns; data_in <= "00000000000000110000011111111111"; wait for 50ns; data_in <= "10100000000000000000000000000000"; wait for 50ns; end process;
  6. вы имеете в виду, что в каждый if надо дополнительно вставить clk'event and clk = '0' если по спаду, тк у меня все сигнал устанавливаються по спаду clk
  7. по словам сенсорики вы понимаете сигнал стоящий после слова process(сигнал ) тогда все процессы надо именить и в списке чувствительности написать clk process(clk ) -- а раньше была data_in begin if i = 2**ADDR_WIDTH-1 then i <= 0; else i <= i + 1; end if; ram1(i) <= run; end process;
  8. На входе устройства 3 – и сигнала: data(32 битные данные), clk, wr_req(сигнал запроса записи). Информация передается из DMA, приходит с сигналом запроса на запись, на устройство поступает 1-й такт, обрабатывается и выдает сигнал wr_ack разрешения записи. И наш 1-й такт идет на выход, при этом может дополниться, или несколько тактов записаться на выход 0-и. После этого на вх. 2-й такт и все повторяется дальше. Проблема состоит в том, что не могу описать входное воздействие. Если его описать как порт, то в программе теста я задаю непрерывный сигнал, и дальше с ним так работать не возможно. Тогда я взял его записал в массив type c is array (2**ADDR_WIDTH - 1 downto 0) of unsigned(31 downto 0); signal data : c; process(clk) variable i : natural := 0; begin if i = 4 then i := 0; else data(i) <= data_in; i := i + 1; end if; end process; но все равно не получается работать с входными данными, массив 0 -31 вопрос как организовать правильно вх. Сигнал на VHDL, что бы выполнялись выше описанные условия??
  9. если вам не сложно, то нарисуйте
  10. data_out <= (others=>'0') - насчет этой строки, самый простой способ забить 0-и, можно и так data_out <="000000" ; - а разницы я не вижу, если есть, то говорите насчет массивов взял из одного примера на этом форуме, если знаете как правильно то опять говорите
  11. отчего же почетал, много литературы, среди них книга Бибило; Суворова Е.А Проектирование цифровых сстем на VHDL, Сергеенко А.М. VHDL для проектирования вычислительных устройств, итд Если, что не так вы говарите не стесняйтесь, тогда я буду испровляться.
  12. Вот навоял программку. сигналы run и level принимают толька 2-а значения(для простаты анализа, а так они имеют произвольные значения). В результате получил разворачивание 0-й, и последовательную запись level. library IEEE; use IEEE.std_logic_1164.all; use IEEE.NUMERIC_STD.all; entity temp is generic (ADDR_WIDTH : natural := 5); port( last : in std_logic; data_in : in unsigned(31 downto 0); data_out : out unsigned(0 to 5); clk : in std_logic ); end temp; architecture befevirol of temp is signal s, i, j, ss, sss, k: natural := 0; type a is array (2**ADDR_WIDTH - 1 downto 0) of unsigned(0 to 5); signal ram1, ram2 : a; signal run, level : unsigned(0 to 5); begin process(clk) begin -- входной сигнал 32 бита и в нем спрятана инф. о run и level run <= data_in(21 downto 16); level <= data_in(5 downto 0); end process; process(data_in) -- запись в массив ram1 сигнала run begin if i = 2**ADDR_WIDTH-1 then i <= 0; else i <= i + 1; end if; ram1(i) <= run; end process; process(data_in) -- запись в массив ram2 сигнала level begin if j = 2**ADDR_WIDTH-1 then j <= 0; else j <= j + 1; end if; ram2(j) <= level; end process; process(data_in)-- условие чтения из массивов и запись в выходной сигнал data_out begin if s = 2**ADDR_WIDTH-1 then-- поставил условие, что будем считывать из массива 32 коэффициента, но в реальности есть сигнал который указывает конец пакета run, level, про него я уточняю инф. s <= 0; else ss <= TO_INTEGER (UNSIGNED(ram1(s))); if ss /= 0 then -- разворачивание 0-й ss <= ss - 1; data_out <= (others=>'0'); else -- запись сигнала level s <= s + 1; data_out <= ram2(s); end if; end if; end process; end architecture befevirol ; вроде бы все. Если есть замечания к коду, то пожалуйсто говарите. Я вот еще думаю размерах массива, не знаю каой взять, в этоге это влияет на размер самого кристалла
  13. Это понятно, память часть разроботоваемого кристалла. Вот для примера - сигнал run записываем в массив, и все больше ничего с ним не делаем: type a is array (2**ADDR_WIDTH - 1 downto 0) of unsigned(0 to 5); signal ram1 : a; -- создали массив, где ADDR_WIDTH=5, и того array (32 downto 0) -- далее записываю сигнал run в наш массив process(data_in) begin if i = 2**ADDR_WIDTH-1 then i <= 0; else i <= i + 1; end if; ram1(i) <= run; end process; я так думаю такой структуры должна быть память. тоже самое можно зделать и с сигналом level а как управлять ей для моего случая????
  14. хорошо вопрос по памяти RAM имеем 2-а порта, один входной, другой на выход входную информацию записываем в массив??? я знаю только более простой способ хранения инф process(clk) begin if (clk'event and clk='1') then -- по фронту сигнала clk inf<=run; end if; end process; или там совсем другой метод. поясните...
  15. Вот такй еще вопрос - как на VHDL реализовать буфер, вот он у меня вообще не получаеться ну никак...
×
×
  • Создать...