Компиляция императивщины в FPGA.

Feb 22, 2013 16:18

Это очень просто, если смотреть сверху.

Все состояния программы можно перенумеровать. Цикл "for (;;) { i = a; b = i+10;}" будет иметь два состояния, в первом мы читаем, во втором вычисляем и кладём.

Все переменные надо объявить регистрами.

И, в общем и целом, код выше будет напоминать что-то вроде вот этого:
module qq(input clk, input reset_n);
reg [31:0] state_index;
reg [31:0] i;
reg [31:0] a;
reg [31:0] b;

always @(posedge clk or negedge reset_n)
if (!reset_n) begin
state_index <= 0;
end else if (clk) begin
if (state_index == 0) begin
// Действие.
i <= a;
// Переход.
state_index <= 1;
end
if (state_index == 1) begin
// Действие.
b <= i+10;
// Переход.
state_index <= 0;
end
end

endmoduleВ общем, тупо. ;)

Условные переходы делаются... с помощью условий! Циклы - через условные и безусловные переходы.

Дальше начинается интересное - например, если два действия не используют одни и те же ресурсы, то их можно совместить, избавившись от состояния - ускоряем за счёт параллелизма железа. Локальные массивы можно поместить в блоки памяти - мы делаем их разными ресурсами и снова увеличиваем параллелизм. И тд, и тп.

компиляция, fpga

Previous post Next post
Up