Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Помогите сделать дешифратор
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
Павел34
Нужна помощь. Благодаря своей недальновидности, уже сделал устройство, в котором стоит ПЛИС EPM7064STC100-10. С прошивкой думал разберусь, однако не получается. В общем надо сделать дешифратор 52в6. На одном из 52 входов появлется низкий уровень соответственно на выходе в двоичном коде надо получить номер входа с низким уровнем.
Заданием обычной таблицы не получается скомпилировать
Цитата
SUBDESIGN upr_kommutator
(
in1[51..0] : INPUT;
out[5..0] : OUTPUT;
)
BEGIN
TABLE
in1[] => out[];
B"0111111111111111111111111111111111111111111111" => B"000001";


Подскажите как сделать, горю!!!
des333
Павел34:

У Вас не дешифратор, а шифратор.

http://depositfiles.com/ru/files/5145468


http://www.google.com/codesearch?hl=ru&...%B8%D1%81%D0%BA
http://www.google.com/codesearch?hl=ru&...%B8%D1%81%D0%BA

Не нужно создавать одну тему в разных ветках.

http://electronix.ru/forum/index.php?showtopic=73772
SM
если на AHDL, судя по корневому посту, то как-то так:

for i in 0 to 51 generate
if (!indata[i]) then
out = i;
end if;
end generate;

ну доработать слегка, если может быть более чем один ноль на входе, чтобы шифратор стал приоритетный.
Павел34
Цитата(des333 @ Mar 9 2010, 21:48) *


Верное замечание. В примерах только небольшая разрядность. У меня в том то и загвоздка, что не компиляет из-за большого количества разрядов =(

Цитата(SM @ Mar 9 2010, 22:09) *
если на AHDL, судя по корневому посту, то как-то так:

for i in 0 to 51 generate
if (!indata[i]) then
out = i;
end if;
end generate;

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


Спасибо, а не скажете, в параллельный никак не получится?
x736C
Цитата(Павел34 @ Mar 9 2010, 20:59) *
На одном из 52 входов появлется низкий уровень соответственно на выходе в двоичном коде надо получить номер входа с низким уровнем.
Насколько быстро должен появляться двоичный код?
Павел34
Это обработка клавиш, поэтому задержка в миллисекунды не критична
x736C
1. Какая тактовая частота?
2. Двойное нажатие неактуально, верно?
des333
Цитата(SM @ Mar 9 2010, 22:09) *
если на AHDL, судя по корневому посту, то как-то так:

for i in 0 to 51 generate
if (!indata[i]) then
out = i;
end if;
end generate;

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


Лучше на Verilog - там сразу приоритетный.  smile.gif
SM
Цитата(Павел34 @ Mar 9 2010, 22:15) *
Спасибо, а не скажете, в параллельный никак не получится?

Не скажу, так как поставлен таким вопросом в тупик. Поясните, что значит параллельный.
des333
Код
`define VAR1

module tq(
  input         clk_i,
  input         rst_i,
  input  [15:0] in_i,
  output [3:0]  out_o
);

logic [15:0] in;
logic [3:0]  out;

always_ff @(posedge clk_i, posedge rst_i)
  if(rst_i)
    in <= '0;
  else
    in <= in_i;  


`ifdef VAR1

always_comb
  begin
    out = 4'b0000;
    casex (in)
        16'bxxxxxxxxxxxxxxx1: out = 4'b0000;
        16'bxxxxxxxxxxxxxx10: out = 4'b0001;
        16'bxxxxxxxxxxxxx100: out = 4'b0010;
        16'bxxxxxxxxxxxx1000: out = 4'b0011;
        16'bxxxxxxxxxxx10000: out = 4'b0100;
        16'bxxxxxxxxxx100000: out = 4'b0101;
        16'bxxxxxxxxx1000000: out = 4'b0110;
        16'bxxxxxxxx10000000: out = 4'b0111;
        16'bxxxxxxx100000000: out = 4'b1000;
        16'bxxxxxx1000000000: out = 4'b1001;
        16'bxxxxx10000000000: out = 4'b1010;
        16'bxxxx100000000000: out = 4'b1011;
        16'bxxx1000000000000: out = 4'b1100;
        16'bxx10000000000000: out = 4'b1101;
        16'bx100000000000000: out = 4'b1110;
        16'b1000000000000000: out = 4'b1111;
    endcase
  end
  
`else

always_comb
  begin
    out = 4'b0000;
    for(int i = 15; i>=0; i--)
      if(in[i])
        out = i;    
  end
  
`endif


always_ff @(posedge clk_i, posedge rst_i)
  if(rst_i)
    out_o <= '0;
  else
    out_o <= out;  


endmodule


Хм... Странно - второй вариант и меньше по ресурсам и частота выше. smile.gif
Павел34
двойное нажатие пофик.

у меня 52 входа(нажата одна из клавиш только может быть, а если несколько, то пофик, пусть сработает любая из нажатых) и шесть выходов, которые по плану в двоичном коде должны загружать в мк номер нажатой клавиши.
x736C
По «плану» или по фронту-отсчету-сигналу и т. п.?

И все 52 кнопки на 52 вывода..
SM
Цитата(Павел34 @ Mar 9 2010, 22:59) *
у меня 52 входа(нажата одна из клавиш только может быть, а если несколько, то пофик, пусть сработает любая из нажатых) и шесть выходов, которые по плану в двоичном коде должны загружать в мк номер нажатой клавиши.


Так я Вам это и написал в 6-ти строчках с generate. Правда при одновременном нажатии на выходе будет логическое ИЛИ кодов всех одновременно нажатых клавиш.
sazh
Цитата(Павел34 @ Mar 9 2010, 22:15) *
Верное замечание. В примерах только небольшая разрядность. У меня в том то и загвоздка, что не компиляет из-за большого количества разрядов =(


Значит и генерейтом не уложится.

Слепите сначала на 32. Потом на 20. если превысит 32, к полученному 32 прибавлять. Должно в 64 ячейки уложиться.
SM
Цитата(sazh @ Mar 9 2010, 23:19) *
Должно в 64 ячейки уложиться.

По любому должно, главное не забыть проверить, что параллельные экспандеры разрешены в настройках синтезатора-маппера-фиттера.
sazh
Цитата(SM @ Mar 9 2010, 23:23) *
По любому должно, главное не забыть проверить, что параллельные экспандеры разрешены в настройках синтезатора-маппера-фиттера.


Для 7000 я не нашел.
Error: Can't pack LABs
des333
Код
module tq(
  input  [N-1:0] in,
  output [5:0]  out
);

parameter N = 53;

always_comb
  begin
    out = 4'b0000;
    for(int i = N-1; i>=0; i--)
      if(in[i])
        out = i;    
  end



endmodule


Что-то я под вечер вообще перестал соображать:
почему при N=53 все собирается и занимает 22 ячейки, а при N=52 - занимает 62 ячейки и не влазит?
x736C
Все легко уминается с небольшим запасом сдвигом и подсчетом.


out = 4'b0000; наверное надо поправить, хотя на результат может и не повлиять smile.gif

Писал на скорую руку. Сыро и требует доработки, но работает в нужном направлении.
Код
module m52_6(rst,clk,in_i,out_o,keyEv);

    input        rst, clk;
    input  [51:0] in_i;
    output [5:0]  out_o;
    output        keyEv;

reg [51:0] inReg;
reg [5:0]  keyCtr;

assign    keyEv = ~inReg[51];

always @ (posedge clk)
    if (rst)           inReg <= in_i;
    else begin
        if (keyEv)     inReg <= in_i;
        else           inReg[51:0] <= {inReg[51:0], inReg[51]}; end

always @ (posedge clk)
    if (rst)        keyCtr <= 0;
    else if(~keyEv) keyCtr <= keyCtr + 1;
    else            keyCtr <= 0;
    assign out_o = keyCtr;
    
endmodule
sazh
Цитата(des333 @ Mar 10 2010, 00:04) *
почему при N=53 все собирается и занимает 22 ячейки, а при N=52 - занимает 62 ячейки и не влазит?


Значит, если к 52 добавить константу единицами до 2**n, все получится и с генерейтом.
des333
Цитата(sazh @ Mar 10 2010, 00:42) *
Значит, если к 52 добавить константу единицами до 2**n, все получится и с генерейтом.

Не понятно 2 вещи:


1) Почему такая ситуация именно при 52-53?

2) Почему такой большой перепад в занятых ячейках?




UPD:


Вопросы отпали.

Ответов пока нет, но направление есть - на свежую голову додумаю.


В общем, вышеописанная ситуация была при оптимизации по ресурсам ("Area").

При "Speed" если N=53, то занято 25 макроячеек и влазит , а если N=52, то 29 ячеек и не влазит.

При "Balanced" если N=53, то занято 19 макроячеек, а если N=52, то 18 и все и там и там влазит.

blink.gif


Вот такая вот "веселуха" smile.gif
SM
Ну вот, искали как дешифратор сделать, а нашли глюк в квартусе smile.gif
Adlex
Вообще-то это получается шифратор
des333
Цитата(Adlex @ Mar 10 2010, 18:26) *
Вообще-то это получается шифратор


Да, вроде как, во втором сообщение автору это уже сообщили.  wink.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.