Как я провел воскресенье

топ 100 блогов panchul04.08.2014

Смастерил примерчик для вводного курса по микроконтроллерам и FPGA и проинструктировал как использовать Microchip MPLAB X и Xilinx ISE профессоршу из Казахстана, которая гостит в Калифорнии:

Как я провел воскресенье

Сходил со старшим сыном в зоопарк (не в Сан-Франциско, а в Окленде):

Как я провел воскресенье

Как я провел воскресенье

Как я провел воскресенье

В зоопарке интересные парковые розы

Как я провел воскресенье

Как я провел воскресенье

Потом пошли в ресторан. На первое сьел жареные устрицы:

Как я провел воскресенье

на второе сьел равиоли с артишоками и крабами. одновременно читал интернет с дискуссиями, был ли Голодомор на Украине геноцидом:

Как я провел воскресенье

На обратном пути попал в пробку и увидел, как везли вот такую машину:

Как я провел воскресенье

View Poll: mobile-poll

Posted via LiveJournal app for Android.

Приложение: код примерчика на Верилоге: Зеленая плата - Digilent Cmod S6 с Xilinx Spartan-6 FPGA (xc6slx4, package cpg196, speed -2)

Как я провел воскресенье

module clock_divider
(
    input        clock,
    input        reset,
    output       clock_for_debouncing,
    output       clock_for_display
);

    reg [19:0] counter;

    always @(posedge clock)
    begin
        if (reset)
            counter <= 0;
        else
            counter <= counter + 1;
    end

    // clock is 8 MHz
    // clock_for_debouncing is 8 MHz / 2 ** (16 + 1) ~ 61 Hz
    // clock_for_display    is 8 MHz / 2 ** (12 + 1) ~ 977 Hz

    assign clock_for_debouncing = counter [16];
    assign clock_for_display    = counter [12];

endmodule

module debouncer
(
    input      clock,
    input      clock_for_debouncing,
    input      reset,
    input      button,
    output reg push
);

    reg [2:0] samples;

    always @(posedge clock_for_debouncing)
    begin
        if (reset)
            samples <= 0;
        else
            samples <= { samples [1:0], button };
    end

    wire current = & samples;
    reg  previous;

    always @(posedge clock)
    begin
        if (reset)
        begin
            previous <= 0;
            push     <= 0;
        end
        else
        begin
            previous <= current;
            push     <= { previous, current } == 2'b01;
        end
    end

endmodule

module display
(
    input             clock,
    input             reset,
    input      [15:0] number,
    output reg [ 6:0] seven_segments,
    output reg [ 3:0] cathodes
);

    function [6:0] bcd_to_seg (input [3:0] bcd);

        case (bcd)
        'h0: bcd_to_seg = 'b0111111;  // g f e d c b a
        'h1: bcd_to_seg = 'b0000110;
        'h2: bcd_to_seg = 'b1011011;  //   --a--
        'h3: bcd_to_seg = 'b1001111;  //  |     |
        'h4: bcd_to_seg = 'b1100110;  //  f     b
        'h5: bcd_to_seg = 'b1101101;  //  |     |
        'h6: bcd_to_seg = 'b1111101;  //   --g--
        'h7: bcd_to_seg = 'b0000111;  //  |     |
        'h8: bcd_to_seg = 'b1111111;  //  e     c
        'h9: bcd_to_seg = 'b1100111;  //  |     |
        'ha: bcd_to_seg = 'b1110111;  //   --d-- 
        'hb: bcd_to_seg = 'b1111100;
        'hc: bcd_to_seg = 'b0111001;
        'hd: bcd_to_seg = 'b1011110;
        'he: bcd_to_seg = 'b1111001;
        'hf: bcd_to_seg = 'b1110001;
        endcase

    endfunction

    reg [1:0] i;

    always @(posedge clock or posedge reset)
    begin
        if (reset)
        begin
            i <= 0;

            seven_segments <= bcd_to_seg (0);
            cathodes       <= 'b0000;
        end
        else
        begin
            seven_segments <= bcd_to_seg (number [i * 4 +: 4]);
            cathodes       <= ~ (1 << i);

            i <= i + 1;
        end
    end

endmodule

module raw_and_debounced
(
    input        CLK,         // FPGA_GCLK, 8MHz
    input        CLK_LFC,     // FPGA_LFC, 1 Hz

    output       LED_0,
    output       LED_1,
    output       LED_2,
    output       LED_3,

    input        BTN_0,
    input        BTN_1,

    // DEPP interface

    // input        DEPP_ASTB,   // Address strobe
    // input        DEPP_DSTB,   // Data strobe
    // input        DEPP_WRITE,  // Write enable (write operation = 0, read operation = 1)
    // output       DEPP_WAIT,   // Ready 
    // inout  [7:0] DBUS,

    // General purpose I/O

    output [7:0] PORTA,
    output [7:0] PORTB,
    output [6:0] PORTC,
    output [7:0] PORTD,
    input  [7:0] PORTE,
    output [6:0] PORTF
);

    assign PORTB = 'hff;
    assign PORTC = 'h7f;
    assign PORTD = 'hff;
    
    wire clock = CLK;
    wire reset = BTN_0;

    wire clock_for_debouncing;
    wire clock_for_display;

    clock_divider clock_divider
    (
        .clock                 ( clock                ),
        .reset                 ( reset                ),
        .clock_for_debouncing  ( clock_for_debouncing ),
        .clock_for_display     ( clock_for_display    )
    );

    wire raw_button                = ~ PORTE [7];
    wire pre_debounced_button      = ~ PORTE [6];
    wire posedge_debounced_button;

    wire on_board_button = ~ BTN_1;

    debouncer debouncer
    (
        .clock                 ( clock                    ),
        .clock_for_debouncing  ( clock_for_debouncing     ),
        .reset                 ( reset                    ),
        .button                ( pre_debounced_button     ),
        .push                  ( posedge_debounced_button )
    );

    reg   [15:0] number;
    wire  [ 6:0] seven_segments;
    wire  [ 3:0] cathodes;

    display display
    (
        .clock           ( clock_for_display ),
        .reset           ( reset             ),
        .number          ( number            ),
        .seven_segments  ( seven_segments    ),
        .cathodes        ( cathodes          )
    );

    // g f e d c b a
    
    //   --a--
    //  |     |
    //  f     b
    //  |     |
    //   --g--
    //  |     |
    //  e     c
    //  |     |
    //   --d-- 
                  
    assign PORTA [0] = seven_segments [4]; // E  1
    assign PORTA [1] = seven_segments [3]; // D  2
    assign PORTA [2] = 0;                  // .  3
    assign PORTA [3] = seven_segments [2]; // C  4
    assign PORTA [4] = seven_segments [6]; // G  5
    assign PORTA [5] = seven_segments [1]; // B  7
    assign PORTA [6] = seven_segments [5]; // F 10
    assign PORTA [7] = seven_segments [0]; // A 11

    assign PORTF = { 4'b1111, cathodes };

    assign LED_0 = 0; // raw_button;
    assign LED_1 = 0; // pre_debounced_button;
    assign LED_2 = 0;
    assign LED_3 = 0;

    reg prev_raw_button;

    always @(posedge CLK)
    begin
        if (reset)
            prev_raw_button <= 0;
        else
            prev_raw_button <= raw_button;
    end
         
    wire posedge_raw_button = ~ prev_raw_button & raw_button;

    always @(posedge CLK)
    begin
        if (reset)
            number = 0;
        else if (posedge_raw_button | posedge_debounced_button)
            number = number + 1;
    end

endmodule

# cmods6.ucf

#FPGA_GCLK
NET "CLK" LOC = "N8" | IOSTANDARD = LVCMOS33;

#CLK_LFC
NET "CLK_LFC" LOC = "N7" | IOSTANDARD = LVCMOS33;

#BTNs
NET "BTN_0" LOC = "P8" | IOSTANDARD = LVCMOS33;
NET "BTN_1" LOC = "P9" | IOSTANDARD = LVCMOS33;

#LEDs
NET "LED_0" LOC = "N3" | IOSTANDARD = LVCMOS33;
NET "LED_1" LOC = "P3" | IOSTANDARD = LVCMOS33;
NET "LED_2" LOC = "N4" | IOSTANDARD = LVCMOS33;
NET "LED_3" LOC = "P4" | IOSTANDARD = LVCMOS33;

#DEPP Signals
#NET "DEPP_WAIT" LOC = "B6" | IOSTANDARD = LVCMOS33;
#NET "DEPP_ASTB" LOC = "A6" | IOSTANDARD = LVCMOS33;
#NET "DEPP_DSTB" LOC = "B7" | IOSTANDARD = LVCMOS33;
#NET "DEPP_WRITE" LOC = "A7" | IOSTANDARD = LVCMOS33;
#NET "DBUS<0>" LOC = "B9" | IOSTANDARD = LVCMOS33;
#NET "DBUS<1>" LOC = "A9" | IOSTANDARD = LVCMOS33;
#NET "DBUS<2>" LOC = "B10" | IOSTANDARD = LVCMOS33;
#NET "DBUS<3>" LOC = "A10" | IOSTANDARD = LVCMOS33;
#NET "DBUS<4>" LOC = "B11" | IOSTANDARD = LVCMOS33;
#NET "DBUS<5>" LOC = "A11" | IOSTANDARD = LVCMOS33;
#NET "DBUS<6>" LOC = "B12" | IOSTANDARD = LVCMOS33;
#NET "DBUS<7>" LOC = "A12" | IOSTANDARD = LVCMOS33;

#IO PORTs

#A
NET "PORTA<0>" LOC = "P5" | IOSTANDARD = LVCMOS33 | PULLUP;
NET "PORTA<1>" LOC = "N5" | IOSTANDARD = LVCMOS33 | PULLUP;
NET "PORTA<2>" LOC = "N6" | IOSTANDARD = LVCMOS33 | PULLUP;
NET "PORTA<3>" LOC = "P7" | IOSTANDARD = LVCMOS33 | PULLUP;
NET "PORTA<4>" LOC = "P12" | IOSTANDARD = LVCMOS33 | PULLUP;
NET "PORTA<5>" LOC = "N12" | IOSTANDARD = LVCMOS33 | PULLUP;
NET "PORTA<6>" LOC = "L14" | IOSTANDARD = LVCMOS33 | PULLUP;
NET "PORTA<7>" LOC = "L13" | IOSTANDARD = LVCMOS33 | PULLUP;

#B
NET "PORTB<0>" LOC = "K14" | IOSTANDARD = LVCMOS33 | PULLUP;
NET "PORTB<1>" LOC = "K13" | IOSTANDARD = LVCMOS33 | PULLUP;
NET "PORTB<2>" LOC = "J14" | IOSTANDARD = LVCMOS33 | PULLUP;
NET "PORTB<3>" LOC = "J13" | IOSTANDARD = LVCMOS33 | PULLUP;
NET "PORTB<4>" LOC = "H14" | IOSTANDARD = LVCMOS33 | PULLUP;
NET "PORTB<5>" LOC = "H13" | IOSTANDARD = LVCMOS33 | PULLUP;
NET "PORTB<6>" LOC = "F14" | IOSTANDARD = LVCMOS33 | PULLUP;
NET "PORTB<7>" LOC = "F13" | IOSTANDARD = LVCMOS33 | PULLUP;

#C
NET "PORTC<0>" LOC = "G14" | IOSTANDARD = LVCMOS33 | PULLUP;
NET "PORTC<1>" LOC = "G13" | IOSTANDARD = LVCMOS33 | PULLUP;
NET "PORTC<2>" LOC = "E14" | IOSTANDARD = LVCMOS33 | PULLUP;
NET "PORTC<3>" LOC = "E13" | IOSTANDARD = LVCMOS33 | PULLUP;
NET "PORTC<4>" LOC = "D14" | IOSTANDARD = LVCMOS33 | PULLUP;
NET "PORTC<5>" LOC = "D13" | IOSTANDARD = LVCMOS33 | PULLUP;
NET "PORTC<6>" LOC = "C13" | IOSTANDARD = LVCMOS33 | PULLUP;

#D
NET "PORTD<0>" LOC = "A3" | IOSTANDARD = LVCMOS33 | PULLUP;
NET "PORTD<1>" LOC = "B3" | IOSTANDARD = LVCMOS33 | PULLUP;
NET "PORTD<2>" LOC = "A2" | IOSTANDARD = LVCMOS33 | PULLUP;
NET "PORTD<3>" LOC = "B1" | IOSTANDARD = LVCMOS33 | PULLUP;
NET "PORTD<4>" LOC = "C1" | IOSTANDARD = LVCMOS33 | PULLUP;
NET "PORTD<5>" LOC = "D1" | IOSTANDARD = LVCMOS33 | PULLUP;
NET "PORTD<6>" LOC = "D2" | IOSTANDARD = LVCMOS33 | PULLUP;
NET "PORTD<7>" LOC = "E1" | IOSTANDARD = LVCMOS33 | PULLUP;

#E
NET "PORTE<0>" LOC = "E2" | IOSTANDARD = LVCMOS33 | PULLUP;
NET "PORTE<1>" LOC = "F1" | IOSTANDARD = LVCMOS33 | PULLUP;
NET "PORTE<2>" LOC = "F2" | IOSTANDARD = LVCMOS33 | PULLUP;
NET "PORTE<3>" LOC = "H1" | IOSTANDARD = LVCMOS33 | PULLUP;
NET "PORTE<4>" LOC = "H2" | IOSTANDARD = LVCMOS33 | PULLUP;
NET "PORTE<5>" LOC = "G1" | IOSTANDARD = LVCMOS33 | PULLUP;
NET "PORTE<6>" LOC = "G2" | IOSTANDARD = LVCMOS33 | PULLUP;
NET "PORTE<7>" LOC = "J1" | IOSTANDARD = LVCMOS33 | PULLUP;

#F
NET "PORTF<0>" LOC = "J2" | IOSTANDARD = LVCMOS33 | PULLUP;
NET "PORTF<1>" LOC = "K1" | IOSTANDARD = LVCMOS33 | PULLUP;
NET "PORTF<2>" LOC = "K2" | IOSTANDARD = LVCMOS33 | PULLUP;
NET "PORTF<3>" LOC = "L1" | IOSTANDARD = LVCMOS33 | PULLUP;
NET "PORTF<4>" LOC = "L2" | IOSTANDARD = LVCMOS33 | PULLUP;
NET "PORTF<5>" LOC = "M1" | IOSTANDARD = LVCMOS33 | PULLUP;
NET "PORTF<6>" LOC = "M2" | IOSTANDARD = LVCMOS33 | PULLUP;

Оставить комментарий

Архив записей в блогах:
Николь Краусс, «Хроники любви» Слушала аудиокнигой, вернее, начала и бросила посередине – не пошло, несмотря на все хвалебные отзывы. Какое-то невнятное нагромождение странных сюжетных линий, скучное до ужаса. Чуть не заснула за рулем. Михаил Булгаков, «Собачье сердце» ...
Где можно увидеть парижских интеллектуалов? Конечно, на "Поэтическом рынке" (Marche de poesie) в сердце квартала Сен-Жермен-де-Пре ... 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. ...А вот нашего понятия "интеллигент" во Франции нет. Есть "интеллектуал" ...
Сразу же хочу обратить Ваше внимание на следующее. Если этот фильм рассматривать, основываясь на реальные события , как у нас многие любят, его можно разорвать в пух и прах. Было бы правильно написать: "Основываясь на реальНЫХ событИЯХ"! Сходу возникает вопрос: а как иначе снять ...
Сегодня удачно заблудилась во Всемирном Торговом Центре и наткнулась на дизайнэрский магазин. Полезла было в кошелек, но не тут-то было. Высоко ценят русские брендовые футболки, пошитые в Китае. 6000р 7500р       ...
Зашла сегодня в чебуречную на Сухаревской. Была сытая, поэтому просто так зашла, на минутку, за атмосферой моего детства. Там до сих пор можно только стоять. Стульев нет. Сейчас, понятно, это такой аттракцион - назад в СССР. Но вот тогда - кому вообще в голову пришла идея в чебуречных и ...