2010-08-19 3 views
4

Я очень новичок в языке HDL. У меня вопрос о том, как программировать сдвиговый регистр. (я знаю, что я перехожу в другое направление). Почему книга использует wire[N-1:0] r_next? что является недостатком моей реализации? благодаряРегистры сдвига Verilog

моя первая попытка выглядит следующим образом

module lesson04#(parameter N=8)(
    input wire clk, reset, 
    input wire data, 
    output wire out 
); 

reg [N-1: 0] r_reg; 


always @(posedge clk or negedge reset) 
begin 
    if(!reset) 
     r_reg =0; 
    else 
     r_reg[0]=data; 
     r_reg = r_reg<<1; 
end 

assign out =r_reg[N-1]; 
endmodule 

но книга дает:

module lesson04#(parameter N=8)(
    input wire clk, reset, 
    input wire data, 
    output wire out 
); 

reg [N-1: 0] r_reg; 
wire[N-1:0] r_next; 

always @(posedge clk or negedge reset) 
begin 
    if(!reset) 
     r_reg =0; 
    else 
     r_reg <= r_next; 
end 

assign r_next= {data, r_reg[N-1:1]}; 
assign out =r_reg[N-1]; 
endmodule 

ответ

6

Прежде всего, не забывайте свои begin - end сек вокруг участков кода:

else begin 
    r_reg[0]=data; 
    r_reg = r_reg<<1; 
end 

Без этого, onl y r_reg[0]=data будет в предложении else инструкции if. Это будет работать, но считается плохим, потому что из-за операторов блокировки в последовательном логическом описании ...

Во-вторых, для моделирования последовательных блоков используйте неблокирующие назначения (<=), или ваши вычисления могут «провалиться» (неблокирование Google против блокировки для получения дополнительной информации). Ваш пример может очень хорошо работать (вы пробовали его в симуляторе?), Но если ситуация усложняется и добавляется больше переменных, все может сломаться.

always @(posedge clk or negedge reset) 
begin 
    if(!reset) 
     r_reg <= 0; 
    else begin // This is horrible! Don't write code like this! 
     r_reg[0] = data;  // blocking 
     r_reg <= r_reg<<1; // non-blocking 
    end 
end 

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

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

Кроме того, если ваш сброс активен низким (т.е. LOW сбрасывается), его следует назвать таким, например resetb или reset_n.

3

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

Кстати, у вас есть отступ в вашем блоке always, я убежден, что это не то, что вы хотели. Это как ваш блок действительно ведет себя:

always @(posedge clk or negedge reset) 
begin 
    if(!reset) begin 
     r_reg =0; 
    end else begin 
     r_reg[0]=data; 
    end 
    r_reg = r_reg<<1; 
end 

Я всегда явно использовать begin/end ключевые слова в if/else заявлениях, чтобы избежать этой путаницы.

То, как он имитирует, r_reg всегда 0, потому что вы сбиваете первое задание (r_reg[0]=data;) со вторым (r_reg = r_reg<<1;). Другое отличие состоит в том, что книга присваивает data MSB сдвигового регистра, но вы назначаете его LSB.

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

+0

'begin/end' в' if/else 'скоро станет рефлексом! – Marty

+0

Согласен. На самом деле, я даже создал макрос в своем редакторе для этого. – toolic

+0

Ответ на книгу «не так», не так ли? Почему есть 8 флопов, если вы хотите отложить только за один такт? ... Если это не опечатка в стенограмме (в конце концов, есть доказательства copypasta). – Marty

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