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

使用XOR在verilog中交换两个变量,verilog,fpga,xor,hdl,Verilog,Fpga,Xor,Hdl,我用Verilog HDL在内存缓冲区中写入了一行264位的数据 buffer[2]=264'b0001000001000010000000000010000000000000010000010000000000000000000000000000000000001000000100000100001000000000001000000000100001000011000000000000000000000000000000000000100000010000010000100000000000

我用Verilog HDL在内存缓冲区中写入了一行264位的数据

buffer[2]=264'b000100000100001000000000001000000000000001000001000000000000000000000000000000000000100000010000010000100000000000100000000010000100001100000000000000000000000000000000000010000001000001000010000000000010000000000000010001010000000000000000000000000000000000001000;
我想将上述原始数据中的10位从
缓冲区[2][147:138]
位传输到
缓冲区[2][59:50]
,然后将
缓冲区[2][235:226]
位传输到
缓冲区[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]}
               }; 

注意:您需要在第一个
{
前面
{
为未打包的数组创建赋值模式。如果
缓冲区
重新缓冲区
已打包,则可以删除该赋值模式。

只需创建一个新变量来保存新的、重新排列的数组。这不应生成任何逻辑,您只是在重新排列导线

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

注意:您需要在第一个
{
前面
{
为未打包的数组创建赋值模式。如果
缓冲区
后缓冲区
已打包,则可以将其删除。

您可以使用串联进行交换,无需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]};
您的标题是“交换”,但您的描述是“转移”。要转移,您仍然可以使用相同的方法:

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

始终
块中执行此操作时要小心。如果操作不正确,则在合成后可能会创建组合反馈回路。在执行交换之前,必须首先通过确定值(理想情况下为触发器)分配位。

您可以使用串联进行交换,无需异或:

{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]};
您的标题是“交换”,但您的描述是“转移”。要转移,您仍然可以使用相同的方法:

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

始终
块中执行此操作时要小心。如果操作不正确,在合成后可能会创建组合反馈回路。必须首先通过确定值(理想情况下为触发器)分配位在进行交换之前。

我认为从硬件ProPoctive来看,这个操作不能仅通过组合逻辑来完成,因此必须进行非阻塞分配。Verilog是一种硬件设计语言(HDL),而不是像Python或C这样的典型编程,所以当你在Verilog中设计时,想象一下你描述的硬件电路。表达式,如
buffer[2][235:226]=buffer[2][235:226]^buffer[2][147:138]
,描述了一个组合循环,这通常不是要在硬件中实现的。@KaranShah我不想使用非阻塞分配,因为模块中会混合使用阻塞分配和非阻塞分配。从.hardware开始思考。如果你想拥有顺序逻辑,那么选择非阻塞,如果是组合的,那么选择b锁定分配。我认为从硬件ProPoctive来看,该操作不能仅通过组合逻辑完成,因此必须进行非阻塞分配。Verilog是一种硬件设计语言(HDL),而不是像Python或C这样的典型编程,所以当你在Verilog中设计时,想象一下你描述的硬件电路。表达式,如
buffer[2][235:226]=buffer[2][235:226]^buffer[2][147:138]
,描述了一个组合循环,这通常不是要在硬件中实现的。@KaranShah我不想使用非阻塞分配,因为模块中会混合使用阻塞分配和非阻塞分配。从.hardware开始思考。如果你想拥有顺序逻辑,那么选择非阻塞,如果是组合的,那么选择b锁定分配。我想传输,当我这样做时:
buffer[2][59:50]=buffer[2][147:138];
buffer[2][147:138]=buffer[2][235:226];
buffer[2][235:226]的值被传输到buffer[2][59:50],这与删除buffer 2][147 147 138]和线缓存[2][235:226和buffer 59:50]类似,,,,,,,此操作在always BlockConcatenation中完成,将对您需要的旋转行为起作用。
{buffer[2][59:50],buffer[2][147:138],buffer[2][235:226]}={buffer[2][147:138],buffer[2][235:226],buffer[2][59:50]}
。但是,如果
在时钟边缘分配了
缓冲区
然后你应该把二进制逻辑(
always@*
)和顺序逻辑(
always@(posedge clk)
)分开。顺序逻辑变成了一个简单的赋值
buffer[2],当我这样做时,我想转移:
buffer[2][59:50]=buffer[2][147:138];
buffer 2][147 138]=buffer 2][235:226;
buffer[2][235:226]的值被传输到buffer[2][59:50],就像delete buffer[2][147:138]和wire buffer[2][235:226]以及buffer[2][59:50],,,,,,,,,这个操作是在always blockconcatenation中完成的,它将适用于您需要的旋转行为。
{buffer 2][59:50],buffer 2][147 138],buffer 2][235:226={buffer[2][147:138]、buffer[2][235:226]、buffer[2][59:50]}
。但是,如果
buffer
是在时钟边缘分配的(不完全是组合的),那么您应该将组合逻辑(
始终@*
)和顺序逻辑(
始终@(posedge clk)
)。顺序逻辑变成一个简单的分配
buffer[2] 仅供参考:
{}
用于SystemVerilog(IEEE1800),而不是Verilog(IEEE1364)。仅供参考:
{}
用于SystemVerilog(IEEE1800),而不是Verilog(IEEE1364)