在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位值。
答案 0 :(得分:2)
不,这些不一样。连接运算符({ ... }
)允许您从几个不同的信号创建向量,允许您使用这些向量并分配给这些向量,从而导致组件信号的分配将来自结果的适当位。根据您之前的问题(Please Explain these verilog code?),我发现A
,Q
,sum
和difference
都是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)。让我们说Q
和sum = 8'b10100101
,Q = 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_0
,A = 8'b11010010
和Q = 8'b10011011
。因此,这与分配Q_1 = 1'b0
,A = sum[7]
和Q = sum
不同(这会产生Q_1 = Q
,A = 8'b00000001
,Q = 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 相同长度的strong>和 r 。