Jump to content

    
Sign in to follow this  
Koluchiy

Verilog и generat'ы

Recommended Posts

Здравствуйте.

 

Вопрос, казалось бы, элементарный, но в поиске как-то не того...

 

Надо сделать мультиплексор вида [31:0] <= NumChannels * [31:0] , где NumChannels - настраиваемый параметр (константа), которая может принимать значения вплоть до 64.

 

Само собой, делать его через case не хочется совсем - сильно много, долго и муторно.

На попытки сделать типа

 

CNTR_RdData[31:0] = (ChCNTR_RdData[Addr]);

CNTR_RdData[31:0] = (ChCNTR_RdData[(32*Addr + 31):(32*Addr)]);

 

- где Addr - вектор адреса, ChCNTR_RdData в 1-м случае массив векторов, во 2-м - большой вектор,

Quartus ругается нехорошими словами.

 

generate for внутри case делать тоже не разрешает.

 

Что можно сделать?

Кроме Ctrl+C много-много раз.

 

Всем заранее спасибо за ответы.

Share this post


Link to post
Share on other sites
Здравствуйте.

 

Вопрос, казалось бы, элементарный, но в поиске как-то не того...

 

Надо сделать мультиплексор вида [31:0] <= NumChannels * [31:0] , где NumChannels - настраиваемый параметр (константа), которая может принимать значения вплоть до 64.

 

Само собой, делать его через case не хочется совсем - сильно много, долго и муторно.

На попытки сделать типа

 

CNTR_RdData[31:0] = (ChCNTR_RdData[Addr]);

CNTR_RdData[31:0] = (ChCNTR_RdData[(32*Addr + 31):(32*Addr)]);

 

- где Addr - вектор адреса, ChCNTR_RdData в 1-м случае массив векторов, во 2-м - большой вектор,

Quartus ругается нехорошими словами.

 

generate for внутри case делать тоже не разрешает.

 

Что можно сделать?

Кроме Ctrl+C много-много раз.

 

Всем заранее спасибо за ответы.

 

читайте стандарт, там все написано

 

module pipa #(parameter W = 32, N = 4, Nlog = 2)
    (input logic [W*N-1:0] in, 
    input logic [Nlog-1 : 0] idx, 
    output logic [W-1:0] out); 
    
  assign out = in[idx*W +: W];
endmodule

Share this post


Link to post
Share on other sites
читайте стандарт, там все написано

 

module pipa #(parameter W = 32, N = 4, Nlog = 2)
    (input logic [W*N-1:0] in, 
    input logic [Nlog-1 : 0] idx, 
    output logic [W-1:0] out); 
    
  assign out = in[idx*W +: W];
endmodule

А такая запись же сжирает значительно больше ресурсов чем обычный кейс

Share this post


Link to post
Share on other sites
А такая запись же сжирает значительно больше ресурсов чем обычный кейс

 

поспорим на перевод документации для опенкоресов с русского на английский ? %)

 

А если без шуток "каковы ваши доказательства" (с). Лог синтезатора в студию.

 

ЗЫ. Вот что ква пишет для мультиплексора 4в1 для 32 бит.

 

Top-level Entity Name : pipa

Family : Cyclone III

Total logic elements : 64

Total combinational functions : 64

Dedicated logic registers : 0

 

все правильно 32*2 люта как и должно быть. Ваш ход?

Share this post


Link to post
Share on other sites
поспорим на перевод документации для опенкоресов с русского на английский ? %)

 

А если без шуток "каковы ваши доказательства" (с). Лог синтезатора в студию.

 

ЗЫ. Вот что ква пишет для мультиплексора 4в1 для 32 бит.

 

 

 

все правильно 32*2 люта как и должно быть. Ваш ход?

Недавно что то похожее было

http://electronix.ru/forum/index.php?s=&am...st&p=637565

 

А по поводу спорить-Вы нарно не так поняли. Никто тут пиписьками мериться не желает. Обычный форум.

Share this post


Link to post
Share on other sites
Недавно что то похожее было

 

плохо что вы не разобрались до конца %) ваш пример лечиться так

 

module test
(
input          FrameTagged,
input   [2:0] FramePriority, PortPriority,
input  [23:0] PortIngressPriorityMap,
output  [2:0] IngressPriority
);

wire [31 : 0] expand_map = expander(PortIngressPriorityMap); 
wire nop; 

assign {nop, IngressPriority} = expand_map[(FrameTagged ? FramePriority : PortPriority)*4 +:4];

function logic [31 : 0] expander (input logic [23 : 0] data);
  int i; 
begin 
  for (i = 0; i < 8; i++) begin 
    expander[i*4 +: 4] = {1'b0, data[i*3 +: 3]};
  end 
end 
endfunction

 

Top-level Entity Name : test

Family : Cyclone III

Total logic elements : 18

Total combinational functions : 18

Dedicated logic registers : 0

 

считаем мультиплексор 3-х битовый 8в1 3*5 = 15 лютов, логика указателя 3-х битного 3*1 лют, итого 15+3 = 18. все правильно :)

 

Вывод : квартус не любит в таких выражениях умножители не кратные 2^N.

Предписание : запомнить и учитывать в дальнейшем.

 

А по поводу спорить-Вы нарно не так поняли. Никто тут пиписьками мериться не желает. Обычный форум.

 

жаль, придеться самому переводить %)

Share this post


Link to post
Share on other sites
плохо что вы не разобрались до конца %) ваш пример лечиться так

 

module test
(
input          FrameTagged,
input   [2:0] FramePriority, PortPriority,
input  [23:0] PortIngressPriorityMap,
output  [2:0] IngressPriority
);

wire [31 : 0] expand_map = expander(PortIngressPriorityMap); 
wire nop; 

assign {nop, IngressPriority} = expand_map[(FrameTagged ? FramePriority : PortPriority)*4 +:4];

function logic [31 : 0] expander (input logic [23 : 0] data);
  int i; 
begin 
  for (i = 0; i < 8; i++) begin 
    expander[i*4 +: 4] = {1'b0, data[i*3 +: 3]};
  end 
end 
endfunction

 

 

 

считаем мультиплексор 3-х битовый 8в1 3*5 = 15 лютов, логика указателя 3-х битного 3*1 лют, итого 15+3 = 18. все правильно :)

 

Вывод : квартус не любит в таких выражениях умножители не кратные 2^N.

Предписание : запомнить и учитывать в дальнейшем.

 

 

 

жаль, придеться самому переводить %)

:)А переводите я так понял для народа, а не для себя? Ну да-я не обратил про кратность 2.

 

А до конца я разобрался. Так как это было для ксалинкса, я сделал так

 

module mux_ingress_priority (Sel, In, Out);

 

input [2:0] Sel;

input [23:0] In;

output [2:0] Out; wire [2:0] Out;

 

M8_1E mux_0 ( .O(Out[0]), .D0(In[ 0]), .D1(In[ 3]), .D2(In[ 6]), .D3(In[ 9]), .D4(In[12]), .D5(In[15]), .D6(In[18]), .D7(In[21]), .E(1'b1), .S0(Sel[0]), .S1(Sel[1]), .S2(Sel[2]) );

M8_1E mux_1 ( .O(Out[1]), .D0(In[ 1]), .D1(In[ 4]), .D2(In[ 7]), .D3(In[10]), .D4(In[13]), .D5(In[16]), .D6(In[19]), .D7(In[22]), .E(1'b1), .S0(Sel[0]), .S1(Sel[1]), .S2(Sel[2]) );

M8_1E mux_2 ( .O(Out[2]), .D0(In[ 2]), .D1(In[ 5]), .D2(In[ 8]), .D3(In[11]), .D4(In[14]), .D5(In[17]), .D6(In[20]), .D7(In[23]), .E(1'b1), .S0(Sel[0]), .S1(Sel[1]), .S2(Sel[2]) );

 

endmodule //mux_ingress_priority

 

А в квартусе мой вариант вполне хорошо просинтезировался (см. по той ссылке выше). :) Удачи с переводом

Share this post


Link to post
Share on other sites

Еще спрошу, дабы тем новых не плодить.

 

Xilinx 9.2, Verilog, попытка:) использования препроцессора (они же - директивы компилятора).

 

Есть файлик с defin'ами, содержащий строки типа

 

1. `define DebugMode

 

2. `define Var 5

 

То есть, в 1-м случае определяется существование имени (для конструкций `ifdef), во 2-м - определяется константа.

Определенная константа применяется в тексте примерно так: Test = Test +`Var;

 

Файлик подключается к другим файлам с Verilog-текстом так:

`include "имя файла"

 

В чём (традиционная) засада.

В Quartus проблем нет, всё работает.

 

В ISE 9.2 компилятор не воспринимает определение констант через define, если это определение производится не в том же файле, что и применение.

То есть, определение 1 работает на ура, а определение 2 не работает (говорит - макрос не определен).

 

Это компилятор не поддерживает, или я что-то делаю не так?

Стандарт скачал, не помогло :(.

Share this post


Link to post
Share on other sites
Еще спрошу, дабы тем новых не плодить.

 

Xilinx 9.2, Verilog, попытка:) использования препроцессора (они же - директивы компилятора).

 

Есть файлик с defin'ами, содержащий строки типа

 

1. `define DebugMode

 

2. `define Var 5

 

То есть, в 1-м случае определяется существование имени (для конструкций `ifdef), во 2-м - определяется константа.

Определенная константа применяется в тексте примерно так: Test = Test +`Var;

 

Файлик подключается к другим файлам с Verilog-текстом так:

`include "имя файла"

 

В чём (традиционная) засада.

В Quartus проблем нет, всё работает.

 

В ISE 9.2 компилятор не воспринимает определение констант через define, если это определение производится не в том же файле, что и применение.

То есть, определение 1 работает на ура, а определение 2 не работает (говорит - макрос не определен).

 

Это компилятор не поддерживает, или я что-то делаю не так?

Стандарт скачал, не помогло :(.

 

http://telesys.ru/wwwboards/fpga/325/messages/48152.shtml

Share this post


Link to post
Share on other sites

Уже читал.

 

Вот так:

 

Делаешь верилоговский файл (например my_params.v). Помещаешь файл в корневой каталог проекта. Там в каждой строчке пишешь константы, которые нужны. Например:

 

`define CONST_A 5

`define CONST_B 6

 

Далее в файле, где используешь ту или иную константу пишешь в самом начале

 

`include "my_params.v"

 

почему-то не работает.

 

С parameter вроде начало компилить.

Share this post


Link to post
Share on other sites
Уже читал.

 

Вот так:

 

 

 

почему-то не работает.

 

С parameter вроде начало компилить.

 

Делаешь верилоговский файл (например my_params.v). Помещаешь файл в корневой каталог проекта. Там в каждой строчке пишешь константы, которые нужны. Например:

 

`define CONST_A 5

`define CONST_B 6

 

Далее в файле, где используешь ту или иную константу пишешь в самом начале

 

`include "my_params.v"

 

И все

 

при использовании константы нужна ` (закорючка)

Share this post


Link to post
Share on other sites

Если нет закорючки, оно просто ругается, что идентификатор не определен.

А тут, пока не поставишь определение константы в том же файле, в котором она используется, компилятор ее не видит.

Т.е. не хочет видеть константы через include .

Share this post


Link to post
Share on other sites
Если нет закорючки, оно просто ругается, что идентификатор не определен.

А тут, пока не поставишь определение константы в том же файле, в котором она используется, компилятор ее не видит.

Т.е. не хочет видеть константы через include .

 

`timescale 1ns / 1ps

`include "my_params.v"

 

module test_include (In, Out);

 

input In;

output [7:0] Out; wire [7:0] Out;

 

assign Out=(In)?(`CONST_A):(`CONST_B);

 

endmodule //test_include

 

все видит-только что проверил

Share this post


Link to post
Share on other sites
Если нет закорючки, оно просто ругается, что идентификатор не определен.

А тут, пока не поставишь определение константы в том же файле, в котором она используется, компилятор ее не видит.

Т.е. не хочет видеть константы через include .

 

1. скорее всего глюк ISE, он рассматривает каждый файл как раздельный compilation unit, хотя должен был как один.

2. правильный способ использования инклуд файлов подразумевает наличие макросов "исключительности"

3. декларировать константы через макросы ИМХО не красиво, но можно, но вот имена состояний в FSM низачто %)

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this