两者都有相同的含义吗?

时间:2015-11-06 08:03:56

标签: module verilog fpga

在Verilog代码中

case ({Q[0], Q_1})
  2'b0_1 :begin 
    A<=sum[7];        Q<=sum;        Q_1<=Q;
  end
  2'b1_0 : begin 
    A<=difference[7]; Q<=difference; Q_1<=Q;
  end
  default: begin 
    A<=A[7];          Q<=A;          Q_1<=Q;
  end
endcase

以上代码与下面的代码相同

case ({Q[0], Q_1})
  2'b0_1 : {A, Q, Q_1} <= {sum[7], sum, Q};
  2'b1_0 : {A, Q, Q_1} <= {difference[7], difference, Q};
  default: {A, Q, Q_1} <= {A[7], A, Q};
endcase

如果是,那么为什么我会得到不同的结果呢?

编辑:-A,Q,sum和差异均为8位值,Q_1为1位值。

2 个答案:

答案 0 :(得分:2)

不,这些不一样。连接运算符({ ... })允许您从几个不同的信号创建向量,允许您使用这些向量并分配给这些向量,从而导致组件信号的分配将来自结果的适当位。根据您之前的问题(Please Explain these verilog code?),我发现AQsumdifference都是8位值,Q_1是1位值。让我们检查第一个任务(注意其他三个以相同的方式工作):

{A, Q, Q_1} <= {sum[7], sum, Q};

如果我们查看右侧,我们可以看到串联的结果是一个17位向量,因为sum[7]是1位(sum的MSb),{ {1}}是8位,sum是8位(1 + 8 + 8 = 17)。让我们说Qsum = 8'b10100101Q = 8'b00110110会是什么样的?好吧,它是来自{sum[7], sum, Q}sum的值的串联,因此它是Q,第一位来自17'b1_10100101_00110110,后来的8位来自sum[7]来自sum的最后8位。

现在我们必须将这个17位值分配给左侧。在左侧,我们有Q,也是17位({A, Q, Q_1}是8位,A是8位,Q是1位)。但是,我们必须将上面得到的17位值的位分配给构成这个新的17位向量的正确信号,这意味着8个最高有效位进入Q_1,接下来的8位进入A,最不重要的一点进入Q。因此,如果我们从上方(Q_1)获取值,并以这种方式(17'b1_10100101_00110110)拆分,我们会看到17'b11010010_10011011_0A = 8'b11010010Q = 8'b10011011 。因此,这与分配Q_1 = 1'b0A = sum[7]Q = sum不同(这会产生Q_1 = QA = 8'b00000001Q = 8'b10100101,许多位Q_1 = 1'b0丢失,Q有7位额外位。)

但是,这并不意味着我们不能拆分左侧连接,它只是看起来像这样:

A

答案 1 :(得分:0)

是的,它们是一样的。例如,尝试这个小代码并检查,输出是相同的:

module test;

wire A,B,C;

reg p,q,r;

initial 
begin
 p=1; q=1; r=0;
end

assign  {A,B,C} = {p,q,r};

initial   #1 $display("%b %b %b",A,B,C); 

endmodule

一般情况下,如果您想了解连接运算符,可以参考here

编辑:我假设 A p B q C r