问题描述
我想通过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;
}
}