Здравствуйте, 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, и оно даже само умеет скроллиться