我正在尝试使用 verilog 制作一个 right/left 移位器,但我的输出是 xxxxx

Im trying to make a right/left shifter using verilog but my output is xxxxx

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

您的代码在问题中有点混乱 - 这是原始问题,其中 Enter Code Here 行替换为新行:

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    

我猜objective是对输入A和B进行逻辑运算,然后产生移位输出。我认为你很接近,但有几件事应该更正:

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

  2. 初始块中有一个赋值语句。 Assign 语句表示在 Verilog 中始终为真的表达式,因此它们在过程块之外。 assign 语句将一个值赋给寄存器 - assign 语句应与连线配对。

  3. 程序代码使用F1寄存器作为输入输出,但F1已经赋值。我建议将其分为两个步骤,主要是计算 (A&~B)+(~A&B) 并将其分配给 F1。然后编写一个程序块来执行 F1 到输出的移位,它可以是电线或寄存器,具体取决于 #1

  4. 的答案

希望对您有所帮助。