1

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

1 回答 1

0

A possible, short, workaround, resulting in roughtly 2 cycles execution, would look something like this:

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

Bear in mind that the empty() and full() methods are not synthesizeable (that's way I'm using the read non-blocking read_nb() method, as suggested in the HLS guide).

Also, there's no check on your select sel FIFO port, so the IP might get stuck waiting for reading the selection packet.

Alternatevely, you can still use the switch-case structure like so:

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;
  }
}
于 2021-03-09T15:33:48.033 回答