|
Помогите сделать дешифратор, На ПЛИСе |
|
|
|
Mar 9 2010, 13:53
|
Группа: Участник
Сообщений: 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"; Подскажите как сделать, горю!!!
|
|
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 22)
|
Mar 9 2010, 19:15
|
Группа: Участник
Сообщений: 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;
ну доработать слегка, если может быть более чем один ноль на входе, чтобы шифратор стал приоритетный. Спасибо, а не скажете, в параллельный никак не получится?
|
|
|
|
|
Mar 9 2010, 19:29
|
Группа: Участник
Сообщений: 5
Регистрация: 9-03-10
Пользователь №: 55 869

|
Это обработка клавиш, поэтому задержка в миллисекунды не критична
|
|
|
|
|
Mar 9 2010, 19:59
|
Группа: Участник
Сообщений: 5
Регистрация: 9-03-10
Пользователь №: 55 869

|
двойное нажатие пофик.
у меня 52 входа(нажата одна из клавиш только может быть, а если несколько, то пофик, пусть сработает любая из нажатых) и шесть выходов, которые по плану в двоичном коде должны загружать в мк номер нажатой клавиши.
|
|
|
|
|
Mar 9 2010, 21:04
|
Профессионал
    
Группа: Свой
Сообщений: 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 ячейки и не влазит?
--------------------
|
|
|
|
|
Mar 9 2010, 21:18
|
Профессионал
    
Группа: Участник
Сообщений: 1 273
Регистрация: 3-03-06
Пользователь №: 14 942

|
Все легко уминается с небольшим запасом сдвигом и подсчетом. out = 4'b0000; наверное надо поправить, хотя на результат может и не повлиять  Писал на скорую руку. Сыро и требует доработки, но работает в нужном направлении. Код 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
|
|
|
|
|
Mar 9 2010, 21:59
|
Профессионал
    
Группа: Свой
Сообщений: 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 и все и там и там влазит. Вот такая вот "веселуха"
--------------------
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|