2013-12-17 3 views
4

Я заканчиваю проект, и требование - двухстороннее связывание между функциональными блоками внутри нашего процессора. Я знаю, что это такое, но есть ли «стандартный» или хороший простой пример?Verilog two-way handshaking пример

Единственное, что я могу думать о двух устройствах, когда между ними есть линия передачи данных, и когда X отправляет Y, подается отдельный «отправленный» сигнал. Когда Y принимает «принятый» сигнал, отправляется X на другой провод. После того, как X считывает этот принятый сигнал, он прекращает отправку данных по линии данных и устанавливает отправленный провод на 0 или Z. Затем Y также устанавливает принятый сигнал на 0 или Z.

Все это синхронно (на тех же часах).

Действительно ли это подходит для этого? Я полагаю, что он может стать очень грязным в больших масштабах, но я работаю только над простым процессором на базе аккумулятора.

ответ

5

Наиболее распространенное простое рукопожатие для одного домена часов должно быть действительным/готовым рукопожатием.

Если «X» отправляется на «Y», то X имеет выходы data и valid, а Y имеет выход ready.

Когда у X есть данные для отправки, он утверждает, что действует, и смотрит на готовый. Если действительные и готовые на высоких часах в позе, то X рассмотрит данные, которые будут отправлены, и Y рассмотрит данные, которые будут получены.

Преимущество этой схемы в том, что вы можете отправить одну информацию за такт без какого-либо простоя. Если значение valid остается высоким, следующий цикл после того, как действительный/готовый был высоким, тогда это считается вторым пакетом.

Также нет требования, чтобы Y ожидал увидеть действительный, прежде чем он будет готов к завершению, Y может утверждать, что он готов в любое время, когда он доступен для получения данных.

Схема вы описать то, что я бы назвал «REQ/ACK 4-фазную рукопожатия», в том, что она занимает четыре такта, чтобы отправить один данные

1. req=1 ack=0 
2. req=1 ack=1 
3. req=0 ack=1 
4. req=0 ack=0 

Этот вид интерфейса будет лучше, если делая асинхронный запрос по границе тактового сигнала, поскольку он исключает возможность интерпретации пакета дважды. Но вам это не нужно для полностью синхронного интерфейса.

-1

Я думаю, вы ищете дизайн арбитров. Существует множество различных арбитражных схем. Самая простая - это круговая схема. Если кто-либо хочет получить доступ к ресурсу (например, CPU или память и т. Д.), Тогда этот модуль будет утверждать строку запроса. Он ждет, пока арбитр не утвердит линию гранта, после чего ему будет разрешено продолжить обработку, зная, что он имеет выделенный доступ к интерфейсу, который контролируется арбитром.

+0

Я не уверен, что это сработает. У меня есть контроллер, который на основе T-состояния посылает сигналы, когда единицы считываются с шины данных, записываются на шину данных и т. Д. Функциональные единицы сами не знают, откуда взялись или собираются данные. Если я не понял ваш ответ. – zKarp

+0

Я не уверен, что вы ищете. Можете ли вы изменить свой вопрос, чтобы сделать его более понятным? Когда вы говорите, что Z - это Z другой компонент или это высокоимпеданс? – Russell

0

Я часто использую схемы, аналогичные предложению Тима о том, что FSM запускают/приостанавливают друг друга. Сигнал go (req) может инициировать обработку в нижнем или вторичном модуле, который подтверждает, когда он будет завершен.

reg go; 
reg complete; 

//abstracted FSM1 
always @(posedge clk) begin 
    case(fsm1_state) 
    START_SUB : begin 
     go    <= 1'b1; 
     fsm1_next_state <= WAIT_SUB; 
    end 
    WAIT_SUB: begin 
     if (complete == 1'b1) begin 
     go    <= 1'b0; 
     fsm1_next_state <= COMPLETED_SUB; 
     end 
     else begin 
     go    <= 1'b1;   //Might not be required to hold high in Synch design 
     fsm1_next_state <= WAIT_SUB;  // Holds state 
     end 
    end 
    default: begin 
     go    <= 1'b0; 
     fsm1_next_state <= fsm1_state; 
    end 
    endcase 
end 

//fsm2 
always @(posedge clk) begin 
    case(fsm2_state) 
    WAITING : begin 
     complete  <= 1'b0; 
     if (go ==1'b1) begin 
     fsm2_next_state <= DOSOMETHING; 
     end 
     else begin 
     fsm2_next_state <= WAITING; 
     end 
    end 
    DOSOMETHING : begin 
     complete  <= 1'b1; 
     fsm2_next_state <= WAITING; 
     // if an async system wait until go is deasserted 
     // rather than pulse complete for 1 cycle 
    end 
    endcase 
end 

Государственные машины всегда должны быть инициализированы или сброшены и использовать случай по умолчанию для удаления непреднамеренных состояний блокировки.

Смежные вопросы