реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Помогите сделать дешифратор, На ПЛИСе
Павел34
сообщение Mar 9 2010, 13:53
Сообщение #1





Группа: Участник
Сообщений: 5
Регистрация: 9-03-10
Пользователь №: 55 869



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


Подскажите как сделать, горю!!!
Go to the top of the page
 
+Quote Post
des333
сообщение Mar 9 2010, 18:48
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 129
Регистрация: 19-07-08
Из: Санкт-Петербург
Пользователь №: 39 079



Павел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


--------------------
Go to the top of the page
 
+Quote Post
SM
сообщение Mar 9 2010, 19:09
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881



если на AHDL, судя по корневому посту, то как-то так:

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

ну доработать слегка, если может быть более чем один ноль на входе, чтобы шифратор стал приоритетный.
Go to the top of the page
 
+Quote Post
Павел34
сообщение Mar 9 2010, 19:15
Сообщение #4





Группа: Участник
Сообщений: 5
Регистрация: 9-03-10
Пользователь №: 55 869



Цитата(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;

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


Спасибо, а не скажете, в параллельный никак не получится?
Go to the top of the page
 
+Quote Post
x736C
сообщение Mar 9 2010, 19:27
Сообщение #5


Профессионал
*****

Группа: Участник
Сообщений: 1 273
Регистрация: 3-03-06
Пользователь №: 14 942



Цитата(Павел34 @ Mar 9 2010, 20:59) *
На одном из 52 входов появлется низкий уровень соответственно на выходе в двоичном коде надо получить номер входа с низким уровнем.
Насколько быстро должен появляться двоичный код?
Go to the top of the page
 
+Quote Post
Павел34
сообщение Mar 9 2010, 19:29
Сообщение #6





Группа: Участник
Сообщений: 5
Регистрация: 9-03-10
Пользователь №: 55 869



Это обработка клавиш, поэтому задержка в миллисекунды не критична
Go to the top of the page
 
+Quote Post
x736C
сообщение Mar 9 2010, 19:32
Сообщение #7


Профессионал
*****

Группа: Участник
Сообщений: 1 273
Регистрация: 3-03-06
Пользователь №: 14 942



1. Какая тактовая частота?
2. Двойное нажатие неактуально, верно?
Go to the top of the page
 
+Quote Post
des333
сообщение Mar 9 2010, 19:39
Сообщение #8


Профессионал
*****

Группа: Свой
Сообщений: 1 129
Регистрация: 19-07-08
Из: Санкт-Петербург
Пользователь №: 39 079



Цитата(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


--------------------
Go to the top of the page
 
+Quote Post
SM
сообщение Mar 9 2010, 19:53
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881



Цитата(Павел34 @ Mar 9 2010, 22:15) *
Спасибо, а не скажете, в параллельный никак не получится?

Не скажу, так как поставлен таким вопросом в тупик. Поясните, что значит параллельный.
Go to the top of the page
 
+Quote Post
des333
сообщение Mar 9 2010, 19:53
Сообщение #10


Профессионал
*****

Группа: Свой
Сообщений: 1 129
Регистрация: 19-07-08
Из: Санкт-Петербург
Пользователь №: 39 079



Код
`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


--------------------
Go to the top of the page
 
+Quote Post
Павел34
сообщение Mar 9 2010, 19:59
Сообщение #11





Группа: Участник
Сообщений: 5
Регистрация: 9-03-10
Пользователь №: 55 869



двойное нажатие пофик.

у меня 52 входа(нажата одна из клавиш только может быть, а если несколько, то пофик, пусть сработает любая из нажатых) и шесть выходов, которые по плану в двоичном коде должны загружать в мк номер нажатой клавиши.
Go to the top of the page
 
+Quote Post
x736C
сообщение Mar 9 2010, 20:09
Сообщение #12


Профессионал
*****

Группа: Участник
Сообщений: 1 273
Регистрация: 3-03-06
Пользователь №: 14 942



По «плану» или по фронту-отсчету-сигналу и т. п.?

И все 52 кнопки на 52 вывода..
Go to the top of the page
 
+Quote Post
SM
сообщение Mar 9 2010, 20:09
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881



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


Так я Вам это и написал в 6-ти строчках с generate. Правда при одновременном нажатии на выходе будет логическое ИЛИ кодов всех одновременно нажатых клавиш.
Go to the top of the page
 
+Quote Post
sazh
сообщение Mar 9 2010, 20:19
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 2 435
Регистрация: 6-10-04
Из: Петербург
Пользователь №: 804



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


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

Слепите сначала на 32. Потом на 20. если превысит 32, к полученному 32 прибавлять. Должно в 64 ячейки уложиться.
Go to the top of the page
 
+Quote Post
SM
сообщение Mar 9 2010, 20:23
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881



Цитата(sazh @ Mar 9 2010, 23:19) *
Должно в 64 ячейки уложиться.

По любому должно, главное не забыть проверить, что параллельные экспандеры разрешены в настройках синтезатора-маппера-фиттера.
Go to the top of the page
 
+Quote Post
sazh
сообщение Mar 9 2010, 20:45
Сообщение #16


Гуру
******

Группа: Свой
Сообщений: 2 435
Регистрация: 6-10-04
Из: Петербург
Пользователь №: 804



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


Для 7000 я не нашел.
Error: Can't pack LABs
Go to the top of the page
 
+Quote Post
des333
сообщение Mar 9 2010, 21:04
Сообщение #17


Профессионал
*****

Группа: Свой
Сообщений: 1 129
Регистрация: 19-07-08
Из: Санкт-Петербург
Пользователь №: 39 079



Код
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 ячейки и не влазит?


--------------------
Go to the top of the page
 
+Quote Post
x736C
сообщение Mar 9 2010, 21:18
Сообщение #18


Профессионал
*****

Группа: Участник
Сообщений: 1 273
Регистрация: 3-03-06
Пользователь №: 14 942



Все легко уминается с небольшим запасом сдвигом и подсчетом.


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
Go to the top of the page
 
+Quote Post
sazh
сообщение Mar 9 2010, 21:42
Сообщение #19


Гуру
******

Группа: Свой
Сообщений: 2 435
Регистрация: 6-10-04
Из: Петербург
Пользователь №: 804



Цитата(des333 @ Mar 10 2010, 00:04) *
почему при N=53 все собирается и занимает 22 ячейки, а при N=52 - занимает 62 ячейки и не влазит?


Значит, если к 52 добавить константу единицами до 2**n, все получится и с генерейтом.
Go to the top of the page
 
+Quote Post
des333
сообщение Mar 9 2010, 21:59
Сообщение #20


Профессионал
*****

Группа: Свой
Сообщений: 1 129
Регистрация: 19-07-08
Из: Санкт-Петербург
Пользователь №: 39 079



Цитата(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


--------------------
Go to the top of the page
 
+Quote Post
SM
сообщение Mar 10 2010, 07:56
Сообщение #21


Гуру
******

Группа: Свой
Сообщений: 7 946
Регистрация: 25-02-05
Из: Moscow, Russia
Пользователь №: 2 881



Ну вот, искали как дешифратор сделать, а нашли глюк в квартусе smile.gif
Go to the top of the page
 
+Quote Post
Adlex
сообщение Mar 10 2010, 15:26
Сообщение #22


Знающий
****

Группа: Свой
Сообщений: 500
Регистрация: 8-08-05
Пользователь №: 7 451



Вообще-то это получается шифратор
Go to the top of the page
 
+Quote Post
des333
сообщение Mar 10 2010, 20:18
Сообщение #23


Профессионал
*****

Группа: Свой
Сообщений: 1 129
Регистрация: 19-07-08
Из: Санкт-Петербург
Пользователь №: 39 079



Цитата(Adlex @ Mar 10 2010, 18:26) *
Вообще-то это получается шифратор


Да, вроде как, во втором сообщение автору это уже сообщили.  wink.gif


--------------------
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 17:34
Рейтинг@Mail.ru


Страница сгенерированна за 0.01595 секунд с 7
ELECTRONIX ©2004-2016