使用 XOR 在 verilog 中交换两个变量
swap two variables in verilog using XOR
我在内存缓冲区中有一行 264 位的数据,使用 Verilog HDL 编写。
buffer[2]=264'b000100000100001000000000001000000000000001000001000000000000000000000000000000000000100000010000010000100000000000100000000010000100001100000000000000000000000000000000000010000001000001000010000000000010000000000000010001010000000000000000000000000000000000001000;
我想将上述原始数据中的 10 位从 buffer[2][147:138]
位传输到 buffer[2][59:50]
,然后将 buffer[2][235:226]
位传输到 buffer[2][147:138]
我尝试使用 XOR 来执行此操作,但它不起作用
buffer[2][59:50]=buffer[2][59:50]^buffer[2][147:138];
buffer[2][147:138]=buffer[2][59:50]^buffer[2][147:138];
buffer[2][59:50]=buffer[2][59:50]^buffer[2][147:138];
buffer[2][235:226]=buffer[2][235:226]^buffer[2][147:138];
buffer[2][147:138]=buffer[2][235:226]^buffer[2][147:138];
buffer[2][235:226]=buffer[2][235:226]^buffer[2][147:138];
如何在不使用非阻塞赋值的情况下做到这一点?
只需创建一个新变量来保存重新排列的新数组。这不应该产生任何逻辑,您只是在重新排列电线。
reg [263:0] reArrBuffer [0:2];
assign reArrBuffer =
'{buffer[0],
buffer[1],
{buffer[2][263:148], buffer[2][235:226], buffer[2][137:60], buffer[2][147:138], buffer[2][49:0]}
};
注意:您需要在第一个 {
前面加上 '
才能为解压缩的数组创建赋值模式。如果 buffer
和 reArrBuffer
被打包,它可以被删除。
您可以用串联交换,不需要异或:
{buffer[2][147:138],buffer[2][59:50]} = {buffer[2][59:50],buffer[2][147:138]};
{buffer[2][235:226],buffer[2][147:138] = {buffer[2][147:138],buffer[2][235:226]};
您的标题是 swap,但您的描述是 transfer。要转移你仍然可以使用相同的方法:
{buffer[2][147:138],buffer[2][59:50]} = {buffer[2][235:226],buffer[2][147:138]}
// Or you can do this, beware order matters
buffer[2][59:50] = buffer[2][147:138];
buffer[2][147:138] = buffer[2][235:226];
请注意在 always
块中执行此操作的位置。如果操作不当,它可以在合成后创建一个组合反馈回路。在进行交换之前,必须首先给这些位分配一个确定的值(最好是一个触发器)。
我在内存缓冲区中有一行 264 位的数据,使用 Verilog HDL 编写。
buffer[2]=264'b000100000100001000000000001000000000000001000001000000000000000000000000000000000000100000010000010000100000000000100000000010000100001100000000000000000000000000000000000010000001000001000010000000000010000000000000010001010000000000000000000000000000000000001000;
我想将上述原始数据中的 10 位从 buffer[2][147:138]
位传输到 buffer[2][59:50]
,然后将 buffer[2][235:226]
位传输到 buffer[2][147:138]
我尝试使用 XOR 来执行此操作,但它不起作用
buffer[2][59:50]=buffer[2][59:50]^buffer[2][147:138];
buffer[2][147:138]=buffer[2][59:50]^buffer[2][147:138];
buffer[2][59:50]=buffer[2][59:50]^buffer[2][147:138];
buffer[2][235:226]=buffer[2][235:226]^buffer[2][147:138];
buffer[2][147:138]=buffer[2][235:226]^buffer[2][147:138];
buffer[2][235:226]=buffer[2][235:226]^buffer[2][147:138];
如何在不使用非阻塞赋值的情况下做到这一点?
只需创建一个新变量来保存重新排列的新数组。这不应该产生任何逻辑,您只是在重新排列电线。
reg [263:0] reArrBuffer [0:2];
assign reArrBuffer =
'{buffer[0],
buffer[1],
{buffer[2][263:148], buffer[2][235:226], buffer[2][137:60], buffer[2][147:138], buffer[2][49:0]}
};
注意:您需要在第一个 {
前面加上 '
才能为解压缩的数组创建赋值模式。如果 buffer
和 reArrBuffer
被打包,它可以被删除。
您可以用串联交换,不需要异或:
{buffer[2][147:138],buffer[2][59:50]} = {buffer[2][59:50],buffer[2][147:138]};
{buffer[2][235:226],buffer[2][147:138] = {buffer[2][147:138],buffer[2][235:226]};
您的标题是 swap,但您的描述是 transfer。要转移你仍然可以使用相同的方法:
{buffer[2][147:138],buffer[2][59:50]} = {buffer[2][235:226],buffer[2][147:138]}
// Or you can do this, beware order matters
buffer[2][59:50] = buffer[2][147:138];
buffer[2][147:138] = buffer[2][235:226];
请注意在 always
块中执行此操作的位置。如果操作不当,它可以在合成后创建一个组合反馈回路。在进行交换之前,必须首先给这些位分配一个确定的值(最好是一个触发器)。