逻辑和verilog

时间:2015-01-28 15:10:20

标签: verilog logical-operators

我正在尝试进行数据移位,然后使用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

1 个答案:

答案 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];