我正在尝试使用 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进行逻辑运算,然后产生移位输出。我认为你很接近,但有几件事应该更正:
该函数只有一个初始块,因此在模拟器启动时它会获得一次 运行,并且再也不会 运行。您没有提到任务是创建一个连续生成输出 F 的函数(即一堆没有寄存器的门)还是一个在时钟边沿评估 "A/B/k/right" 然后生成输出的函数。如果你正在创建一个组合函数,当你需要用类似 "always @*" 的东西替换 "initial" 时,每次输入值改变时都会重新 运行 函数,你也会需要将 reg 更改为电线。如果您正在创建注册块,则需要添加一个时钟。您可能 look at this code 是时钟移位寄存器的一个很好的例子。
初始块中有一个赋值语句。 Assign 语句表示在 Verilog 中始终为真的表达式,因此它们在过程块之外。 assign 语句将一个值赋给寄存器 - assign 语句应与连线配对。
程序代码使用F1寄存器作为输入输出,但F1已经赋值。我建议将其分为两个步骤,主要是计算 (A&~B)+(~A&B) 并将其分配给 F1。然后编写一个程序块来执行 F1 到输出的移位,它可以是电线或寄存器,具体取决于 #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<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进行逻辑运算,然后产生移位输出。我认为你很接近,但有几件事应该更正:
该函数只有一个初始块,因此在模拟器启动时它会获得一次 运行,并且再也不会 运行。您没有提到任务是创建一个连续生成输出 F 的函数(即一堆没有寄存器的门)还是一个在时钟边沿评估 "A/B/k/right" 然后生成输出的函数。如果你正在创建一个组合函数,当你需要用类似 "always @*" 的东西替换 "initial" 时,每次输入值改变时都会重新 运行 函数,你也会需要将 reg 更改为电线。如果您正在创建注册块,则需要添加一个时钟。您可能 look at this code 是时钟移位寄存器的一个很好的例子。
初始块中有一个赋值语句。 Assign 语句表示在 Verilog 中始终为真的表达式,因此它们在过程块之外。 assign 语句将一个值赋给寄存器 - assign 语句应与连线配对。
程序代码使用F1寄存器作为输入输出,但F1已经赋值。我建议将其分为两个步骤,主要是计算 (A&~B)+(~A&B) 并将其分配给 F1。然后编写一个程序块来执行 F1 到输出的移位,它可以是电线或寄存器,具体取决于 #1
的答案
希望对您有所帮助。