Информация об изменениях

Сообщение Re[11]: Свой процессор на ПЛИС от 01.03.2016 2:17

Изменено 01.03.2016 2:18 koandrew

Здравствуйте, 0x7be, Вы писали:

0>Возможность развивать дизайн эволюционно — это функция мягкости материала. Раньше и программы начинали делать со структурной схемы, потому что рефакторить было слишком накладно. Как появились адекватные инструменты, эволюционный дизайн вошёл в моду. С появлением ПЛИСов в железе тоже стала появляться такая возможность.


Поигравшись немного на выходных, беру свои слова обратно. Конечные автоматы рулят! Я пытался сделать UART-передатчик (чтобы FPGA по нажатию кнопки отправила "Hello, world!!" в COM-порт ) и полдня провозился с сигналами, запутав сам себя кучкой сигналов в стиле skip_next_clock_cycle. После чего на следующее утро снёс нафиг всё это богатство, и заменил на конечный автомат — в итоге код передатчика заработал с первой попытки и безо всяких проблем! А сейчас буквально за полчаса наваял код приёмника (он принимает байты из COM-порта, и отображает их двоичный код на LED) — и опять же всё завелось со второй попытки (всё работало и на первой попытки, но я просто перепутал порядок бит LSB <-> MSB, и потому двоичный код символов был "вверх ногами")! Конечно, он не обрабатывает ошибочные ситуации, но мне всё же кажется, что код очень неплохой Саму схему верхнего уровня я всё равно сделал визуально, но все девайсы — на верилоге. Если интересно — вот код приёмника
  UART-receiver
module UART_RX(input clock, input rx_pin, output reg data_ready, output reg [7:0] data);
localparam IDLE = 2'b00, RX_IN_PROGRESS = 2'b01, RX_COMPLETED = 2'b10;
reg [1:0] state = IDLE;
integer bit_idx = 0;
reg [7:0] buff = 8'h00;
initial begin
    data_ready <= 0;
    data <= 8'h00;
end
always @(posedge clock)
begin
    case (state)
        IDLE:
        begin
            if (rx_pin == 0)
            begin
                //tx is beginning, start bit is 0, while "bus idle" is 1
                bit_idx <= 0;
                buff <= 8'h00;
                state <= RX_IN_PROGRESS;
                data_ready <= 0;
            end
        end
        RX_IN_PROGRESS:
        begin
            buff[7 - bit_idx] <= rx_pin;
            if (bit_idx == 7)
            begin
                //this is last bit, next bit will be stop bit
                state <= RX_COMPLETED;
            end
            else
            begin
                bit_idx <= bit_idx + 1;
            end
        end
        RX_COMPLETED:
        begin
            //rx is complete, output result and raise data_ready flag
            data_ready <= 1;
            data <= buff;
            state <= IDLE;
        end
    endcase
end
endmodule

А вот вся схема:
  Схема


Должен сказать, что на моей девплате хидеры расширения (как будто специально!) сделаны так, что если на пины 2-4-6-8-10-12 "надеть" преобразователь USB-UART, то "земля" хидера как раз окажется в нужном месте, а прочие пины подключатся к пинам, напрямую подключенным к FPGA (а именно GPIO_01 -> RX, GPIO_03 -> TX, остальные пины не используются). Таким образом я по сути бесплатно (в смысле паять ничего не надо) получил инструмент для дебага в стиле printf И в принципе заменил VGA-порт на окно putty, и оно даже само умеет скроллиться
Re[11]: Свой процессор на ПЛИС
Здравствуйте, 0x7be, Вы писали:

0>Возможность развивать дизайн эволюционно — это функция мягкости материала. Раньше и программы начинали делать со структурной схемы, потому что рефакторить было слишком накладно. Как появились адекватные инструменты, эволюционный дизайн вошёл в моду. С появлением ПЛИСов в железе тоже стала появляться такая возможность.


Поигравшись немного на выходных, беру свои слова обратно. Конечные автоматы рулят! Я пытался сделать UART-передатчик (чтобы FPGA по нажатию кнопки отправила "Hello, world!!" в COM-порт ) и полдня провозился с сигналами, запутав сам себя кучкой сигналов в стиле skip_next_clock_cycle. После чего на следующее утро снёс нафиг всё это богатство, и заменил на конечный автомат — в итоге код передатчика заработал с первой попытки и безо всяких проблем! А сейчас буквально за полчаса наваял код приёмника (он принимает байты из COM-порта, и отображает их двоичный код на LED) — и опять же всё завелось со второй попытки (всё работало и на первой попытке, но я просто перепутал порядок бит LSB <-> MSB, и потому двоичный код символов был "вверх ногами")! Конечно, он не обрабатывает ошибочные ситуации, но мне всё же кажется, что код очень неплохой Саму схему верхнего уровня я всё равно сделал визуально, но все девайсы — на верилоге. Если интересно — вот код приёмника
  UART-receiver
module UART_RX(input clock, input rx_pin, output reg data_ready, output reg [7:0] data);
localparam IDLE = 2'b00, RX_IN_PROGRESS = 2'b01, RX_COMPLETED = 2'b10;
reg [1:0] state = IDLE;
integer bit_idx = 0;
reg [7:0] buff = 8'h00;
initial begin
    data_ready <= 0;
    data <= 8'h00;
end
always @(posedge clock)
begin
    case (state)
        IDLE:
        begin
            if (rx_pin == 0)
            begin
                //tx is beginning, start bit is 0, while "bus idle" is 1
                bit_idx <= 0;
                buff <= 8'h00;
                state <= RX_IN_PROGRESS;
                data_ready <= 0;
            end
        end
        RX_IN_PROGRESS:
        begin
            buff[7 - bit_idx] <= rx_pin;
            if (bit_idx == 7)
            begin
                //this is last bit, next bit will be stop bit
                state <= RX_COMPLETED;
            end
            else
            begin
                bit_idx <= bit_idx + 1;
            end
        end
        RX_COMPLETED:
        begin
            //rx is complete, output result and raise data_ready flag
            data_ready <= 1;
            data <= buff;
            state <= IDLE;
        end
    endcase
end
endmodule

А вот вся схема:
  Схема


Должен сказать, что на моей девплате хидеры расширения (как будто специально!) сделаны так, что если на пины 2-4-6-8-10-12 "надеть" преобразователь USB-UART, то "земля" хидера как раз окажется в нужном месте, а прочие пины подключатся к пинам, напрямую подключенным к FPGA (а именно GPIO_01 -> RX, GPIO_03 -> TX, остальные пины не используются). Таким образом я по сути бесплатно (в смысле паять ничего не надо) получил инструмент для дебага в стиле printf И в принципе заменил VGA-порт на окно putty, и оно даже само умеет скроллиться