?

Log in

No account? Create an account
Что накупить для вводных FPGA лаб для студентов - Юрий Панчул [entries|archive|friends|userinfo]
Money can buy bandwidth. Latency requires bribing God.

[ website | My Website ]
[ userinfo | livejournal userinfo ]
[ archive | journal archive ]

Что накупить для вводных FPGA лаб для студентов [Feb. 27th, 2015|12:14 am]
Yuri Panchul
Господа! Как вы знаете, я по субботам помогаю Тимуру Палташеву из AMD учить студентов в небольшом частном университете во Фримонте. Причина, почему я это делаю: так как я даю советы нашему менеджменту в Imagination Technologies по поводу образовательных программ в России, то я должен знать, как выглядит студент и что он понимает. Т.е. потренироваться на индусах и китайцах, а потом высказываться по поводу России. Кроме элементарных упражнений там будет и нечто продвинутое, о чем я расскажу через некоторое время.

Так вот. В текущий момент есть тактическая задача надрессировать студентов, чтобы они соединили FPGA плату с каким-нибудь устройтвом типа джойстика, температурного сенсора, дальномерки и т.д. Простые протоколы - SPI, I2C, UART. Конечные автоматы, основы кодирования на Verilog на уровне Register Transfer Level (RTL).

По этому поводу я делаю шоппинг и прошу вас оценить мой выбор. Обращаю внимание, что речь идет о простых хардверных (не софтверных) дизайнах. Например устройства с большим количеством регистров или сложной процедурой инициализации не покатит - к ним хорошо писать программу для микроконтроллера, но не плисовый хардвер.

Ниже:

1. Список для шоппинга с моими пометками, прошу комментировать

2. Мой код примерчега для цифрового потенциометра, чтобы вы оценили требуемый уровень сложности (элементарный)

3. Фотографии цифрового потенциометра, чтобы вы оценили пример




Крупно: список для шоппинга с моими пометками, прошу комментировать:

e1Screenshot 2015-02-26 21

e2Screenshot 2015-02-26 21

e3Screenshot 2015-02-26 21

e4Screenshot 2015-02-26 21

e5Screenshot 2015-02-26 21

e6Screenshot 2015-02-26 21

s7Screenshot 2015-02-26 21

e8Screenshot 2015-02-26 21.44.20 copy

s9Screenshot 2015-02-26 21

s99Screenshot 2015-02-26 21





Мой код примерчега для цифрового потенциометра и платы Digilent Cmod S6, чтобы вы оценили требуемый уровень сложности (элементарный):

Файл spi_transmitter.v


module spi_transmitter
(
    input            clock,
    input            reset,

    input      [7:0] data,

    input            transmit,
    output reg       ready,

    output reg       sclk,
    output reg       sdi,
    output reg       cs
);

    localparam IDLE                = 0,
               DRIVE_POSEDGE_CLOCK = 1,
               DRIVE_DATA          = 2;

    reg       d_ready;
    reg       d_sclk;
    reg       d_sdi;
    reg       d_cs;

    reg [2:0] counter;
    reg [6:0] shift_reg;
    reg [1:0] state;

    reg [2:0] d_counter;
    reg [6:0] d_shift_reg;
    reg [1:0] d_state;

    always @*
    begin
        d_ready     = ready;
        d_sclk      = 0;
        d_sdi       = sdi;
        d_cs        = cs;

        d_counter   = counter;
        d_shift_reg = shift_reg;
        d_state     = state;
        
        case (state)

        IDLE:
        begin
            if (transmit)
            begin
                d_ready     = 0;
                d_sclk      = 0;
                d_sdi       = data [7];
                d_cs        = 0;

                d_counter   = 7;
                d_shift_reg = data [6:0];
                
                d_state     = DRIVE_POSEDGE_CLOCK;
            end
            else
            begin
                d_cs        = 1;
            end
        end

        DRIVE_POSEDGE_CLOCK:
        begin
            d_sclk    = 1;
            // d_sdi stays the same

            if (d_counter == 0)
            begin
                d_ready = 1;
                d_state = IDLE;
            end
            else
            begin
                d_state = DRIVE_DATA;
            end
        end

        DRIVE_DATA:
        begin
            d_sclk      = 0;
            d_sdi       = d_shift_reg [6];

            d_counter   = d_counter - 3'd1;
            d_shift_reg = d_shift_reg << 1;

            d_state     = DRIVE_POSEDGE_CLOCK;
        end
		  
        endcase
    end

    always @(posedge clock)
    begin
        if (reset)
        begin
            ready     <= 1;
            sclk      <= 0;
            sdi       <= 0;
            cs        <= 0;

            counter   <= 0;
            shift_reg <= 0;
            state     <= IDLE;
        end
        else
        begin
            ready     <= d_ready;
            sclk      <= d_sclk;
            sdi       <= d_sdi;
            cs        <= d_cs;
                                      
            counter   <= d_counter;
            shift_reg <= d_shift_reg;
            state     <= d_state;
        end
    end

endmodule

//--------------------------------------------------------------------

module cmod_s6_pmod_dpot
(
    input        clock,

    input  [1:0] buttons,
    output [3:0] leds,

    output       dpot_vcc,
    output       dpot_gnd,
    output       dpot_sclk,
    output       dpot_sdi,
    output       dpot_cs
);

    wire reset    = buttons [0];
    wire increase = buttons [1];

    assign dpot_vcc = 1'b1;
    assign dpot_gnd = 1'b0;

    reg [7:0] d_resistance;
    reg       d_transmit;

    reg [7:0] resistance;
    reg       transmit;

    wire      ready;

    spi_transmitter spi_transmitter_inst
    (
        .clock     ( clock       ),
        .reset     ( reset       ),

        .data      ( resistance  ),

        .transmit  ( transmit    ),
        .ready     ( ready       ),

        .sclk      ( dpot_sclk   ),
        .sdi       ( dpot_sdi    ),
        .cs        ( dpot_cs     )
    );

    always @*
    begin
        d_resistance = resistance;
        d_transmit   = 0;

        if (ready & increase)
        begin
            d_resistance = d_resistance + 19;
            d_transmit   = 1;
        end
    end

    always @(posedge clock)
    begin
        if (reset)
        begin
            resistance <= 0;
            transmit   <= 0;
        end
        else
        begin
            resistance <= d_resistance;
            transmit   <= d_transmit;
        end
    end

    assign leds [0] = clock;
    assign leds [1] = dpot_sclk;
    assign leds [2] = dpot_sdi;
    assign leds [3] = ready;

endmodule

//--------------------------------------------------------------------

Файл spi_transmitter.ucf для обозначения соединений

NET "clock" LOC = "N7" | IOSTANDARD = LVCMOS33;

NET "buttons<0>" LOC = "P8" | IOSTANDARD = LVCMOS33;
NET "buttons<1>" LOC = "P9" | IOSTANDARD = LVCMOS33;

NET "leds<0>" LOC = "N3" | IOSTANDARD = LVCMOS33;
NET "leds<1>" LOC = "P3" | IOSTANDARD = LVCMOS33;
NET "leds<2>" LOC = "N4" | IOSTANDARD = LVCMOS33;
NET "leds<3>" LOC = "P4" | IOSTANDARD = LVCMOS33;

NET "dpot_vcc"  LOC = "K1" | IOSTANDARD = LVCMOS33 | PULLUP;
NET "dpot_gnd"  LOC = "K2" | IOSTANDARD = LVCMOS33 | PULLUP;
NET "dpot_sclk" LOC = "L1" | IOSTANDARD = LVCMOS33 | PULLUP;
NET "dpot_sdi"  LOC = "M1" | IOSTANDARD = LVCMOS33 | PULLUP;
NET "dpot_cs"   LOC = "M2" | IOSTANDARD = LVCMOS33 | PULLUP;






С сайта Digilent:



Моя фотка:

2015-02-21 11.13.34



Что вы одобряете из моего списка для вводных лаб для студентов? (Напомню, интерфейс к FPGA, а не микроконтроллеру)?

Датчик прикосновения
5(7.4%)
Цифровой потенциометр
4(5.9%)
UART для подключения к PC через USB
5(7.4%)
16x2 алфавитно-цифровой дисплей с интерфейсами SPI, I2C и UART
7(10.3%)
Простая 16-кнопочная клавиатура
5(7.4%)
Джойстик с интерфейсом SPI
5(7.4%)
Rotary encoder - как это по русски - ну хрень, которая поворачивается
6(8.8%)
Модуль с 4 кнопочками для дополнительной отладки
3(4.4%)
Модуль с LED - удобно для отладки SPI или UART -соединения
5(7.4%)
Дальномерка (pulse-width или UART интерфейсы)
8(11.8%)
Сенсор света с SPI
7(10.3%)
Сенсор температуры с I2C
5(7.4%)
Я предлагаю иное (написать в комментариях)
3(4.4%)
LinkReply

Comments:
[User Picture]From: olegart
2015-02-27 08:23 am (UTC)
PmodPS2 — может даже с переходником на USB не заработать. Протоколы в USB и PS/2 существенно разные, и я совершенно не уверен, что в контроллерах продающихся сейчас клавиатур ещё оставили поддержку первого.

PmodStep и PmodDHB1 можно для управления моторчиками, это в принципе популярная тема.
(Reply) (Thread)
[User Picture]From: panchul
2015-02-27 08:27 am (UTC)
Да, с PS2/USB я тоже об этом думал. PS2 клавиатуры исчезли подчистую даже из электронных супермаркетов http://frys.com , в которых для полноты есть ну очень старинные устройства.

С моторами я просто никогда не изучал тему - надо будет посмотреть.
(Reply) (Parent) (Thread) (Expand)
[User Picture]From: eaa
2015-02-27 08:34 am (UTC)
драйвер мотора, шагового или трехфазного синхронного.
ацп есть в этом ксилинксе или компараторы хотя бы?
микрофон, кстати, тоже прикольная штука, из нескольких можно сделать, например, систему
определения положения источника звука выстрела )))

Edited at 2015-02-27 08:36 am (UTC)
(Reply) (Thread)
[User Picture]From: panchul
2015-02-27 08:46 am (UTC)
Я так и не понял у микрофона интерфейс. А как делается определение источника звука?
(Reply) (Parent) (Thread) (Expand)
[User Picture]From: andrey_yurin
2015-02-27 08:37 am (UTC)
В своё время я игрался на Debug-board с I2C-термодатчиком и отображением всего этого на SPI-LСD индикаторе. Только со стороны FPGA я бы всё описывал не одним единственным автоматом, а описал автомат I2C, автомат вывода на LСD и автомат управления. И заодно аккурат бы ввёл понятие частотного домена и показал как правильно переносить данные из одного домена во второй. Лично мне в своё время этого очень не хватало, что бы кто-то показал-рассказал. Так что я за вариант: "термодатчик + индикация".
(Reply) (Thread)
[User Picture]From: panchul
2015-02-27 08:48 am (UTC)
*** а описал автомат I2C, автомат вывода на LСD и автомат управления ***

Да, разумеется

*** И заодно аккурат бы ввёл понятие частотного домена и показал как правильно переносить данные из одного домена во второй ***

Вы имеете в виду кратные частоты из одного источника (derived clocks) или полностью асинхронные?

(Reply) (Parent) (Thread) (Expand)
[User Picture]From: sergegers1
2015-02-27 09:29 am (UTC)
А где же полупрозрачная комбинация для Радуловой?
(Reply) (Thread)
From: realurix
2015-02-27 10:46 am (UTC)
И где мечущиеся стрелки осциллографов для Латыниной?
(Reply) (Parent) (Thread)
[User Picture]From: ziger
2015-02-27 10:18 am (UTC)
Юрий, подскажите, пожалуйста, что за платка c подключенным USB-кабелем, у вас на последней фотке?
(Reply) (Thread)
[User Picture]From: panchul
2015-02-27 05:43 pm (UTC)

Это Digilent Cmod S6 с Spartan-6 (одним из младших вариантов)

https://www.digilentinc.com/Products/Detail.cfm?NavPath=2,400,1227&Prod=CMOD-S6
(Reply) (Parent) (Thread) (Expand)
From: realurix
2015-02-27 10:40 am (UTC)
> хрень, которая поворачивается
Эта хрень называется датчик угла.

Я что-то у тебя не увидел аналоговых частей. Например, для изучения работы АЦП. И т.д.
(Reply) (Thread)
[User Picture]From: oppad1
2015-02-27 12:01 pm (UTC)
эта хрень так и называется
поворотный энкодер
а датчик угла может быть и датчиком Холла, и всякими MEMS гироскопами/инклинометрами
(Reply) (Parent) (Thread) (Expand)
(Deleted comment)
[User Picture]From: oppad1
2015-02-27 11:55 am (UTC)
если не зацикливаться на ксайлинсе, то например, в 50$
http:// www .latticesemi .com /latticexp2-brevia

плюсы - дается в бесплатном пакете Synplify, что имхо кроет ксайлинские тулзы как бык овцу
P&R проще - чем-то напоминает старые ISE и т.п.

на кристалле есть FLASH, то есть не нужно внешнюю загрузку

дизайн - LatticeMico8, туда влезет и LatticeMico32, если постараться, на плате есть SRAM






(Reply) (Thread)
[User Picture]From: panchul
2015-02-27 05:40 pm (UTC)
Да, мне тоже Synplify нравится больше тулов от Xilinx. Lattice надо попробовать, особенно если к нему идет студенческая версия Synplify бесплатно.
(Reply) (Parent) (Thread) (Expand)
[User Picture]From: openh_master
2015-02-27 12:13 pm (UTC)

Цифровая обработка звука

Модуль PmodMic для захвата звука. Обработка его в FPGA, каким либо образом. Обратное преобразование в звук через модуль PmodR2R, усиление звука на PmodAMP2.
(Reply) (Thread)
[User Picture]From: panchul
2015-02-27 07:11 pm (UTC)

Re: Цифровая обработка звука

Спасибо, посмотрю!
(Reply) (Parent) (Thread)
From: raygo
2015-02-28 11:25 am (UTC)
а чего не включили в список PmodSWT? Вроде ж классика-задание режимов переключателями?
(Reply) (Thread)
[User Picture]From: panchul
2015-03-02 10:50 pm (UTC)
Они уже есть на большинстве учебных FPGA плат
(Reply) (Parent) (Thread)
From: Иван Графский
2015-03-01 10:33 am (UTC)
Давно хотел спросить следующий вопрос

Вот есть разделение кода на комбинаторную и последовательностную схемы. Это стандарт написания кода или тупо для облегчения понимания студентов?
(Reply) (Thread)
[User Picture]From: panchul
2015-03-01 08:43 pm (UTC)
Это чтобы избежать появления бага, при котором некому значению, которое по задумке должно было быть комбинаторным, оказывается присвоено значение не во всех ветках if и case, из-за чего синтезатор делает flip-flop, который автор не хотел.

Если же сделать такое в always_comb или always @*, то синтезатор или линтер сделает warning или error про inferred latch.

Народ просто за N лет намучался с разными багами из-за смешанного использования "=" и "<=" в "always @(posedge" и неочевидностью понять, станет ли reg флип-флопом или нет, и в районе 2000-го года по этому поводу вышло несколько книжек, предлагающих стиль унифицировать в том числе вот в таком виде.

При этом, это скорее рекомендация, чем 100% требование. 100% требование - это чтобы код было easy to follow, легко понимать.
(Reply) (Parent) (Thread)
From: Иван Графский
2015-03-01 08:42 pm (UTC)
Если интересно - вот учебник + лабораторный практикум по которому занимаются у нас на кафедре http://www.guildofengineers.ru/wp-content/uploads/2012/10/XilinxCourse_v2.2.pdf
Могу познакомить с автором)
(Reply) (Thread)
[User Picture]From: panchul
2015-03-01 08:48 pm (UTC)
Спасибо, посмотрю!
(Reply) (Parent) (Thread)