Verilog 设计32位算术逻辑单元(ALU)
我为一个ALU写了这个编码器。该ALU通过Verilog 设计32位算术逻辑单元(ALU),verilog,alu,Verilog,Alu,我为一个ALU写了这个编码器。该ALU通过ctrl信号进行控制,并执行一些操作,如加法、减法和,或。。。当输出为零时,oZero信号应激活 我在标记的行中有一些错误。我犯了什么错 module ALU_32 (iA, iB ,iCin ,ctrl, oCarry,oZero, out); input [31:0] iA,iB; output [31:0] out; input iCin,ctrl; output oCarry,oZero; reg [31:0] out; reg oCar
ctrl
信号进行控制,并执行一些操作,如加法、减法和,或。。。当输出为零时,oZero
信号应激活
我在标记的行中有一些错误。我犯了什么错
module ALU_32 (iA, iB ,iCin ,ctrl, oCarry,oZero, out);
input [31:0] iA,iB;
output [31:0] out;
input iCin,ctrl;
output oCarry,oZero;
reg [31:0] out;
reg oCarry;
reg oZero;
always@ (ctrl)
begin
case(ctrl)
4'b0: out<=iA&iB;
4'b0001: out<=iA|iB;
4'b0010: {oCarry ,out}<=iA+iB;
4'b0011: out<=iA~|iB; //error
4'b0100:
begin
if(iA==iB)
out<=32'b1;
end
4'b0101: out<=iA-iB; //error
4'b0110: //error
begin
if(iA<iB)
out<=32'b1;
else
out<=32'b0;
end
4'b0111: out<=iA*iB; //error
4'b1000: out<=iA/iB; //error
end
always@(out)
begin
if(out==0)
oZero<=1;
end
endmodule
模块ALU_32(iA、iB、iCin、ctrl、OCARY、oZero、out);
输入[31:0]iA,iB;
输出[31:0]输出;
输入iCin,ctrl;
奥泽罗;
注册[31:0]出;
登记册;
雷格·奥泽罗;
始终@(ctrl)
开始
案例(ctrl)
4'b0011:out中使用的4'b0:out~
运算符正如邱所指出的,iA~| iB
应该是~(iA | iB)
,并且缺少一个尾框。除此之外:
ctrl
需要4位宽。IEinput[3:0]ctrl
组合块需要声明灵敏度列表中的所有元素或使用自动灵敏度。使用always@(ctrl)
时,模拟器将不使用see changes iniA
或iB
。而是使用始终@*
进行自动灵敏度。对于组合逻辑,应始终使用自动灵敏度,除非您仅限于1995年版本的IEEE Std 1364(很可能您没有),在这种情况下,您需要始终@(ctrl或iA或iB或iCin)
。2001年,标准中增加了自动灵敏度(@*
或@(*)
)
编译时不应使用非阻塞赋值(@toolic:)和语法错误。这些是消息:语法错误。意外标记:4'b0110[\u BINARY\u BASE]。预期标记:'.'、'''.'、'('、'.'、''.'''.'.'
和语法错误。意外标记:~[O\u RNOR]。预期标记:'['、'.'(*'、'('、'.+'、'.'-'.
out <= ~(iA | iB);
always @* begin
case(ctrl)
4'b0000 :
begin
out = iA&iB;
oCarry = 1'b0;
end
// conditions assigning both 'out' and 'oCarry'
default:
begin
out = 32'0;
oCarry = 1'b0;
end
endcase
end
always @* begin
// default value
out = 32'd0;
oCarry = 1'b0;
// calculate value, override default
case(ctrl)
4'b0000 : out = iA&iB;
// ...
4'b0010: {oCarry ,out} = iA+iB;
// ...
4'b1000: out = iA/iB;
endcase
end
module ALU_32 (
input [31:0] iA, iB,
input iCin,
input [3:0] ctrl,
output reg oCarry, oZero,
output reg [31:0] out );