сдвиговый регистр с использованием dff verilog - PullRequest
0 голосов
/ 14 декабря 2018

Я хочу создать сдвиговый регистр, используя d-триггер в качестве основного структурного элемента.код:

dff:

  module dff(d,q,clk,rst);

  input d,clk,rst;
  output reg q;

  always @(posedge clk)
     begin:dff_block
        if(rst==1'b1)
          q=1'b0;
        else
          q=d;
     end
  endmodule

регистр сдвига:

  module shift_register(s1,d,clk,s0,q);
  parameter n=3;

  input  s1,clk;
  input [n:0] d;

  output s0;
  output [n:0] q;

  genvar i;

  assign d[3]=s1;


  generate
  for(i=0; i<=n; i=i+1)
     dff U1(.d(d[i]),.q(q[i]),.clk(clk));
  endgenerate

  assign q[3]=d[2];
  assign q[2]=d[1];
  assign q[1]=d[0];
  assign q[0]=s0;



  endmodule

испытательный стенд:

  module tb();

  parameter n=3;
  reg [n:0] d;
  reg s1,clk;

  wire [n:0] q;
  wire s0;


  shift_register UUT(.s1(s1),.d(d),.clk(clk),.q(q),.s0(s0));

  initial begin

  d=4'b0000;
  clk=0;
  end


always
begin:clok
#10 clk=~clk; s1=1;

end
endmodule

Я думаю, что на испытательном стенде возникла проблема.Я пытался дать значения s1 для каждого # 10, пока clk = 1, но опять-таки не работает.

Этот код не дает мне сигналов для q и s0. Я не могу найти, что не так. Есть идеи?

1 Ответ

0 голосов
/ 15 декабря 2018

у вас есть несколько проблем с кодом.

  1. q - это выходной регистр dff;q[i] передается как q в dff.q[i] также присваивается в операторе assign.Итак, вы умножили значение wire q[i], которое, скорее всего, будет разрешено до x и никогда не изменится.У вас где-то поменялся ввод / вывод.

  2. вы ничего не назначаете на s0, поэтому он не изменяется и не генерирует сигнал.

  3. в данном конкретном случаеБлокирующие назначения на флопе не будут играть никакой роли, но в целом они могут привести к непредсказуемым результатам симуляции.Используйте неблокирование.

  4. в цикле generate нет особого смысла.Вы можете передавать полные векторы и даже полные векторы.

  5. Похоже, вы запутались в направлении оператора assign.Это подразумевает направление.assign q[0] = s0; означает присвоить значение s0 проводу q[0], а не наоборот.

...