我正在尝试进行数据移位,然后使用255(即11111111)进行“逻辑和”操作。但是我在最后一位得到1。其他位没有变化。数据移位是正确的,但我在“和”运算符中遇到问题。 这是代码:
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
答案 0 :(得分:2)
&&
是合乎逻辑的AND。 &
是按位的。
你确定要一个合乎逻辑的AND吗?将结果存储在16,24和32位寄存器中,但逻辑上只有1位输出。它是1位,因为它通常用在if表达式中,它必须是true或false,多位值不会有任何意义。
典型用法:
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位,布尔表达式的结果为true或false。
&
不会改变宽度,它只是轮流和每一位;
wire [1:0] e;
assign e = a & b ; //=>2'b00
也可以这样做:
e[0] = a[0] && b[0];
e[1] = a[1] && b[1];