Господа! Как вы знаете, я вместе с другими товарищами консультирую Антона Моисеева и Андрея Маклакова, сотрудников кафедры прикладной математики Нижегородского государственного технического университета ( http://www.nntu.ru ), которые создают экспериментальный курс основ проектирования электроники для программистов.
Журнал Антона Моисеева, специально созданный для освещения темы - http://1i7.livejournal.com Мои посты по теме - http://panchul.livejournal.com/tag/nntu
Студенты Антона Моисеева уже поигрались с микросхемами малой степени интеграции, что в свое время вызвало негодование ЖЖ-юзера uzhas_sovka. Ужас наверное сам бы с удовольствием потыкал проводками в макетную плату, но после учебы в пижонском университете Чикаго uzhas_sovka боится, что его застанут за этим занятием нобелевские лауреаты по экономике и выдавят из своего круга, чисто из-за зависти.
После игрищ с микросхемами серии 4000, студенты Моисеева пересели на Xilinx FPGA, научились описывать простейшие комбинаторные цепи на Верилоге и познакомились с концепциями RS-триггера и D-триггера. Пора задизайнить что-нибудь полезное.
Фото справа - спутник, внутри которого стоит Xilinx FPGA, взято с http://www.eetimes.com/design/military-aerospace-design/4216480/High-performance-FPGAs-take-flight-in-microsatellites
По этому поводу я написал примерчик стекового калькулятора и имплементировал его в плате Digilent Basys 2 c Xilinx Spartan 3E. Примерчик иллюстрирует модульность, конечные автоматы, регистровые файлы в Верилоге, а также содержит всякие полезные штучки для начинающих пользователей FPGA - clock divider, button debouncer, 7-segment display driver.
 Калькуратор работает по принципу микрокалькулятора МК-54, который помнят советские школьники физматшкол 1980-х. Имеется стек, в котором хранятся числа. 8-битные числа вводятся с помощью рычажков, которые ненавидит ЖЖ-юзер exler. Текущая верхушка стека светится как 16-битное шестнадцатеричное число. Имеются четыре круглые кнопочки - reset, enter, add (+), multiply (*).
reset все обнуляет enter вводит 8-битное число с рычажков в верхушку стека add (+) удаляет два числа из верхушки стека, складывает их и вставляет в стек результат multiply (*) удаляет два числа из верхушки стека, умножает их и вставляет в стек результат
Видите рычажки на плате справа? Это те самые, которых боится Экслер. А FPGA на этой же плате - той же компании, что и FPGA в британском спутнике.
Имеются две версии калькулятора - одна (calculator) с более-менее правильным стилем, принятым у RTL-дизайнеров, другая (calculator_behavioral) - с стилем, которым хардверные люди как правило не пишут, но который более понятен софтверным людям - код выглядит как последовательная программа, описывающая поведение дизайна во время одного цикла синхросигнала.
Причин, по которым хардверные люди не пишут как в calculator_behavioral, несколько, в частности:
1. В таком коде трудно понять, какой из верилоговских регистров в процессе синтеза превратится в D-триггер, а какой просто становится проводом
2. В таком коде трудно понять, как оптимизировать тайминг
3. Такой стиль может порождать трудно-отлаживаемые ошибки из категории race conditions если человек, который его пишет не очень аккуратен с blocking и non-blocking assignmnets.
Поэтому хардвер-дизайнеры пишут как в calculator - так чтобы в частности в комбинаторном always-блоке не возникало никаких защелок (об этом сигнализирует synthesis tool), а все D-триггеры появлялись явной форме, как переменные, которым присваивается значение в небольшом блоке always @(posedge clock), который не содержит вычисления никаких формул.
Еще у чисто софтверных людей может возникнуть вопрос, почему я для стека сдвигаю весь массив, а не просто указатель на верхушку стека. Это, братцы, вся фишка хардвера - параллельный сдвиг не очень большого массива флип-флопов дешевле, чем гиганский мультиплексор для его индексации.
Мы на эти темы еще поговорим, а пока я выкладываю все файлы своего примерчика, сопровождая их сиськами Mirelle A по наводке kpt_flint для выработки положительных ассоциаций у всех читателей моего журнала мужского пола. А Наталия Радулова может получать положительные ассоциации от созерцания моего юзерпика (она когда-то писала, но потом стерла, что я доставляю ей удовольствие).
При использовании нетривиального количества моего кода ссылка на меня (Юрий Панчул) обязательна. Понятно, что я не буду карать презрением за какой-то дурацкий дебаунсер на 10 строк (дебаунсеры уже давно общие, я его сам где-то спер), но меня не устроит, если какая-нибудь Дарья Донцова спионерит мой примерчик целиком, а потом ко мне будут прибегать идиоты и настаивать, что это я якобы спионерил у Дарьи Донцовой.
//-------------------------------------------------------------------------//
//
// calculator.v
//
//-------------------------------------------------------------------------//
module calculator
(
input clock,
input reset,
input enter,
input add,
input multiply,
input [ 7:0] data,
output [15:0] result,
output overflow,
output [ 3:0] error
);
assign error = 0;
reg [15:0] alu_a;
reg [15:0] alu_b;
reg alu_multiply;
wire [15:0] alu_result;
wire alu_overflow;
alu alu
(
.a ( alu_a ),
.b ( alu_b ),
.multiply ( alu_multiply ),
.result ( alu_result ),
.overflow ( alu_overflow )
);
reg r_overflow;
assign overflow = r_overflow;
always @(posedge clock)
begin
if (reset)
r_overflow <= 0;
else
r_overflow <= alu_overflow;
end
reg stack_push;
reg stack_pop;
reg [15:0] stack_write_data;
wire [15:0] stack_read_data;
stack stack
(
.clock ( clock ),
.reset ( reset ),
.push ( stack_push ),
.pop ( stack_pop ),
.write_data ( stack_write_data ),
.read_data ( stack_read_data )
);
assign result = stack_read_data;
reg [15:0] r_alu_a;
reg [15:0] r_alu_b;
reg r_alu_multiply;
reg [ 1:0] state;
reg [ 1:0] next_state;
always @(*)
begin
alu_a = r_alu_a;
alu_b = r_alu_b;
alu_multiply = r_alu_multiply;
stack_push = 0;
stack_pop = 0;
stack_write_data = data;
next_state = state;
case (state)
0:
if (enter)
begin
stack_push = 1;
stack_write_data = data;
end
else if (add | multiply)
begin
alu_a = stack_read_data;
alu_multiply = multiply;
stack_pop = 1;
next_state = 1;
end
1:
begin
alu_b = stack_read_data;
stack_pop = 1;
next_state = 2;
end
2:
begin
stack_push = 1;
stack_write_data = alu_result;
next_state = 0;
end
endcase
end
always @(posedge clock)
begin
if (reset)
begin
r_alu_a <= 0;
r_alu_b <= 0;
r_alu_multiply <= 0;
state <= 0;
end
else
begin
r_alu_a <= alu_a;
r_alu_b <= alu_b;
r_alu_multiply <= alu_multiply;
state <= next_state;
end
end
endmodule
( Дальше )
Poll #1835851
Примерчик на верилоге для начинающих - стековый калькулятор
Open to: All, detailed results viewable to: All, participants: 23
Какие еще примерчики могли бы быть полезными для вводного или последующих курсов?
View Answers
| Простой кэш прямого отображения |
  1 (2.1%) |
| n-канальный ассоциативный кэш |
  1 (2.1%) |
| Процессорик с одним аккумулятором, оперативной памятью, несколькими командами арифметики и ветвления, команда в один цикл |
  8 (16.7%) |
| Процессорик с регистровым файлом, без оперативной памяти, несколькими команд, команда в один цикл |
  4 (8.3%) |
| Процессорик с регистровым файлом, без оперативной памяти, с небольшим последовательным конвейером и stalls |
  2 (4.2%) |
| То же, но еще и с forwarding |
  2 (4.2%) |
| То же, но еще и c branch prediction |
  3 (6.2%) |
| То же, но еще и c какой-нибудь демонстрацией суперскалярности |
  3 (6.2%) |
| Векторный сопроцессор |
  4 (8.3%) |
| Алгоритм шифрования |
  3 (6.2%) |
| Дать студентам в качестве курсовых работ сделать на FPGA аналог первых процессоров - ENIAC, МЭСМ |
  2 (4.2%) |
| Дать студентам в качестве курсовых работ сделать на FPGA аналог старых процессоров - PDP-8, Минск-1, Урал-1 |
  4 (8.3%) |
| DSP фильтр или подобные штучки |
  4 (8.3%) |
| Робот на колесиках с дальномеркой в качестве глаз |
  6 (12.5%) |
| Другое (пояснить в комментариях) |
  1 (2.1%) |
Как вы думаете, для такого курса лучше стандартизироваться на Xilinx или Altera?
View Answers
| Xilinx |
  2 (12.5%) |
| Altera |
  0 (0.0%) |
| Каждый студент должен попробовать и то, и другое |
  7 (43.8%) |
| Пол группы на Xilinx, пол группы на Altera, а потом устроить между группами соревнование |
  6 (37.5%) |
| Другое (пояснить в комментариях) |
  1 (6.2%) |
Другие мысли
View Answers
| А зачем это? Фурсенко сказал, что нужно взрастить квалифицированного потребителя |
  6 (46.2%) |
| Бросьте! То же самое могут прочитать и в Сколково за 600 миллионов долларов мудрецы из MIT. И закон Ома они лучше объяснят. |
  0 (0.0%) |
| Экслер уже объяснил, насколько смехотворны рычажки. Истинное обучение технологии - это как настроить Айфон. |
  1 (7.7%) |
| В Сан-Франциско намедни побывала Чирикова. Как Панчул упустил возможность разыграть с ней "Высурковскаяпропаганда" на улице? |
  3 (23.1%) |
| Из-за бугра плюете? |
  3 (23.1%) |
UPD: Сергей Вакуленко подошел и высказал мнение, что в такие серьезные посты нельзя помещать женские груди. Я сказал, что грудями ЖЖ не испортишь. На том и разошлись. Думаю.
ljpromo, приди! |