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

Есть вопросы по переходу с verilog на vhdl

Всем привет!

Много лет пишу на верилоге, и тут попался заказчик, который хочет 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;

 

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

Можно както компактнее писать?

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


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

А гтовые шаблоны использовать не хотите? Чем не устраивают? По моему сейчас уже в любом пакете есть...

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


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

Как это бы выглядело по (моему) учебнику на 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 раза %))))))))))))))))))))) и так уже компактно %)

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


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

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

Но игра не стоит свечь.

Убедить надо заказчика типа Вам ехать или шашечки.

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


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

..Отсюда вопрос - как этот триггер описать максимально компактно на vhdl?

 

..Второй вопрос -по счетчику.

Обычный счетчик со сбросом и ограничением на переполнение и разрешением счета

 

Действительно может попробовать использовать шаблоны или же почитать доки по используемому Вами синтезатору там должны быть примеры реализации компонентов как например в этом документе

 

Удачи!!!

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


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

Попробую зайлинксовский мануал почитать, спасибо!

 

А можно еще вопрос? При формировании чтения из блока регистров я часто использую мультиплексоры вида:

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.

А что вы имеете ввиду под шаблонами? Брать зайлинксовскую библиотеку стандартной логики, и писать прямо хватая готовые вентили/триггеры оттуда?

Я конечно кодил на гейт левеле, когда нужно было быстро сделать заплатки для эйсика используя ремонтные селлы, но это жесть та еще .. ниужели так кто то пишет?

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


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

А можно еще вопрос? При формировании чтения из блока регистров я часто использую мультиплексоры вида:

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); 

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


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

использую мультиплексоры вида:

 

Скобки без надобности.

case можно.

Максимум, чего Вы добьетесь на vhdl (чтобы работало гарантировано) это описание с in std_logic; out std_logic_vector;

Если будете работать в команде с VHDL листами - засмеют.

Если все самостоятельно тянете: хозяин - барин.

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


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

Попробую зайлинксовский мануал почитать, спасибо!

 

А можно еще вопрос? При формировании чтения из блока регистров я часто использую мультиплексоры вида:

...

Вопрос - как (компактно) описывать такие шинные операции на 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');
...

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


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

А можно еще вопрос? При формировании чтения из блока регистров я часто использую мультиплексоры вида:

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

 

 

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


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

P.S.

... но это жесть та еще .. ниужели так кто то пишет?

 

В местах где важна скорость поведенческое описание не всегда есть гуд ибо Вы даете на откуп синтезатору построение схемы того или иного блока, а последний не всегда может однозначно "уловить" Ваши пожелания :laughing: . Поэтому приходится продумывать ответственные узлы в базисе вполне конкретного схемотехнического решения (триггеры , счетчики и т.д.) , а вот логика управления всей этой схемой , строится на базе автомата который описываеться в поведенческой форме.

Удачи!

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


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

под шаблонами понимают присутвующую в [простите мой английский] говноредакторах возможность нажав кнопку получить кусочек текста, в который потом можно вписать свои переменные и т.д.

 

кстати есть (были раньше точно) трансляторы с одного языка на другой. так как Вы "свой", то, наверно, понимаете где их поискать

сможете написать на верилоге и конвертнуть в VHDL, будет не хуже, чем с использованием "шаблонов"

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


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

На ftp electronix в документах лежит мой VHDL_conspect_pack_20111023_public.rar

Там все примитивы на все случаи жизни с картинками, от триггера до процессора, как раз то, что Вам нужно.

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


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

Интересно, спасибо!

 

По поводу трансляторов, видел коммерческие айпи ядра, странслированные с vhdl на верилог - практически нечитабельно, и с неточностями/ошибками. С одним ядром долго ковырялся - в моделсиме все хокей, а квартус вывалил сотню ерроров. В основном, в конструкциях generate и разной параметризации.

 

Вообще, я думал о таком варианте: писать на верилоге, потом, скажем, синтезировать в синплифае, а потом сохрянять нетлист в vhdl и использовать со стандартной библиотекой. Но изначально была задумка изучить таки язык, а не написать один проект и забыть как страшный сон. Пока же, все что узнаю о vhdl пока держит меня в нескончаемом шоке "зачем_это_все_надо". Правы были те, кто писал что нужно учить сначала vhdl а потом верилог, а не наоборот. Уже не раз была мысль послать все нафик, но .. пока разбираюсь.

 

tAmega

Забавно, у меня тоже есть учебник Бибило по vhdl, вот в нем то как раз я и наткнулся на ошибки в синтаксисе о которых писал в первом посте ) Второй учебник у меня - Стешенко по альтере, там как то получше написано, но все равно вопросы остаются. Буду изучать ваш конспект, спасибо)

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


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

Всем привет!

Много лет пишу на верилоге, и тут попался заказчик, который хочет 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.

Книжку срочно менять. :)

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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