逻辑和verilog
Logical and in verilog
我正在尝试进行数据移位,然后 "logical and" 使用 255,即 11111111。但我在最后一位得到 1。其他位没有改变。数据转移是正确的,但我在 "and" 运算符中遇到问题。
这是代码:
module Data_shiftin(
input reset_n, clk,
input [31:0] data_in,
output [31:0] data_out
);
reg [31:0] data_R24;
reg [31:0] data_R16;
reg [31:0] data_R8;
reg [31:0] data_R;
reg [31:0] and_R16;
reg [31:0] and_R8;
reg [31:0] and_R;
integer a=255;
always @ (posedge clk)
begin
data_R24[7:0]<=data_in[31:24];
end
always @ (posedge clk)
begin
data_R16[15:0]<=data_in[31:16];
and_R16[15:0]<= a[7:0] && data_R16[15:0];
end
always @ (posedge clk)
begin
data_R8[23:0]<=data_in[31:8];
and_R8[23:0]<= a[7:0] && data_R8[23:0];
end
always @ (posedge clk)
begin
data_R[31:0]<=data_in[31:0];
and_R[31:0]<= a[7:0] && data_R[31:0];
end
endmodule
&&
是逻辑与。 &
是按位的。
您确定要逻辑与吗?您将结果存储在 16、24 和 32 位寄存器中,但逻辑上只有 1 位输出。它是 1 位,因为它通常用在必须为真或假的 if 表达式中,多位值没有任何意义。
典型用法:
reg [1:0] a, b;
wire check;
check = (a==2'b01) && (b==2'b10) ; //1 bit output
always @* begin
if ( (a==2'b01) && (b==2'b10) ) begin
//..
//Bitwise
wire [1:0] e;
e = a & b ; //=>2'b00
&&
的结果为1位,布尔表达式的结果为真或假。
&
不会改变宽度,它只是依次对每个位进行加减;
wire [1:0] e;
assign e = a & b ; //=>2'b00
也可以这样做:
e[0] = a[0] && b[0];
e[1] = a[1] && b[1];
我正在尝试进行数据移位,然后 "logical and" 使用 255,即 11111111。但我在最后一位得到 1。其他位没有改变。数据转移是正确的,但我在 "and" 运算符中遇到问题。 这是代码:
module Data_shiftin(
input reset_n, clk,
input [31:0] data_in,
output [31:0] data_out
);
reg [31:0] data_R24;
reg [31:0] data_R16;
reg [31:0] data_R8;
reg [31:0] data_R;
reg [31:0] and_R16;
reg [31:0] and_R8;
reg [31:0] and_R;
integer a=255;
always @ (posedge clk)
begin
data_R24[7:0]<=data_in[31:24];
end
always @ (posedge clk)
begin
data_R16[15:0]<=data_in[31:16];
and_R16[15:0]<= a[7:0] && data_R16[15:0];
end
always @ (posedge clk)
begin
data_R8[23:0]<=data_in[31:8];
and_R8[23:0]<= a[7:0] && data_R8[23:0];
end
always @ (posedge clk)
begin
data_R[31:0]<=data_in[31:0];
and_R[31:0]<= a[7:0] && data_R[31:0];
end
endmodule
&&
是逻辑与。 &
是按位的。
您确定要逻辑与吗?您将结果存储在 16、24 和 32 位寄存器中,但逻辑上只有 1 位输出。它是 1 位,因为它通常用在必须为真或假的 if 表达式中,多位值没有任何意义。
典型用法:
reg [1:0] a, b;
wire check;
check = (a==2'b01) && (b==2'b10) ; //1 bit output
always @* begin
if ( (a==2'b01) && (b==2'b10) ) begin
//..
//Bitwise
wire [1:0] e;
e = a & b ; //=>2'b00
&&
的结果为1位,布尔表达式的结果为真或假。
&
不会改变宽度,它只是依次对每个位进行加减;
wire [1:0] e;
assign e = a & b ; //=>2'b00
也可以这样做:
e[0] = a[0] && b[0];
e[1] = a[1] && b[1];