Yuri Panchul (panchul) wrote,
Yuri Panchul
panchul

Написал примерчик на верилоге для начинающих - стековый калькулятор

Господа! Как вы знаете, я вместе с другими товарищами консультирую Антона Моисеева и Андрея Маклакова, сотрудников кафедры прикладной математики Нижегородского государственного технического университета ( 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


ДальшеCollapse )

Poll #1835851 Примерчик на верилоге для начинающих - стековый калькулятор

Какие еще примерчики могли бы быть полезными для вводного или последующих курсов?

Простой кэш прямого отображения
3(4.2%)
n-канальный ассоциативный кэш
3(4.2%)
Процессорик с одним аккумулятором, оперативной памятью, несколькими командами арифметики и ветвления, команда в один цикл
10(14.1%)
Процессорик с регистровым файлом, без оперативной памяти, несколькими команд, команда в один цикл
7(9.9%)
Процессорик с регистровым файлом, без оперативной памяти, с небольшим последовательным конвейером и stalls
4(5.6%)
То же, но еще и с forwarding
4(5.6%)
То же, но еще и c branch prediction
5(7.0%)
То же, но еще и c какой-нибудь демонстрацией суперскалярности
5(7.0%)
Векторный сопроцессор
5(7.0%)
Алгоритм шифрования
4(5.6%)
Дать студентам в качестве курсовых работ сделать на FPGA аналог первых процессоров - ENIAC, МЭСМ
4(5.6%)
Дать студентам в качестве курсовых работ сделать на FPGA аналог старых процессоров - PDP-8, Минск-1, Урал-1
6(8.5%)
DSP фильтр или подобные штучки
4(5.6%)
Робот на колесиках с дальномеркой в качестве глаз
6(8.5%)
Другое (пояснить в комментариях)
1(1.4%)

Как вы думаете, для такого курса лучше стандартизироваться на Xilinx или Altera?

Xilinx
3(16.7%)
Altera
0(0.0%)
Каждый студент должен попробовать и то, и другое
8(44.4%)
Пол группы на Xilinx, пол группы на Altera, а потом устроить между группами соревнование
6(33.3%)
Другое (пояснить в комментариях)
1(5.6%)

Другие мысли

А зачем это? Фурсенко сказал, что нужно взрастить квалифицированного потребителя
6(42.9%)
Бросьте! То же самое могут прочитать и в Сколково за 600 миллионов долларов мудрецы из MIT. И закон Ома они лучше объяснят.
0(0.0%)
Экслер уже объяснил, насколько смехотворны рычажки. Истинное обучение технологии - это как настроить Айфон.
1(7.1%)
В Сан-Франциско намедни побывала Чирикова. Как Панчул упустил возможность разыграть с ней "Высурковскаяпропаганда" на улице?
4(28.6%)
Из-за бугра плюете?
3(21.4%)


UPD: Сергей Вакуленко подошел и высказал мнение, что в такие серьезные посты нельзя помещать женские груди. Я сказал, что грудями ЖЖ не испортишь. На том и разошлись. Думаю.

ljpromo, приди!
Tags: important, nntu
Subscribe

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 78 comments
Previous
← Ctrl ← Alt
Next
Ctrl → Alt →
Previous
← Ctrl ← Alt
Next
Ctrl → Alt →