Цитата
в блоке always плис мониторит флаг впамяти, назовём его requestReady
Эта фраза выдает что вы немного не понимаете как оно все устроено. Блок алвайс в плис это не совсем while в С.
В целом кроме памяти в ПЛИС есть еще и регистры, которые для проца выглядят как память, а для плис как удобные сигналы, но это детали.
Попробуем поработать с решением в вашей постановке.
Вам нужен конечный автомат FSM по буржуйски. У него должны быть состояния
IDLE - в этом состоянии ПЛИС читает ячейку памяти с флагом и если видит флаг переходит в READ
READ - в этом состоянии плис перебирает адреса памяти, чтобы на шине появлялись данные, которые забирает блок обработки. Прочитав нужное количество переходит в PROCESS
PROCESS - в этом состоянии плис ждет когда блок обработки закончит обработку и сформирует ответ. Дождавшись переходит в WRITE
WRITE - в этом состоянии плис перебирает адреса для записи памяти, а блок обработки отдает данные, они попадаю в память. Записав нужное количество плис переходит в DONE
DONE - в этом состоянии плис ставит флаг готовности данных, записывает его в нужную ячейку памяти и переходит в IDLE
Конечный автомат описывается так.
Код
localparam IDLE = 0;
localparam READ = 1;
....
always @(posedge clk)
begin
if(reset) State <= IDLE;
else State <= NextState;
end
always @(*)
begin
if((State == IDLE) && (requestReady == 1'b1)) NextState = READ;
if((State == READ) && (RCounter == 0)) NextState = PROCESS;
if((State == PROCESS) && (ProcessDone == 1'b1)) NextState = WRITE;
if((State == WRITE) && (WCounter == 0)) NextState = DONE;
if(State == DONE) NextState = IDLE;
end
выше приведенный код ходит по состояниям, переводя автомат из одного в другое. Теперь вам надо описать действия внутри этих состояний, например
Код
always @(posedge clk)
begin
if(State == IDLE)
begin
MemAddr <= FlagAddr;
if(MemAddr == FlagAddr)
requestReady <= MemData[0];
RCounter <= 10;
WCoutner <= 10;
end
end
always @(posedge clk)
begin
if(State == READ)
begin
MemAddr <= MemAddr + 1'b1;
RCounter <= RCounter - 1'b1;
end
end
и так далее...
Обратите внимание что часто нужны какие-то однобитные сигналы, желательно появляющиеся сразу, без необходимости что-то делать, выставлять адрес и так далее... Поэтому обычно это решают не через память, а через регистры. Делают блок который висит на вашей шине и когда видит обращение по определенному адресу сохраняет данные с шины в регистры, которые доступны другим блокам как сигналы или команды. В ПЛИС все происходит параллельно и у нее есть альтернативные варианты хранения нежели память, нет абсолютно никакой необходимости вести управляющий обмен через блоки памяти.
И я бы начал с простенького автомата без линукса, ядра и прочей фигни. Попробуйте почитать данные из одной памяти и положить в другую, например. Или посчитать их средние и записать обратно. Поймите как работают автоматы.