使用XOR在verilog中交换两个变量

时间:2016-12-17 22:36:40

标签: verilog fpga xor hdl

我在内存缓冲区中使用Verilog HDL写入了264位数据。

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

如何在不使用非阻塞分配的情况下执行此操作?

2 个答案:

答案 0 :(得分:2)

只需创建一个新变量来保存新的重新排列的数组。这不应该产生任何逻辑,你只是重新排列电线。

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]}
               }; 

注意:在第一个'前面需要{来为解压缩的数组创建一个赋值模式。如果bufferreArrBuffer已打包,则可以将其删除。

答案 1 :(得分:2)

您可以交换连接,不需要xor:

{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 ,但您的说明是转移。要转移你仍然可以使用相同的方法:

{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块中执行此操作时要小心。如果做错了,它可以在合成后创建组合反馈回路。在进行交换之前,必须首先通过一个确定值(理想情况下是一个触发器)来分配这些位。