使用Vivado HLSXilinx构建8x1 Mux的逻辑

问题描述

我想通过HLS创建8x1 MUX 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;
        }
  
    }

解决方法

一个可能的、简短的解决方法,导致大约 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));
      }
    }
  }
}

请记住,empty()full() 方法是不可综合的(这就是我使用读取非阻塞 read_nb() 方法的方式,因为在 HLS guide 中建议)。

此外,没有检查您选择的 sel FIFO 端口,因此 IP 可能会卡住等待读取选择数据包。

或者,您仍然可以像这样使用 switch-case 结构:

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