我试图使用verilog制作一个右/左移位器,但我的输出是xxxxx

时间:2015-06-27 19:31:03

标签: verilog modelsim

module MyProject(A,B,k,right,F);
  input [31:0]A;
  input [31:0]B;
  input [4:0]k;
  input right;
  output reg [31:0]F;
  reg [31:0]F1;
  integer i,j;
  initial
  begin
  assign F1=(A&~B)+(~A&B);
  for(j=0;j<k;j=j+1)
    begin
      if(right==1)
        begin
          for(i=0;i<32;i=i+1)
          begin
            F1[i]=F1[i+1];
            if(i==31)
            F1[i]=0;
          end
        end
      else if(right==0)
        begin
          for(i=31;i>-1;i=i-1)
          begin
            F1[i]=F1[i-1];
            if(i==0)
              F1[i]=0;
          end
        end
    end
    for(i=0;i<32;i=i+1)
      F[i]=F1[i];
    //F=F1;
  end

endmodule

1 个答案:

答案 0 :(得分:1)

你的代码在这个问题上有点混乱 - 这是原始问题,输入代码这里的行被新行替换:

module MyProject(A,B,k,right,F);
input [31:0]A;    
input [31:0]B;    
input [4:0]k;    
input right;    
output reg [31:0]F;    
reg [31:0]F1;    
integer i,j;    
initial    
   begin    
   assign F1=(A&~B)+(~A&B);    
   for(j=0;j    
   begin    
   if(right==1)    
     begin    
        for(i=0;i<32;i=i+1)    
           begin    
              F1[i]=F1[i+1];      
              if(i==31)    
              F1[i]=0;    
          end    
    end    
     else if(right==0)    
        begin    
         for(i=31;i>-1;i=i-1)    
           begin    
              F1[i]=F1[i-1];    
             if(i==0)    
                F1[i]=0;    
           end    
      end    
   end    
  for(i=0;i<32;i=i+1)    
     F[i]=F1[i];    
  //F=F1;    
 end    
endmodule    

我猜测目标是对输入A和B执行逻辑运算,然后生成移位输出。我认为你很接近,但有一些事情需要纠正:

  1. 该函数只有一个初始块,因此它在模拟器启动时运行一次,并且它永远不会再运行。你没有提到赋值是创建一个连续生成输出F的函数(即一堆没有寄存器的门)还是一个在时钟边缘上计算“A / B / k / right”的函数,然后生成输出。如果要创建组合函数,当需要将“initial”替换为“always @ *”时,每次输入值更改时都会重新运行该函数,并且还需要将reg更改为电线。如果要创建已注册的块,则需要添加时钟。您可以look at this code获得一个时钟移位寄存器的好例子。

  2. 初始块内有一个assign语句。 Assign语句表示在Verilog中始终为true的表达式,因此它们不在程序块之外。 assign语句为寄存器赋值 - assign语句应与wire配对。

  3. 程序代码使用F1寄存器作为输入和输出,但F1已经分配了一个值。我建议将其分解为两个步骤,主要是计算(A&amp; ~B)+(~A&amp; B)并将其分配给F1。然后编写一个程序块来执行F1到输出的转换,这可能是一个电线或寄存器,取决于对#1的回答

  4. 希望有所帮助。