C++ 使用Vivado HLS(Xilinx)构建8x1多路复用器的逻辑
我想通过HLS创建8x1多路复用IP块。MUX块应为8个输入和单输出。 八个输入流:每个输入流数据宽度:32位,输出应为32位的单个输出流。我尝试了下面的代码,但在模拟输出中不是。我在这个实现背后缺少一些逻辑。谁能指引我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
// 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中选择一个FIFOs输入。我不知道如何使用选择行选择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;
}
}