两者的含义相同吗?
Is both have the same meaning?
在 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、和、差均为8位值,Q_1为1位值。
是的,它们是一样的。例如尝试这个小代码并检查,输出是相同的:
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 长度相同。
不,这些不一样。连接运算符 ({ ... }
) 允许您从几个不同的信号创建向量,允许您既使用这些向量又分配给这些向量,从而导致分量信号的分配将从结果中获得适当的位。从您之前的问题 (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) ,sum
是8位,Q
是8位(1+8+8=17)。假设 sum = 8'b10100101
和 Q = 8'b00110110
,{sum[7], sum, Q}
会是什么样子?好吧,它是 sum
和 Q
的值的串联,所以它将是 17'b1_10100101_00110110
,第一位来自 sum[7]
,接下来的 8 位来自 sum
和 Q
.
的最后 8 位
现在我们必须将这个 17 位值分配给左侧。在左边,我们有 {A, Q, Q_1}
,它也是 17 位(A
是 8 位,Q
是 8 位,Q_1
是 1 位)。但是,我们必须将上面获得的 17 位值中的位分配给构成这个新的 17 位向量的适当信号,这意味着 8 个最高有效位进入 A
,接下来的 8 位进入 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
的许多位丢失,A
有 7 个额外位)。
然而,这并不意味着我们不能拆分左侧的连接,它看起来像这样:
A <= {sum[7], sum[7:1]};
Q <= {sum[0], Q[7:1]};
Q_1 <= Q[0];
在 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、和、差均为8位值,Q_1为1位值。
是的,它们是一样的。例如尝试这个小代码并检查,输出是相同的:
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 长度相同。
不,这些不一样。连接运算符 ({ ... }
) 允许您从几个不同的信号创建向量,允许您既使用这些向量又分配给这些向量,从而导致分量信号的分配将从结果中获得适当的位。从您之前的问题 (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) ,sum
是8位,Q
是8位(1+8+8=17)。假设 sum = 8'b10100101
和 Q = 8'b00110110
,{sum[7], sum, Q}
会是什么样子?好吧,它是 sum
和 Q
的值的串联,所以它将是 17'b1_10100101_00110110
,第一位来自 sum[7]
,接下来的 8 位来自 sum
和 Q
.
现在我们必须将这个 17 位值分配给左侧。在左边,我们有 {A, Q, Q_1}
,它也是 17 位(A
是 8 位,Q
是 8 位,Q_1
是 1 位)。但是,我们必须将上面获得的 17 位值中的位分配给构成这个新的 17 位向量的适当信号,这意味着 8 个最高有效位进入 A
,接下来的 8 位进入 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
的许多位丢失,A
有 7 个额外位)。
然而,这并不意味着我们不能拆分左侧的连接,它看起来像这样:
A <= {sum[7], sum[7:1]};
Q <= {sum[0], Q[7:1]};
Q_1 <= Q[0];