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

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

 

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

 

Надо сделать мультиплексор вида [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 много-много раз.

 

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

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


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

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

 

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

 

Надо сделать мультиплексор вида [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

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


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

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

 

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

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

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


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

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

 

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

 

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

 

ЗЫ. Вот что ква пишет для мультиплексора 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 люта как и должно быть. Ваш ход?

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


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

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

 

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

 

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

 

 

 

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

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

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

 

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

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


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

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

 

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

 

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.

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

 

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

 

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

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


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

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

 

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

 

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

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


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

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

 

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 не работает (говорит - макрос не определен).

 

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

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

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


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

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

 

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

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


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

Уже читал.

 

Вот так:

 

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

 

`define CONST_A 5

`define CONST_B 6

 

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

 

`include "my_params.v"

 

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

 

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

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


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

Уже читал.

 

Вот так:

 

 

 

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

 

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

 

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

 

`define CONST_A 5

`define CONST_B 6

 

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

 

`include "my_params.v"

 

И все

 

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

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


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

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

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

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

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


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

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

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

Т.е. не хочет видеть константы через 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

 

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

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


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

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

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

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

 

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

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

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

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


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

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

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

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

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

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

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

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

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

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