Shivers 0 17 мая, 2012 Опубликовано 17 мая, 2012 · Жалоба Всем привет! Много лет пишу на верилоге, и тут попался заказчик, который хочет vhdl. У меня есть учебник, но как то там слишком все громоздко, и похоже что много ошибок - часть кода из учебника не компилируется. Мне нужно освоить несколько основных моментов - уметь написать обычный триггер со сбросом, разрешением и хранением, уметь писать комбинаторику для шин, нужны счетчики, и шинные мультиплексоры (для формирования чтения из блоков регистров). Я задам здесь несколько вопросов, потому что после верилога vhdl кажется мне монстром, и разобраться тяжеловато. Первый вопрос по простейшему триггер со сбросом и хранением. Код на верилоге, как я обычно его использую в дизайнах выглядит както так: wire clk, resetn, set, clr, reset; reg q; ... always @(posedge clk or negedge resetn) if(~resetn) q<= 1'b0; else q <= (set | q) & ~clr; Как это бы выглядело по (моему) учебнику на vhdl entity ffd is port(clk, resetn, set, clr:in bit; q: out bit); end ffd; architecture arch1 of ffd is signal d:bit; function pos_edge(signal a:bit) return boolean is begin return (a = '1' and a'event); end; begin process (clk, resetn) begin if(resetn = '0') then q <= '0'; elseif pos_edge(clk) q <= d and (not clr); end if; end process; begin process (set, q) begin d <= set or q; end process; end arch1 Во первых, компилятор ругается на синтаксис в строке: elseif pos_edge(clk). Во вторых, засунуть хранение в ту же формулу, где делается q у меня не получилось - да и учебник утверждает что обратную связь необходимо выводить в отдельный процесс. А это все текст, текст и текст. Простейший код начинает занимать чудовищно много места. Да и по учебнику - не компилируется ) Отсюда вопрос - как этот триггер описать максимально компактно на vhdl? Ну и попутно - укажите на ошибку в моем vhdl коде, плиз. Второй вопрос -по счетчику. Обычный счетчик со сбросом и ограничением на переполнение и разрешением счета wire clk, resetn, ena. reg [7:0] counter; always @(posedge clk or negedge resetn) if(~resetn) counter[7:0] <= 8'h00; else if(counter[7:0] == 8'h0A) counter[7:0] <= 8'h00; else if(ena) counter[7:0] <= counter[7:0] + 8'h01; Как это у меня получается на vhdl (опять же куча ошибок по неопытности) entity counter_e is port ( resetn, clk, ena : in bit; counter : out integer range 0 to 7); end counter_e; architecture ccc of counter_e is signal counter_value : integer range 0 to 7; begin p0 : process (resetn, clk) begin if (resetn = '0') then counter_value <= 0; elsif (clk'event and clk = '1') then elsif (ena = '1') then if (counter_value = A) then counter_value <= 0; else counter_value <= counter_value + 1; end if; end if; end if; end process; counter <= counter_value; end ccc; Опять же жутко прегружено текстом. Если так буду писать, код распухнет раза в три, со всеми вытекающими. Можно както компактнее писать? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
eugen_pcad_ru 0 17 мая, 2012 Опубликовано 17 мая, 2012 · Жалоба А гтовые шаблоны использовать не хотите? Чем не устраивают? По моему сейчас уже в любом пакете есть... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 17 мая, 2012 Опубликовано 17 мая, 2012 · Жалоба Как это бы выглядело по (моему) учебнику на vhdl учебник не тот %) entity ffd is port(clk, resetn, set, clr:in bit; q: out bit); end ffd; architecture arch1 of ffd is signal d:bit; begin d <= set or q; process (clk, resetn) begin if(resetn = '0') then q <= '1'; elseif rising_edge(clk) q <= set or q and (not clr); end if; end process; end arh1 Во вторых, засунуть хранение в ту же формулу, где делается q у меня не получилось - да и учебник утверждает что обратную связь необходимо выводить в отдельный процесс. q объявлено как выходной порт, а выходной порт в парадигме VHDL 93 читать нельзя, переходите на VHDL2008 и старше (если есть) Опять же жутко прегружено текстом. Если так буду писать, код распухнет раза в три, со всеми вытекающими. Можно както компактнее писать? увеличьте цену в 3 раза %))))))))))))))))))))) и так уже компактно %) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sazh 8 17 мая, 2012 Опубликовано 17 мая, 2012 · Жалоба always @(posedge clk or negedge resetn) if(~resetn) counter[7:0] <= 8'h00; else if(counter[7:0] == 8'h0A) counter[7:0] <= 8'h00; else if(ena) counter[7:0] <= counter[7:0] + 8'h01; Как это у меня получается на vhdl А ведь функционально на VHDL Вы это правильно пытались оформить if(ena) begin if(counter[7:0] == 8'h0A) counter[7:0] <= 8'h00; else counter[7:0] <= counter[7:0] + 8'h01; end скачайте с xilinx xst.pdf Там описание примитивов одновременно и на верилоге и на VHDL Но игра не стоит свечь. Убедить надо заказчика типа Вам ехать или шашечки. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sisuprun 0 17 мая, 2012 Опубликовано 17 мая, 2012 · Жалоба ..Отсюда вопрос - как этот триггер описать максимально компактно на vhdl? ..Второй вопрос -по счетчику. Обычный счетчик со сбросом и ограничением на переполнение и разрешением счета Действительно может попробовать использовать шаблоны или же почитать доки по используемому Вами синтезатору там должны быть примеры реализации компонентов как например в этом документе Удачи!!! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Shivers 0 17 мая, 2012 Опубликовано 17 мая, 2012 · Жалоба Попробую зайлинксовский мануал почитать, спасибо! А можно еще вопрос? При формировании чтения из блока регистров я часто использую мультиплексоры вида: wire [31:00] reg_out = sel_00 ? reg_00[31:0] : ( sel_01 ? reg_01[31:0] : ( sel_02 ? reg_02[31:0] : reg_03[31:00] )); или, последнее время больше люблю писать так, хотя схема не эквивалентна: wire [31:00] reg_out = {32{sel_00} & reg_00[31:00] | {32{sel_01} & reg_01[31:00] | {32{sel_02} & reg_02[31:00] | {32{sel_03} & reg_03[31:00]; Вопрос - как (компактно) описывать такие шинные операции на vhdl? P.S. А что вы имеете ввиду под шаблонами? Брать зайлинксовскую библиотеку стандартной логики, и писать прямо хватая готовые вентили/триггеры оттуда? Я конечно кодил на гейт левеле, когда нужно было быстро сделать заплатки для эйсика используя ремонтные селлы, но это жесть та еще .. ниужели так кто то пишет? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sisuprun 0 17 мая, 2012 Опубликовано 17 мая, 2012 · Жалоба А можно еще вопрос? При формировании чтения из блока регистров я часто использую мультиплексоры вида: wire [31:00] reg_out = sel_00 ? reg_00[31:0]:( sel_01 ? reg_01[31:0] : ( sel_02 ? reg_02[31:0] : reg_03[31:00] )); например так: reg_out<= reg_00(31 downto 0) when sel_00='1' else reg_01(31 downto 0) when sel_01='1' else reg_02(31 downto 0) when sel_02='1' else reg_03(31 downto 0); Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sazh 8 17 мая, 2012 Опубликовано 17 мая, 2012 · Жалоба использую мультиплексоры вида: Скобки без надобности. case можно. Максимум, чего Вы добьетесь на vhdl (чтобы работало гарантировано) это описание с in std_logic; out std_logic_vector; Если будете работать в команде с VHDL листами - засмеют. Если все самостоятельно тянете: хозяин - барин. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Postoroniy_V 0 17 мая, 2012 Опубликовано 17 мая, 2012 · Жалоба Попробую зайлинксовский мануал почитать, спасибо! А можно еще вопрос? При формировании чтения из блока регистров я часто использую мультиплексоры вида: ... Вопрос - как (компактно) описывать такие шинные операции на vhdl? signal reg_out:std_logic_vertor(31 downto 0); ..... begin ... reg_out <= reg_00 when sel_00='1' else reg_01 when sel_01='1' else reg_02 when sel_02='1' else reg_03 when sel_03='1' else (others=>'0'); ... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Самурай 12 17 мая, 2012 Опубликовано 17 мая, 2012 · Жалоба А можно еще вопрос? При формировании чтения из блока регистров я часто использую мультиплексоры вида: wire [31:00] reg_out = sel_00 ? reg_00[31:0] : ( sel_01 ? reg_01[31:0] : ( sel_02 ? reg_02[31:0] : reg_03[31:00] )); ... Вопрос - как (компактно) описывать такие шинные операции на vhdl? P.S. А что вы имеете ввиду под шаблонами? ... MUX Language_Templates Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sisuprun 0 17 мая, 2012 Опубликовано 17 мая, 2012 · Жалоба P.S. ... но это жесть та еще .. ниужели так кто то пишет? В местах где важна скорость поведенческое описание не всегда есть гуд ибо Вы даете на откуп синтезатору построение схемы того или иного блока, а последний не всегда может однозначно "уловить" Ваши пожелания :laughing: . Поэтому приходится продумывать ответственные узлы в базисе вполне конкретного схемотехнического решения (триггеры , счетчики и т.д.) , а вот логика управления всей этой схемой , строится на базе автомата который описываеться в поведенческой форме. Удачи! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
yes 8 17 мая, 2012 Опубликовано 17 мая, 2012 · Жалоба под шаблонами понимают присутвующую в [простите мой английский] говноредакторах возможность нажав кнопку получить кусочек текста, в который потом можно вписать свои переменные и т.д. кстати есть (были раньше точно) трансляторы с одного языка на другой. так как Вы "свой", то, наверно, понимаете где их поискать сможете написать на верилоге и конвертнуть в VHDL, будет не хуже, чем с использованием "шаблонов" Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
tAmega 0 17 мая, 2012 Опубликовано 17 мая, 2012 · Жалоба На ftp electronix в документах лежит мой VHDL_conspect_pack_20111023_public.rar Там все примитивы на все случаи жизни с картинками, от триггера до процессора, как раз то, что Вам нужно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Shivers 0 17 мая, 2012 Опубликовано 17 мая, 2012 · Жалоба Интересно, спасибо! По поводу трансляторов, видел коммерческие айпи ядра, странслированные с vhdl на верилог - практически нечитабельно, и с неточностями/ошибками. С одним ядром долго ковырялся - в моделсиме все хокей, а квартус вывалил сотню ерроров. В основном, в конструкциях generate и разной параметризации. Вообще, я думал о таком варианте: писать на верилоге, потом, скажем, синтезировать в синплифае, а потом сохрянять нетлист в vhdl и использовать со стандартной библиотекой. Но изначально была задумка изучить таки язык, а не написать один проект и забыть как страшный сон. Пока же, все что узнаю о vhdl пока держит меня в нескончаемом шоке "зачем_это_все_надо". Правы были те, кто писал что нужно учить сначала vhdl а потом верилог, а не наоборот. Уже не раз была мысль послать все нафик, но .. пока разбираюсь. tAmega Забавно, у меня тоже есть учебник Бибило по vhdl, вот в нем то как раз я и наткнулся на ошибки в синтаксисе о которых писал в первом посте ) Второй учебник у меня - Стешенко по альтере, там как то получше написано, но все равно вопросы остаются. Буду изучать ваш конспект, спасибо) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
LV26 0 17 мая, 2012 Опубликовано 17 мая, 2012 · Жалоба Всем привет! Много лет пишу на верилоге, и тут попался заказчик, который хочет vhdl. У меня есть учебник, но как то там слишком все громоздко, и похоже что много ошибок - часть кода из учебника не компилируется. Мне нужно освоить несколько основных моментов - уметь написать обычный триггер со сбросом, разрешением и хранением, уметь писать комбинаторику для шин, нужны счетчики, и шинные мультиплексоры (для формирования чтения из блоков регистров). Я задам здесь несколько вопросов, потому что после верилога vhdl кажется мне монстром, и разобраться тяжеловато. Первый вопрос по простейшему триггер со сбросом и хранением. Код на верилоге, как я обычно его использую в дизайнах выглядит както так: wire clk, resetn, set, clr, reset; reg q; ... always @(posedge clk or negedge resetn) if(~resetn) q<= 1'b0; else q <= (set | q) & ~clr; Как это бы выглядело по (моему) учебнику на vhdl entity ffd is port(clk, resetn, set, clr:in bit; q: out bit); end ffd; architecture arch1 of ffd is signal d:bit; function pos_edge(signal a:bit) return boolean is begin return (a = '1' and a'event); end; begin process (clk, resetn) begin if(resetn = '0') then q <= '0'; elseif pos_edge(clk) q <= d and (not clr); end if; end process; begin process (set, q) begin d <= set or q; end process; end arch1 Во первых, компилятор ругается на синтаксис в строке: elseif pos_edge(clk). Во вторых, засунуть хранение в ту же формулу, где делается q у меня не получилось - да и учебник утверждает что обратную связь необходимо выводить в отдельный процесс. А это все текст, текст и текст. Простейший код начинает занимать чудовищно много места. Да и по учебнику - не компилируется ) Отсюда вопрос - как этот триггер описать максимально компактно на vhdl? Ну и попутно - укажите на ошибку в моем vhdl коде, плиз. Второй вопрос -по счетчику. Обычный счетчик со сбросом и ограничением на переполнение и разрешением счета wire clk, resetn, ena. reg [7:0] counter; always @(posedge clk or negedge resetn) if(~resetn) counter[7:0] <= 8'h00; else if(counter[7:0] == 8'h0A) counter[7:0] <= 8'h00; else if(ena) counter[7:0] <= counter[7:0] + 8'h01; Как это у меня получается на vhdl (опять же куча ошибок по неопытности) entity counter_e is port ( resetn, clk, ena : in bit; counter : out integer range 0 to 7); end counter_e; architecture ccc of counter_e is signal counter_value : integer range 0 to 7; begin p0 : process (resetn, clk) begin if (resetn = '0') then counter_value <= 0; elsif (clk'event and clk = '1') then elsif (ena = '1') then if (counter_value = A) then counter_value <= 0; else counter_value <= counter_value + 1; end if; end if; end if; end process; counter <= counter_value; end ccc; Опять же жутко прегружено текстом. Если так буду писать, код распухнет раза в три, со всеми вытекающими. Можно както компактнее писать? Функцию можно не писать - она уже есть rising_edge(), falling_edge() счетчик можно сделать параметризированным и кинуть в библиотеку, оттуда и вызывать. или вставлять как отдельный компонент с параметрами. В примере "из книжки" elseif вместо elsif. Книжку срочно менять. :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться