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

Доброго дня, пишу код точнее перевожу разбираюсь в нем:) По сколько больше нравится мне Verilog пишу на нем.

Но код программы на VHDL.

Мне не понятны чем можно заменить loop for process ? Судя по всему process можно описать через always или generate.

А вот loop и for? Искал схемное изображение что делает, не нашёл :(( Подскажи где можно почитать или пример кода со схематикой. Спасибо.

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


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

в верилоге есть просто for

 

циклы в описании ничто иное как просто сокращенная запись. Оговорюсь в той части что синтезируется.

 

то есть

 

for(i=0;i<3;i=i+1)

a <= i;

 

равносильно

 

a[0] <= 0;

a[1] <= 1;

a[2] <= 2;

 

потому как бы и нет схемного выражения, потому что оно меняется в зависимости от того что внутри...

 

 

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


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

полупать на него глазами%) и забыть

 

в VHDL for loop, в verilog просто for

 

в верилоге есть еще цикл while и repeat. Но они больше для симуляции чем для синтеза.

 

 

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


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

Golikov A. спасибо! Очень помог :))

Допустим такой код:

process (сигналы)

begin

for i in Reg'Range loop

pr(i):=(others=>'0');

Res(i):=(others=>'0');

end loop;

Reg_res(0)(7 downto 0):=CONV_STD_LOGIC_VECTOR(r_ID,5)&Version;

res(1)(7 downto 0):=CONV_STD_LOGIC_VECTOR(D_ID,8);

res(2)(7):='1';

pr(2)(4 downto 0):=(others=>'1');

alt_addr<=Reg(2)(4 downto 0);

pr(2)(15):='1';

ts_res<=Reg(2)(15);

res(2)(14):=ts_err;

endprocess

 

С for понятно, а все остальное ? Это можно описать через always или лучше через Generate ?

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


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

generate - это создание схем меняющихся по ходу создания.

 

к примеру вы хотите сделать схему которая в параллель перемножает 2 массива чисел. Делаете блок умножителя, и каждый элемент массива шлете на умножитель. Так вот длину массива в этом случае лучше сделать параметром, и получается что вы не можете точно сказать сколько надо умножителей, число зависит от параметра. можно сделать с запасом, а можно по уму создавать столько сколько нужно, вот для этого как раз и нужен генерайте. Он как бы обозначает "нечеткие" или "изменчивые" места. Надеюсь ничего не напутал и не запутал. Может кто получше сможет объяснить.

 

В остальном аналогом process VHDL является скорее always.

 

теперь что делает ваш код

 

 

1. он нулит вектора

pr(i) = ....

Res(i) = ....

 

... надеюсь res и Res это опечатка...

 

далее

 

он задает какие то значения. Вы опустили какие сигналы у вас под процессом, но складывается впечатление что все значения принимаемые сигналами - константы. Данный кусок кода можно описать и через генерайте, и через просто assign сигналов.

 

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

 

 

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


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

generate - это создание схем меняющихся по ходу создания.

:blink: А Вы чаcом не попутали generate c generic ?

 

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


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

Нет не путаю, просто смотрю, что мне по душе больше. Да сходства есть но есть и различия. Как только я не пробывал не получается у меня его синтаксис на верилог перекинуть у меня проблема в том что в блоке always я не знаю как описывать.... без assign ведь нельзя? И просто в строчку тоже .... Тогда как ? Спасибо. Судя по всему generate довольно сложный блок и поэтому про него так мало везде написано :)

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


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

А Вы чаcом не попутали generate c generic

стараюсь не путать, но вполне допускаю что могу. А может не могу словами объяснить что хочу. Если вам не трудно опишите вы что есть generate, оно всем полезно будет.

 

 

Как только я не пробывал не получается у меня его синтаксис на верилог перекинуть

 

надо не менять слова одного языка на такие же по смыслу от другого языка, а надо исходить из того что надо чтобы этот блок делал. Начните с того что он должен делать, и тогда станет понятно как его описать и как преобразовать%)...

 

я вижу в вашем блоке какое то могучее присвоение констант и ничего более, то есть в случае verilog это может быть и простой assign, и always(*)

 

 

 

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


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

Судя по всему generate довольно сложный блок и поэтому про него так мало везде написано :)

 

generate (verilog) как раз довольно простой блок. Он просто в цикле генерирует код, повторяя его сколько-то раз с разным значением какой-то переменной, которая обычно при этом выступает в качестве каких-то параметров (индексов массивов, т.п.). Надо например Вам описать 32 I/O ячейки, указывая для каждой в виде технологических ячеек I/O блоки и триггеры - можете 32 раза сделать copy/paste, а можете - цикл generate на 32 итерации. Блок always внутри блока generate - это все равно, что сделать сколько-то отдельных блоков always. В общем, блок generate обеспечивает генерацию кода методом повторения (как бы тупого копирования текста) сколько-то раз какого-то куска кода с подстановкой изменяющегося параметра.

 

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


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

получается любой конечный цикл может быть записан через generate? Ведь циклы тоже по сути сокращение записи...

 

никогда generate так не использовал, забавно... я всегда думал что generate (название) образовано от начального создания, а не от генерации кода, забавно....

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


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

получается любой конечный цикл может быть записан через generate? Ведь циклы тоже по сути сокращение записи...

 

никогда generate так не использовал, забавно... я всегда думал что generate (название) образовано от начального создания, а не от генерации кода, забавно....

А как же Вы тогда его использовали:)?

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


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

в начале схемы создавал блоки, инстансы если их переменное число или много, подключал сигналы... никогда не смотрел на этот процесс как на мультиплицирование кода, и уж точно никогда не заменял им циклы for. Это просто наблюдение...

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


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

//инициализируем массив регистров
        initial begin
          for(i = 0;i < INTERNAL_REG_COUNT - PREDEFINED_REG_COUNT; i = i + 1)
                InternalRegs[i] = 0;
        end

 

или

 

//------------------------------------------    
                //адреса напрямую выбирают регистр из массива, 
                //предопределенные регистры не из массива и 
                //регистр FSM_STATE с защитой от записи
                //обрабатываются ниже                
                for(i = 0; i < INTERNAL_REG_COUNT - PREDEFINED_REG_COUNT - 1; i = i + 1)
                    begin
                        if((HaveDataToExchange == 1'b1) && (ReadWriteRegAddr == GetReadAddres(i[INTERFACE_REG_ADDR_SIZE - 2 : 0]))) //чтение
                            begin
                                DataFromReg <= InternalRegs[i];
                                HaveDataFromReg <= 1'b1; //ставим флаг что есть данные
                            end    
                
                        if((HaveDataToExchange == 1'b1) && (ReadWriteRegAddr == GetWriteAddres(i[INTERFACE_REG_ADDR_SIZE - 2 : 0]))) //запись
                            begin
                                InternalRegs[i] <= DataToReg;                                        
                                DataToRegWasStored <= 1'b1; //ставим флаг что данные записаны
                            end    
                    end

 

внутри всех конечных автоматов и прочее у меня обычные for без генерайтов...

 

generate я использую так

 

genvar Param;
    generate
            //определяем элементы ФИФО для каждого мотора
      for (Param=0; Param < MOTOR_COUNT; Param = Param + 1) 
                begin: Fifo
                        FIFOModule FIFOinst 
                                (
                                    .clk(clk_pin),
                                    .srst(reset),
                                    .din(data_in[((Param + 1) * PATH_DATA_SIZE - 1) -: PATH_DATA_SIZE]),
                                    .wr_en(fifo_wr_strb_ack [Param]),
                                    .rd_en(fifo_rd_strb [Param]),
                                    .dout(path_data[Param]),
                                    .full(fifo_full[Param]),
                                    .empty(fifo_no_data [Param]),
                                    .data_count(fifo_data_counter[Param])
                                );
                end
    endgenerate

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


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

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

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

Гость
Ответить в этой теме...

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

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

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

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

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

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