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