C++ 使用Vivado HLS(Xilinx)构建8x1多路复用器的逻辑

C++ 使用Vivado HLS(Xilinx)构建8x1多路复用器的逻辑,c++,xilinx,multiplexing,vivado-hls,C++,Xilinx,Multiplexing,Vivado Hls,我想通过HLS创建8x1多路复用IP块。MUX块应为8个输入和单输出。 八个输入流:每个输入流数据宽度:32位,输出应为32位的单个输出流。我尝试了下面的代码,但在模拟输出中不是。我在这个实现背后缺少一些逻辑。谁能指引我 // MUX CODE void 8x1_MUX(hls::stream<idata> &datain1,hls::stream<idata> &datain2,hls::stream<idata> &dat

我想通过HLS创建8x1多路复用IP块。MUX块应为8个输入和单输出。 八个输入流:每个输入流数据宽度:32位,输出应为32位的单个输出流。我尝试了下面的代码,但在模拟输出中不是。我在这个实现背后缺少一些逻辑。谁能指引我

// MUX CODE 
    void 8x1_MUX(hls::stream<idata> &datain1,hls::stream<idata> &datain2,hls::stream<idata> &datain3,hls::stream<idata> &datain4,hls::stream<idata> &datain5,hls::stream<idata> &datain6,hls::stream<idata> &datain7,hls::stream<idata> &datain8,hls::stream<odata> &dataout,hls::stream<isel> sel)
    {
        isel select;
        select=sel.read();
          idata in1;
          idata in2;
          idata in3;
          idata in4;
          idata in5;
          idata in6;
          idata in7;
          idata in8;      
        
 switch(select)
        {
    
        case 1:
            //idata in1;
    
            if(!datain1.empty())
            {
                    in1=datain1.read();
                    dataout.write(in1);
            }
    
           break;
    
        case 2:
              // idata in2;
               if(!datain2.empty())
               {
                   in2=datain2.read();
                   dataout.write(in2);
               }  
            break;
    
        case 3:
                //idata in3;
                if(!datain3.empty())
                {
                    in3=datain3.read();
                    dataout.write(in3);
                }
                break;
    
        case 4:
                //idata in4;
                if(!datain4.empty())
                {
                    in4=datain4.read();
                    dataout.write(in4);
                }
    
                break;
    
        case 5:
                //idata in5;
                if(!datain5.empty())
                {
                    in5=datain5.read();
                    dataout.write(in5);
    
                }
                break;
    
        case 6:
               // idata in6;
                if(!datain6.empty())
                {
                    in6=datain6.read();
                    dataout.write(in6);
                }
                break;
    
        case 7:
               // idata in7;
                if(!datain7.empty())
                {
                    in7=datain7.read();
                    dataout.write(in7);
                }
                break;
    
        case 8:
               // idata in8;
                if(!datain8.empty())
                {
                    in8=datain8.read();
                    dataout.write(in8);
    
                }
            break;
    
        default:
                 //cout<<"invalid stream"<<endl;
                 break;
        }
  
    }
//多路复用码
void 8x1_MUX(hls::stream&datain1,hls::stream&datain2,hls::stream&datain3,hls::stream&datain4,hls::stream&datain5,hls::stream&datain6,hls::stream&datain7,hls::stream&datain8,hls::stream&dataout,hls::stream sel)
{
isel选择;
select=sel.read();
idata 1;
idata-in2;
idata蛋白3;
IData4例;
IData5例;
idata 6例;
伊达达7例;
idata蛋白8;
开关(选择)
{
案例1:
//idata 1;
如果(!datain1.empty())
{
in1=datain1.read();
数据输出。写入(in1);
}
打破
案例2:
//idata-in2;
如果(!datain2.empty())
{
in2=datain2.read();
数据输出写入(in2);
}  
打破
案例3:
//idata蛋白3;
如果(!datain3.empty())
{
in3=datain3.read();
dataout.write(in3);
}
打破
案例4:
//IData4例;
如果(!datain4.empty())
{
in4=datain4.read();
dataout.write(in4);
}
打破
案例5:
//IData5例;
如果(!datain5.empty())
{
in5=datain5.read();
数据输出。写入(in5);
}
打破
案例6:
//idata 6例;
如果(!datain6.empty())
{
in6=datain6.read();
dataout.write(in6);
}
打破
案例7:
//伊达达7例;
如果(!datain7.empty())
{
in7=datain7.read();
dataout.write(in7);
}
打破
案例8:
//idata蛋白8;
如果(!datain8.empty())
{
in8=datain8.read();
dataout.write(in8);
}
打破
违约:

//cout一个可能的、短的解决方法,导致大致2个周期的执行,如下所示:

void 8x1_MUX(hls::stream<idata> datain[8], hls::stream<odata> &dataout, hls::stream<isel> &sel) {
#pragma HLS PIPELINE
  isel select = sel.read();
  idata packet;
  for (int i = 0; i < 8; ++i) {
    if (i == select - 1) {
      if (datain[i].read_nb(packet)) {
        dataout.write(odata(packet));
      }
    }
  }
}

如果您可以发布一个测试或波形图来显示问题,这将是最好的。但是,您的代码似乎可以读取sel而不输出任何内容(如果流中的适当数据为空)8对1复用器会导致使用hls的代码行如此之多,这一事实让我感到震惊。但我应该澄清一下,我只使用传统的verilog,而且我对rtl与hls的对比现在没有什么普遍的感觉。8个数据生成器块
s,而每个块输出(Axi流)是32位,并连接到每个FIFO(总共8个FIFO
s)。每个FIFO输出连接到8x1 MUX。MUX应在该实例的8个FIFO
s中选择一个FIFO
s输入。我不知道如何使用选择行选择FIFO
s的输入。我编写的逻辑代码是否正确?
void 8x1_MUX(hls::stream<idata> &datain1, hls::stream<idata> &datain2,
    hls::stream<idata> &datain3, hls::stream<idata> &datain4,
    hls::stream<idata> &datain5, hls::stream<idata> &datain6,
    hls::stream<idata> &datain7, hls::stream<idata> &datain8,
    hls::stream<odata> &dataout, hls::stream<isel> &sel) {
#pragma HLS PIPELINE
  isel select = sel.read();
  idata packet;
  switch(select) {
    case 1:
      if (datain1.read_nb(packet)) {
        dataout.write(odata(packet));
      }
      break;
    case 2:
      if (datain2.read_nb(packet)) {
        dataout.write(odata(packet));
      }
      break;
    case 3:
      if (datain3.read_nb(packet)) {
        dataout.write(odata(packet));
      }
      break;
    case 4:
      if (datain4.read_nb(packet)) {
        dataout.write(odata(packet));
      }
      break;
    case 5:
      if (datain5.read_nb(packet)) {
        dataout.write(odata(packet));
      }
      break;
    case 6:
      if (datain6.read_nb(packet)) {
        dataout.write(odata(packet));
      }
      break;
    case 7:
      if (datain7.read_nb(packet)) {
        dataout.write(odata(packet));
      }
      break;
    case 8:
      if (datain8.read_nb(packet)) {
        dataout.write(odata(packet));
      }
      break;
  }
}