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

 
 
> Реализация алгоритма на логически элементах, Есть алгоритм работы. Какие микросхемы выбрать?
arhiv6
сообщение Nov 14 2014, 21:20
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 633
Регистрация: 21-05-10
Из: Томск
Пользователь №: 57 423



Потребовалось реализовать следующую схему:
Входов 9 штук: clk + a1,a2,a3,a4,b1,b2,b3,b4. Выходов 5 штук c1,c2,c3,c4,c5. Всегда только один из выходов находится в лог 1 (после подачи питания по умолчанию это выход с1). По фронту на входе clk состояние на выходе меняется по следующему алгоритму (перечислены все возможные состояния на входах):
- на на всех входах лог 0 - состояние на выходе не меняется.
- a1 в лог 1 - на выходе произойдёт сдвиг на +1.
- a1,a2 в лог 1 - на выходе произойдёт сдвиг на +2.
- a1,a2,a3 в лог 1 - на выходе произойдёт сдвиг на +3.
- a1,a2,a3,a4 в лог 1 - на выходе произойдёт сдвиг на +4.
- b1 в лог 1 - на выходе произойдёт сдвиг на -1.
- b1,b2 в лог 1 - на выходе произойдёт сдвиг на -2.
- b1,b2,b3 в лог 1 - на выходе произойдёт сдвиг на -3.
- b1,b2,b3,b4 в лог 1 - на выходе произойдёт сдвиг на -4.
Сдвиг на +1 означает, что , например, если лог 1 было на выходе с3, то по фронту на clk на выходе с3 станет лог 0, а на выходе с4 - лог1. Сдвиг нужен без переноса - если, например, лог 1 было на выходе с5, любой сдвиг в + ничего на выходе не изменит.
Вопрос: на каких логически микросхемах (сдвиговые регистры, счётчики и т.п.) можно реализовать такую схему? (микроконтроллер не предлагать sm.gif )


--------------------
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
arhiv6
сообщение Nov 15 2014, 16:59
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 633
Регистрация: 21-05-10
Из: Томск
Пользователь №: 57 423



Похоже CPLD придётся использовать. На verilog алгоритм написал (оказывается, это не сложно). В симуляторе (iverilog+vvp) проверил - работает.
CODE
module mod_logic(
input wire clock,
input wire [3:0]in_a,
input wire [3:0]in_b,
output reg [3:0]out_c
);

integer i=0,shift=0,position=0;

initial
out_c = 4'b0001;

always @(posedge clock )
begin

shift=0;

// проверка
if((in_a != 4'b0000) & (in_b != 4'b0000))
out_c <= 4'b1000; // обработка ошибок
else
begin

// определяем позицию на выходе
for(i=0; i<4; i=i+1)
begin
if(out_c[i])
position=i+1;
end

// считаем сдвиг в +, если это возможно
if((in_a != 4'b0000) & (out_c != 4'b1000))
begin
for(i=0; i<4; i=i+1)
begin
if(in_a[i])
shift=shift+1;
end

// сдвигаем
if (shift > (4-position))
out_c <= 4'b1000;
else
out_c <= out_c << shift;
end

// считаем сдвиг в -, если это возможно
if((in_b != 4'b0000) & (out_c != 4'b0001))
begin
for(i=0; i<4; i=i+1)
begin
if(in_b[i])
shift=shift+1;
end

// сдвигаем
if (shift > (position-1))
out_c <= 4'b0001;
else
out_c <= out_c >> shift;
end
end

//$display("position %d",position);
//$display("shift %d",shift);

end
endmodule

Один только минус - для симулирования всей схемы (в основном аналоговые компоненты), в которой эта CPLD будет стоять, нужен какой-то mixed-mode симулятор (spice+HDL(Verilog)). Обычную логику многие spice симуляторы умеют моделировать, а вот которые умеют файлы verilog подключать - не видел.


--------------------
Go to the top of the page
 
+Quote Post
iosifk
сообщение Nov 15 2014, 19:15
Сообщение #3


Гуру
******

Группа: Модераторы
Сообщений: 4 011
Регистрация: 8-09-05
Из: спб
Пользователь №: 8 369



Цитата(arhiv6 @ Nov 15 2014, 20:59) *
Похоже CPLD придётся использовать. На verilog алгоритм написал (оказывается, это не сложно). В симуляторе (iverilog+vvp) проверил - работает.
CODE
module mod_logic(
input wire clock,
input wire [3:0]in_a,
input wire [3:0]in_b,
output reg [3:0]out_c
);

integer i=0,shift=0,position=0;

initial
out_c = 4'b0001;

always @(posedge clock )
begin

shift=0;

// проверка
if((in_a != 4'b0000) & (in_b != 4'b0000))
out_c <= 4'b1000; // обработка ошибок
else
begin

// определяем позицию на выходе
for(i=0; i<4; i=i+1)
begin
if(out_c[i])
position=i+1;
end

// считаем сдвиг в +, если это возможно
if((in_a != 4'b0000) & (out_c != 4'b1000))
begin
for(i=0; i<4; i=i+1)
begin
if(in_a[i])
shift=shift+1;
end

// сдвигаем
if (shift > (4-position))
out_c <= 4'b1000;
else
out_c <= out_c << shift;
end

// считаем сдвиг в -, если это возможно
if((in_b != 4'b0000) & (out_c != 4'b0001))
begin
for(i=0; i<4; i=i+1)
begin
if(in_b[i])
shift=shift+1;
end

// сдвигаем
if (shift > (position-1))
out_c <= 4'b0001;
else
out_c <= out_c >> shift;
end
end

//$display("position %d",position);
//$display("shift %d",shift);

end
endmodule

Один только минус - для симулирования всей схемы (в основном аналоговые компоненты), в которой эта CPLD будет стоять, нужен какой-то mixed-mode симулятор (spice+HDL(Verilog)). Обычную логику многие spice симуляторы умеют моделировать, а вот которые умеют файлы verilog подключать - не видел.

Вот:
shift=0;
....
out_c <= 4'b1000; // обработка ошибок

блокирующие и неблокирующие под одним клоком не делают...
И все вот такие
for(i=0; i<4; i=i+1)
begin
if(in_b[i])
shift=shift+1;
end
это что?
Это же не Си, это должно работать в железе. А там, в железе никто не знает, что такое "i"...
вам надо прочесть о синтезируемых и несинтезируемых конструкциях...


--------------------
www.iosifk.narod.ru
Go to the top of the page
 
+Quote Post
SM
сообщение Nov 24 2014, 10:38
Сообщение #4


Гуру
******

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



Цитата(iosifk @ Nov 15 2014, 22:15) *
блокирующие и неблокирующие под одним клоком не делают...

Это да, безоговорочно.

Цитата(iosifk @ Nov 15 2014, 22:15) *
И все вот такие
for(i=0; i<4; i=i+1)
begin
if(in_b[i])
shift=shift+1;
end


А вот это полностью синтезируемо, и нормально. Для информации (для ТС, разумеется) - это синтезируется в 5 последовательно соединенных условных инкременторов (сумматоров, выполняющих функцию A+1/A+0 по условию). Также как и сдвиг "x >> shift" отлично синтезируется в баррелевский сдвигатель.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме


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

 


RSS Текстовая версия Сейчас: 28th July 2025 - 20:20
Рейтинг@Mail.ru


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