Время рулить.


Пробежимся по схеме.

/***************** servo_tester.v ******************/
module servo_tester (input wire clock,
input wire left_button,
input wire right_button,
output wire servo_pulse,
output wire [7:0] segments,
output wire [3:0] digits);
wire uclock;
wire [11:0] pulse_duration;
micro_counter MC1(clock, uclock);
button_control BC1(uclock, left_button, right_button, pulse_duration);
rc_servo RCS1(uclock, pulse_duration, servo_pulse);
ss4d D1(clock, pulse_duration, segments, digits);
endmodule
/***************** servo_tester.v ******************/
Основоной исходник как всегда прост. Только провода и вызовы модулей. С некоторых пор я стараюсь помещать в отдельный черный ящик даже тот код, который, скорее всего больше нигде не применю. Потому, что это помогает сразу построить наглядную схему.
Если присмотреться, видно, что на входе в модуль ss4d пара проводов в шине помечена как not connected в данном случае это нормально, но вообще такие вещи должны вас настораживать, так как это может быть результатом ошибки в соединениях.
/************** micro_counter.v ****************/
module micro_counter (input wire clock,
output wire uclock);
reg [5:0] micro_reg;
reg micro_bit;
assign uclock = micro_bit;
always @ (posedge clock)
begin
micro_bit <= (micro_reg < 25) ? 1 : 0;
micro_reg <= (micro_reg < 50) ? (micro_reg + 1) : 0;
end
endmodule
/************** micro_counter.v ****************/
Модуль micro_counter нужен для получения импульсов с периодом 1 мкс. Чтобы удобнее было потом выводить информацию на индикатор.
/******************* button_control.v *********************/
module button_control(input wire uclock,
input wire left_button,
input wire right_button,
output wire [11:0] pulse_duration);
reg [11:0] pd_reg;
reg [9:0] button_check_reg;
assign pulse_duration = pd_reg;
always @ (posedge uclock)
begin
if ((button_check_reg == 0) &&
(left_button) &&
(!right_button) &&
(pd_reg > 250)) pd_reg <= pd_reg - 1;
if ((button_check_reg == 0) &&
(!left_button) &&
(right_button) &&
(pd_reg < 2500)) pd_reg <= pd_reg + 1;
if ((pd_reg > 2500) || (pd_reg < 250)) pd_reg <= 1000;
button_check_reg <= button_check_reg + 1;
end
endmodule
/******************* button_control.v *********************/
В button_control сложена основная логика, задано исходное положение. На вход модуля подаются сигналы с кнопок управления. На выходе — значение продолжительности управляющих импульсов. Оно отправляется на индикатор и модуль rc_servo, который формирует импульсы для рулевой машинки.
/********************* rc_servo.v ******************/
module rc_servo (input wire uclock,
input wire [11:0] pulse_duration,
output wire pulse);
reg [14:0] pf_reg;
reg pulse_bit;
assign pulse = pulse_bit;
always @ (posedge uclock)
begin
pulse_bit <= (pf_reg < pulse_duration) ? 1 : 0;
pf_reg <= (pf_reg < 20000) ? (pf_reg + 1) : 0;
end
endmodule
/********************* rc_servo.v ******************/
Отображением чисел на индикаторе занимается модуль ss4d описание и исходный код которого можно найти в другой статье.
В завершении статьи видео.
В моем коде продолжительность управляющих импульсов находится в диапазоне 250 мкс — 2500 мкс. На записи заметно когда рулевая машинка упирается в ограничители и жужит пытаясь добраться до положения которое я ей задал. Можно примерно прикинуть, что для данной машинки диапазон продолжительности импульса примерно 400 — 2200 мкс. Пару раз я специально заливаю прошивку заново, чтобы продемонстрировать, что происходит при инициализации схемы.
- 0
- 20 июня 2011, 18:46
- digides
Хе-хе, месье знает толк в расстреле воробьев из орбитальной пушки)
А на какой ПЛИС оно сделано и сколько оная стоит?
А на какой ПЛИС оно сделано и сколько оная стоит?
))) О майн фринд. Дас ист гут пушка. Партизанен пуф-пуф.
Вообще плата довольно крутанская. Моя сделана на Altera Cyclone III и в неё мог бы поместиться 286-й, если не круче. Осталось только выкурить еще пару гигов схемотехники. Стоит она баксов 150.
А данный проект, я думаю должен помещаться в тот Max II, который на «марсоходе» стоит. Компилятор говорит, что получилось 248 LE.
Вообще плата довольно крутанская. Моя сделана на Altera Cyclone III и в неё мог бы поместиться 286-й, если не круче. Осталось только выкурить еще пару гигов схемотехники. Стоит она баксов 150.
А данный проект, я думаю должен помещаться в тот Max II, который на «марсоходе» стоит. Компилятор говорит, что получилось 248 LE.
а давайте всё же разделять cpld и fpga.
всё-таки изделия разных миров и общего в них только возможность конфигурирования
уж не знаю как у альтеры, но у ксилинса (да, да, знаю что правильно зайлинкс) попытки упаковать даже чуть более сложное чем простейшие забавы на хдл в кплд заканчивались полным фиаско: вылезало за размеры xc95288
всё-таки изделия разных миров и общего в них только возможность конфигурирования
уж не знаю как у альтеры, но у ксилинса (да, да, знаю что правильно зайлинкс) попытки упаковать даже чуть более сложное чем простейшие забавы на хдл в кплд заканчивались полным фиаско: вылезало за размеры xc95288
Попробовал скомпилировать под Max II. В «марсоходовский» действительно не влезло потому, что его емкость 240 LE, а не 250 как мне казалось. А в следующий по размерам(570 LE), формально, поместилось. Не могу утверждать, что успешно, так как не имею такой железки для эксперимента. Но само количество логических элементов практически не изменилось — 246 и 248. Похоже «логический элемент» у Альтеры — понятие универсальное. И его все таки можно использовать для примерной оценки.
В устройстве Максов и Циклонов действительно есть серьезные отличия, только в данном проекте они не используются. Грубо говоря в Альтеровских CPLD есть только логические элементы, а в FPGA еще есть память, блоки умножения наверно(не знаю как их по русски назвать)Embedded Multipliers и PLLs (пока не знаю как их задействовать, судя по описанию, крутые штуки).
В устройстве Максов и Циклонов действительно есть серьезные отличия, только в данном проекте они не используются. Грубо говоря в Альтеровских CPLD есть только логические элементы, а в FPGA еще есть память, блоки умножения наверно(не знаю как их по русски назвать)Embedded Multipliers и PLLs (пока не знаю как их задействовать, судя по описанию, крутые штуки).
Я не против. Не пишу сразу в тематический блог потому, что не знаю уровень своих статей. Подходит. Не подходит. Нужно только разобраться как это технически осуществляется.
Ну, а то как это сделать технически написано тут:
we.easyelectronics.ru/page/about/
Ваши статьи я уже перенес.
we.easyelectronics.ru/page/about/
Ваши статьи я уже перенес.
Комментарии (12)
RSS свернуть / развернуть