Важная информация

User Tag List

Страница 1 из 3 123 ПоследняяПоследняя
Показано с 1 по 10 из 24

Тема: VHDL process, обьясните как работает

  1. #1
    Guru Аватар для bigral
    Регистрация
    12.07.2006
    Адрес
    г. Киев, Украина
    Сообщений
    2,147
    Спасибо Благодарностей отдано 
    25
    Спасибо Благодарностей получено 
    95
    Поблагодарили
    82 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию VHDL process, обьясните как работает

    Вот смотрю шпаргалку по vhdl тут - https://www.ics.uci.edu/~jmoorkan/vhdlref/process.html и в ней говорится что process бывает ''clocked" типа такого:
    Код:
    process
    begin
      wait until CLK'event and CLK='1';
      Q1 <= D1;
    end process;
    и "combinational" типа такого:
    Код:
    process (A, B, SEL)
    begin
      Z <= B;
      if SEL='1' then
        Z <= A;
      end if;
    end process;
    A у меня вот такой случай что надо и то и другое сразу, ну я и сочинил такое:
    Код:
    	process(ppi_cs_n_int, reset_inp_n)
    	begin
    		if(reset_inp_n = '0') then
    			slots_enable <= '0';
    		else
    			if(ppi_cs_n_int'event and ppi_cs_n_int = '0') then
    				slots_enable <= '1';
    			end if;
    		end if;
    	end process;
    ppi_cs_n_int - это сигнал доступа к порту i8255 который в MSX применяется как mapper памяти, и как токо процессор обращается к i8255 нужно включить этот самый mapper аж до момента сброса (reset_inp_n = '0')

    Так вот вопрос, может ли процесс быть наполовину ''clocked" а наполовину ''combinational" (как я сочинил)? или это неправильно и если в "sensitivity list" есть сигнал который ''clocked" то данный процесс будет выполняться строго по "clock"-у этого сигнала? ну и тогда тот кусок надо бы переписать как:
    Код:
    process
    begin
         wait until ppi_cs_n_int'event and ppi_cs_n_int = '0';
         slots_enable <= '1';
    end process;
    
    process(reset_inp_n)
    begin
        if(reset_inp_n = '0') then
    	slots_enable <= '0';
        end if;
    end process;
    и таки интересно, как же насамом деле будет работать процесс в котором есть "clocked" сигнал но есть и другие сигналы в "sensitivity list", будет ли он запускаться при изменении этих сигналов тоже? или только по "clocked" сигналу?

  2. #1
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  3. #2
    Master
    Регистрация
    31.03.2008
    Адрес
    Москва
    Сообщений
    725
    Спасибо Благодарностей отдано 
    10
    Спасибо Благодарностей получено 
    75
    Поблагодарили
    34 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    По последнему коду:
    Управлять одним сигналом из двух процессов нельзя, компилятор не поймет.

    По первому коду:
    А то, что у вас, если не ошибаюсь - триггер с асинхронным сбросом. Навскидку, должно работать
    ZXM-Phoenix rev.01 2048K, VG93 hw emulator

  4. #3
    Guru Аватар для svofski
    Регистрация
    20.06.2007
    Адрес
    С.-Петербург
    Сообщений
    4,116
    Спасибо Благодарностей отдано 
    793
    Спасибо Благодарностей получено 
    658
    Поблагодарили
    403 сообщений
    Mentioned
    22 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    По-моему простой способ понять процессы, это представлять себе их как в железе. Комбинаторный, или непрерывный процесс — это обычная логика. Клочный процесс — это запись результата работы логики в память (регистр) по фронту тактирующего сигнала.

    Почти все описания клочных процессов включают в себя комбинаторику. Но можно записывать эти части и отдельно друг от друга. Посмотрите на реверснутые процессоры от Vslav, там как раз это видно. Поскольку это реальное железо, комбинаторика и регистры четко разделены. Люди так редко пишут.
    Больше игр нет

  5. #4
    Guru
    Регистрация
    16.12.2008
    Адрес
    Kharkov, Ukraina
    Сообщений
    2,221
    Спасибо Благодарностей отдано 
    4
    Спасибо Благодарностей получено 
    21
    Поблагодарили
    18 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Видимо bigral, имел ввиду вот такую штуку

    Нажмите на изображение для увеличения. 

Название:	slot_enb.jpg 
Просмотров:	78 
Размер:	78.5 Кб 
ID:	70144
    Электроника КР-02, MSX YIS-503IIR, Орион-128, Ленинград-2, Pentagon-128k, MSX2 YIS-503IIIR, MSX-EXT, ...

  6. #5
    Guru Аватар для svofski
    Регистрация
    20.06.2007
    Адрес
    С.-Петербург
    Сообщений
    4,116
    Спасибо Благодарностей отдано 
    793
    Спасибо Благодарностей получено 
    658
    Поблагодарили
    403 сообщений
    Mentioned
    22 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Это защелка, асинхронный элемент и как правило большой ататат в fpga.
    Больше игр нет

  7. #6
    Master
    Регистрация
    31.03.2008
    Адрес
    Москва
    Сообщений
    725
    Спасибо Благодарностей отдано 
    10
    Спасибо Благодарностей получено 
    75
    Поблагодарили
    34 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Про триггер с асинхронным сбросом:
    https://www.kit-e.ru/articles/circuit/2009_1_96.php
    Такая конструкция вполне себе синтезируема.
    ZXM-Phoenix rev.01 2048K, VG93 hw emulator

  8. #7
    Guru Аватар для bigral
    Регистрация
    12.07.2006
    Адрес
    г. Киев, Украина
    Сообщений
    2,147
    Спасибо Благодарностей отдано 
    25
    Спасибо Благодарностей получено 
    95
    Поблагодарили
    82 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от IanPo Посмотреть сообщение
    Про триггер с асинхронным сбросом:
    https://www.kit-e.ru/articles/circuit/2009_1_96.php
    Такая конструкция вполне себе синтезируема.
    ОПА! вот это да... что verilog каким-то образом поддерживает процесс С ДВУМЯ КЛОКАМИ???
    Код:
    module async_resetFFstyle2 (rst_n, clk, asyncrst_n);
      output rst_n;
      input clk, asyncrst_n;
      reg rst_n, rff1;
    
      always @(posedge clk or negedge asyncrst_n)
      if (!asyncrst_n) {rst_n,rff1} <= 2'b0;
      else {rst_n,rff1} <= {rff1,1'b1};
    endmodule
    это ж по идее не соответствует приведенному vhdl эквиваленту:
    Код:
    library ieee;
    use ieee.std_logic_1164.all;
    entity asyncresetFFstyle is
    port (
    	clk : in std_logic;
    	asyncrst_n : in std_logic;
    	rst_n : out std_logic);
    end asyncresetFFstyle;
    architecture rtl of asyncresetFFstyle is
    signal rff1 : std_logic;
    begin
    	process (clk, asyncrst_n)
    	begin
    		if (asyncrst_n = '0') then
    			rff1 <= '0';
    			rst_n <= '0';
    		elsif (clk'event and clk = '1') then
    			rff1 <= '1';
    			rst_n <= rff1;
    		end if;
    	end process;
    end rtl;
    - - - Добавлено - - -

    Цитата Сообщение от svofski Посмотреть сообщение
    Посмотрите на реверснутые процессоры от Vslav, там как раз это видно. Поскольку это реальное железо, комбинаторика и регистры четко разделены. Люди так редко пишут.
    а можно сюда скинуть кусок текста оттуда, ато тяжело мне понять как "люди редко пишут" и почему...

    - - - Добавлено - - -

    Цитата Сообщение от svofski Посмотреть сообщение
    Это защелка, асинхронный элемент и как правило большой ататат в fpga.
    У меня как бы дизайн под CPLD altera epm3064. Но интересно само это утверждение, которое для меня концептуально значит что ВСЕГДА надо как минимум 1 pin тратить на INPUT для какого-то CLOCK-a... что правда чтоли? неужели вообще не будет работать "по старинке" как оно на 556рт1 например работает (без clock-a вообще)
    Последний раз редактировалось bigral; 01.10.2019 в 18:20.

  9. #8
    Master Аватар для Xrust
    Регистрация
    12.04.2017
    Адрес
    г. Тольятти
    Сообщений
    906
    Спасибо Благодарностей отдано 
    204
    Спасибо Благодарностей получено 
    145
    Поблагодарили
    68 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

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

  10. #9
    Guru Аватар для bigral
    Регистрация
    12.07.2006
    Адрес
    г. Киев, Украина
    Сообщений
    2,147
    Спасибо Благодарностей отдано 
    25
    Спасибо Благодарностей получено 
    95
    Поблагодарили
    82 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Xrust Посмотреть сообщение
    bigral, будет и без клока работать. Тут речь о том, что асинхронные триггеры сами по себе генераторы проблем Если в схеме на обычной логике эти баги можно пофиксить навешиванием кондерчиков туда-сюда, то в CPLD с этим сложно, и лучше изначально от этого пути отказаться.
    Концепцию "асинхронные триггеры сами по себе генераторы проблем" не понял. Из всего изложенного в той ссылке про сброс, я вижу такие ключевые моменты:

    1. реальные FPGA очень быстрые по сравнению с логикой sn74xxx, изза этого очень короткая "иголка" 1...4нс длинной может вызвать срабатывание в то время как в обычной схеме на sn74xxx все работает нормально так как не хватает скорости реакции у микрух (ну и такое было у того же Vslav когда он подключал КР1801ВМ1 к плате ALTERA DE1, там были фантомные глюки, изза этих "коротких иголок", решилось все навешиванием кондеров на линии управляющей шины).
    2. для надежного сброса всех внутренних триггеров во внутренней схеме fpga предлагается завести CLOCK сигнал и как токо снаружи появляется сигнал reset_n из него сформировать "внутренний сигнал сброса reset_int_n" который "продержится" еще 1... или больше тиков этого CLOCK... считается что так все внутренние триггеры гарантированно сбросятся и будут в одном и том же состоянии на следующем после "reset_int_n" тике этого самого CLOCK. (но для моего случая, видимо это смысла не имеет, у меня 1 триггер и нету CLOCK-a).

  11. #10
    Activist Аватар для omercury
    Регистрация
    13.02.2016
    Адрес
    г. Королёв
    Сообщений
    493
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    12
    Поблагодарили
    11 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от bigral Посмотреть сообщение
    ОПА! вот это да... что verilog каким-то образом поддерживает процесс С ДВУМЯ КЛОКАМИ???
    Это список чувствительности. Означает, что что-то произойдёт по указанному в скобках событию. Также, как и в VHDL, только чуть точнее в данном написании.
    Чтоб совсем одинаково было, надо posedge/negedge убрать, тогда станут доступны оба перепада.
    И да, always @ вовсе не гарантирует триггеров в цикле, например такая запись:
    Код:
    reg q;
    always @(posedge clock) begin
        q = a & b;
    end
    создаст честную комбинаторику.


    Цитата Сообщение от bigral Посмотреть сообщение
    это ж по идее не соответствует приведенному vhdl эквиваленту:
    Вообще один-в-один.

    Кстати, вместо clk'event and clk = '1' можно писать rising edge clk.

Страница 1 из 3 123 ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Похожие темы

  1. Как работает графика?
    от SaintTurnip в разделе Корвет
    Ответов: 2
    Последнее: 23.02.2018, 09:00
  2. Ответов: 8
    Последнее: 19.10.2017, 15:08
  3. Как работает /RESET?
    от Gutten в разделе Несортированное железо
    Ответов: 5
    Последнее: 28.03.2014, 11:58
  4. как работает огибающая?
    от jerri в разделе Музыка
    Ответов: 6
    Последнее: 28.02.2014, 00:59
  5. Как в VHDL смешать бипер с PWM (AY и Covox)?
    от ILoveSpeccy в разделе Звук
    Ответов: 14
    Последнее: 21.04.2009, 18:03

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •