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