Грендайзер 0 28 ноября, 2016 Опубликовано 28 ноября, 2016 · Жалоба Простите, что мешаю защёлками мерится, но вот такой вот вопросик проясните пожалуйста. ...Подскажите ещё. Вот возьмём такую конструкцию в VHDL: process(clk) begin if clk'event and clk = '1' then if en = '1' then a <= b; end if; end if; end process; Если a - сигнал, то на первом фронте тактового сигнала произойдёт проверка if en = '1'. А присвоение a <= b произойдёт на следующем фронте. Если же a- переменная, и выражение переписать как a:=b, то проверка и присвоение произойдёт на одном и том же фронте. А в verilog есть что то подобное? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 15 28 ноября, 2016 Опубликовано 28 ноября, 2016 · Жалоба process(clk) begin if clk'event and clk = '1' then if en = '1' then a <= b; end if; end if; end process; Если a - сигнал, то на первом фронте тактового сигнала произойдёт проверка if en = '1'. А присвоение a <= b произойдёт на следующем фронте. С чего вы взяли? Приходит фронт клока. Проверили en. Если да, то a <= b. Никаких первых и вторых фронтов. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Des333 0 28 ноября, 2016 Опубликовано 28 ноября, 2016 · Жалоба Вот это как раз пример кода "как делать не стОит". В данном примере получится латч. Почему - догадайтесь сами... Теперь Вам вопрос -- на сколько процентов Вы уверены в том, что получится латч? P.S. Я пытаюсь догадаться -- почему у нас на форуме последнее время увеличилось число сообщений, в которых люди утверждают что-то, чего не знают :) И, самое главное, хочу понять, что ими движет. То есть либо они думают, что разбираются в вопросе, но ошибаются. Либо они понимают, что не специалисты, но это не останавливает их от советов. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Грендайзер 0 28 ноября, 2016 Опубликовано 28 ноября, 2016 (изменено) · Жалоба С чего вы взяли? Приходит фронт клока. Проверили en. Если да, то a <= b. Никаких первых и вторых фронтов. Я не правильно выразился... Я имел в виду момент изменения сигнала en. Как на картинке, то, что описано кодом: elsif CLK'event and CLK = '1' then if clk_div_en = '1' then if rise_flag = '1' then SCLK <= '1'; ........................................ Если бы SCLK был бы переменной, то он перешёл бы в высокое состояние в момент, на котором установлена метка. Т.е. в момент изменения сигнала rise_flag. Изменено 28 ноября, 2016 пользователем Грендайзер Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
andrew_b 15 28 ноября, 2016 Опубликовано 28 ноября, 2016 · Жалоба Если бы SCLK был бы переменной, то он перешёл бы в высокое состояние в момент, на котором установлена метка. Т.е. в момент изменения сигнала rise_flag.Да в общем-то нет. В данном коде неважно, что такое SCLK -- сигнал или переменная. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Грендайзер 0 29 ноября, 2016 Опубликовано 29 ноября, 2016 · Жалоба Хм, быть может я что то перепутал. Как только появится время проэксперементирую. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Leka 0 29 ноября, 2016 Опубликовано 29 ноября, 2016 · Жалоба На всякий случай. Что получится при синтезе always-блока, не зависит от синтаксиса always_comb/always_ff, а только от содержимого блока. Например, синтез классического регистрового счетчика с always_comb - в Квартусе даже варнингов не будет: module top(clk,cnt); input clk; output [3:0] cnt; always_comb begin cnt++; @(posedge clk)$display("hello"); end endmodule Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Tausinov 0 29 ноября, 2016 Опубликовано 29 ноября, 2016 · Жалоба Этот вопрос меня насторожил - неужели в VHDL нет аналога Верилоговского блокирующего и неблокирующего присваивания? VHDL не знаю, сейчас посмотрел поверхностно - вроде как <= для сигналов, и := для переменных и являются аналогами неблокирующего и блокирующего присваиваний. Так это, или нет? Был бы благодарен, если кто-то даст сравнение VHDL и Verilog по блокирующим/неблокирующим присваиваниям - в плане принципиальных отличий. В VHDL любой сигнал можно использовать, как для последовательной логики, так и для комбинаторной. При этом для присвоения всегда будет использоваться один и тот же символ - "<=". Но, если мы хотим в описании процесса использовать для удобства промежуточный сигнал или добавить дополнительную комбинаторную логику между двумя регистрами, то используем variable и ":=" для присвоения. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Leka 0 29 ноября, 2016 Опубликовано 29 ноября, 2016 (изменено) · Жалоба В VHDL любой сигнал можно использовать, как для последовательной логики, так и для комбинаторной. При этом для присвоения всегда будет использоваться один и тот же символ - "<=". Но, если мы хотим в описании процесса использовать для удобства промежуточный сигнал или добавить дополнительную комбинаторную логику между двумя регистрами, то используем variable и ":=" для присвоения. Понятно, спасибо. Попробовал еще синтез простых схем в VHDL, сложилось такое впечатление: 1) В VHDL отсутствует деление последовательных блоков на комбинационные и регистровые, как в SV. В VHDL в одном последовательном блоке можно смешивать комбинационные и регистровые присваивания, в SV такое невозможно даже для разных цепей. 2) В VHDL сигналы(внешние цепи) допускают только отложенные присваивания, переменные(внутренние цепи) - только немедленные. В SV все цепи допускают или отложенные, или немедленные присваивания (те без смешивания для одной цепи). 3) В VHDL в одном последовательном блоке можно смешивать комбинационные и регистровые присваивания одним и тем-же переменным, в SV такое невозможно. Получается, отличия принципиальные (те не только синтаксические), и в целом у VHDL гораздо больше гибкости, чем у SV. В SV ничего похожего нет, только разносить комбинационные и регистровые присваивания по разным always-блокам (взял template из Квартуса, и поменял код): library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; entity top is generic ( MIN_COUNT : natural := 0; MAX_COUNT : natural := 15 ); port ( clk : in std_logic; a,b,c,d : in integer range MIN_COUNT to MAX_COUNT; qwire : out integer range MIN_COUNT to MAX_COUNT; qreg : out integer range MIN_COUNT to MAX_COUNT ); end entity; architecture rtl of top is begin process (clk,a,b,c,d) variable cnt : integer range MIN_COUNT to MAX_COUNT; begin if rising_edge(clk) then cnt := a+b; end if; qreg <= cnt; cnt := c+d; qwire <= cnt; end process; end; Изменено 29 ноября, 2016 пользователем Leka Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Leka 0 30 ноября, 2016 Опубликовано 30 ноября, 2016 (изменено) · Жалоба Я пытаюсь догадаться -- почему у нас на форуме последнее время увеличилось число сообщений, в которых люди утверждают что-то, чего не знают :) И, самое главное, хочу понять, что ими движет. То есть либо они думают, что разбираются в вопросе, но ошибаются. Либо они понимают, что не специалисты, но это не останавливает их от советов. Чтобы разобраться. Выкладывая свое видение предмета, проще обнаружить изъяны. Еще немного поигрался с VHDL (писать на нем не собираюсь, просто решил расширить кругозор по разным методикам описания схем). Мультиплексор, задерживающий сигнал на 0/1/2 такта - все в одном process: library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; entity top is port ( clk,d,s1,s2 : in std_logic; q : out std_logic ); end entity; architecture rtl of top is begin process (all) variable q1,q2 : std_logic; begin if rising_edge(clk) then q1 := d; end if; if rising_edge(clk) then q2 := q1; end if; q <= d; if s1 then q <= q1; end if; if s2 then q <= q2; end if; end process; end; Другая запись - с сигналами. Получается, что если не обращать внимания на синтаксис, VHDL == Verilog без always. library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; entity top is port ( clk,d,s1,s2 : in std_logic; q : out std_logic ); end entity; architecture rtl of top is signal q1,q2 : std_logic; begin process (all) begin if rising_edge(clk) then q1 <= d; end if; if rising_edge(clk) then q2 <= q1; end if; q <= d; if s1 then q <= q1; end if; if s2 then q <= q2; end if; end process; end; Изменено 30 ноября, 2016 пользователем Leka Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Timmy 1 30 ноября, 2016 Опубликовано 30 ноября, 2016 · Жалоба Другая запись - с сигналами. Получается, что если не обращать внимания на синтаксис, VHDL == Verilog без always. Аналогом always является process. Аналогом @(posedge clk) является wait until rising_edge(clk). А вот аналога if rising_edge(clk) в Верилоге нет и не может быть из-за отсутствия концепции сигналов, хранящих состояние, бывшее в предыдущем дельта-цикле. Зато Верилог симулируется в 10 раз быстрее:). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Des333 0 30 ноября, 2016 Опубликовано 30 ноября, 2016 · Жалоба Чтобы разобраться. Выкладывая свое видение предмета, проще обнаружить изъяны. Если хочется разобраться нужно спрашивать, а не утверждать. Хотя бы предупреждать, что в своем видении на 100% не уверены. Иначе получится нехорошо -- в каждой второй теме будут уверенно звучащие, но технически неграмотные советы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Leka 0 30 ноября, 2016 Опубликовано 30 ноября, 2016 (изменено) · Жалоба if rising_edge(clk) then q1 := d; end if; if rising_edge(clk) then q2 := q1; end if; Квартус и с переменными синтезирует цепочку триггеров (полный код давал в предыдущем посте). Ошибок при симуляции сложного проекта не будет в VHDL с таким кодом с переменными? Изменено 30 ноября, 2016 пользователем Leka Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Timmy 1 30 ноября, 2016 Опубликовано 30 ноября, 2016 · Жалоба if rising_edge(clk) then q1 := d; end if; if rising_edge(clk) then q2 := q1; end if; Квартус и с переменными синтезирует цепочку триггеров (полный код давал в предыдущем посте). Ошибок при симуляции сложного проекта не будет в VHDL с таким кодом с переменными? При симуляции будет ошибка, так как значение d одновременно присвоится переменным q1 и q2 в одном дельта-цикле. Надо строчки поменять местами, тогда никаких проблем с симуляцией не будет. Также это может создать ошибки при синтезе, так как использован нестандартный способ описания регистров, который может "удивить" синтезатор:). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Leka 0 30 ноября, 2016 Опубликовано 30 ноября, 2016 · Жалоба При симуляции будет ошибка, так как значение d одновременно присвоится переменным q1 и q2 в одном дельта-цикле. Надо строчки поменять местами, тогда никаких проблем с симуляцией не будет. Также это может создать ошибки при синтезе, так как использован нестандартный способ описания регистров, который может "удивить" синтезатор:). Спасибо, ответы очень помогли. В голове никак не укладывалось, из каких соображений присваивания переменным могут дать при синтезе последовательную цепочку триггеров. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться