Hi everyone,
I am trying to implement an HLS design in which two buffers are used to store a downscaled input frame. One buffer is used to store the incoming input frame and the other is used to send the output frame, and after a full frame transfer is complete, the roles of the buffers reverse.
The code is as follows:
#include <iostream>
#include <stdint.h>
#include <hls_stream.h>
#include <ap_axi_sdata.h>
typedef ap_axiu<32,1,1,1> pixel_data;
typedef hls::stream<pixel_data> pixel_stream;
#define WIDTH 1280
#define HEIGHT 720
#define COMPRESSION_SCALE 16
void invstripe(pixel_stream &src, pixel_stream &dst)
{
//pragmas
#pragma HLS INTERFACE ap_ctrl_none port=return
#pragma HLS INTERFACE axis port=&src
#pragma HLS INTERFACE axis port=&dst
#pragma HLS PIPELINE II=1
//x and y are the counter for the input stream
static uint16_t x = 0;
static uint16_t y = 0;
//buffers and state variable. State is the index of the buffer to which the input buffer is writtem
static uint32_t state = 0;
static uint32_t buffer_first[WIDTH/COMPRESSION_SCALE][HEIGHT/COMPRESSION_SCALE];
static uint32_t buffer_second[WIDTH/COMPRESSION_SCALE][HEIGHT/COMPRESSION_SCALE];
//Buffers indeces
uint16_t buffer_x;
uint16_t buffer_y;
//Whether the incoming pixel should be stored
bool to_be_written;
pixel_data input_pixel;
uint32_t read_data;
pixel_data output_pixel;
// Load pixel data from source
src >> input_pixel;
// Reset X and Y counters on user signal, state goes from 0 to 1 then back to 0
if (input_pixel.user){
x = y = 0;
state = (state + 1) % 2;
}
//Dowscaled coordinates to wrtie into the buffers
buffer_x = x / COMPRESSION_SCALE;
buffer_y = y / COMPRESSION_SCALE;
//Not all incoming pixels are stored
if ((x % COMPRESSION_SCALE == 0) && (y % COMPRESSION_SCALE == 0)) {
to_be_written = true;
}
else {
to_be_written = false;
}
//Where the storing and reading from the buffers happens
if (state == 0 ) {
read_data = buffer_first[buffer_x][buffer_y];
if (to_be_written) {
buffer_second[buffer_x][buffer_y] = input_pixel.data;
}
} else {
read_data = buffer_second[buffer_x][buffer_y];
if (to_be_written) {
buffer_first[buffer_x][buffer_y] = input_pixel.data;
}
}
output_pixel = input_pixel;
output_pixel.data = read_data;
dst << output_pixel;
// Increment X and Y counters
if (input_pixel.last)
{
x = 0;
y++;
}
else {
x++;
}
}
My HLS design is connected to the video pipeline as follows: https://imgur.com/a/PZZYrjp
To start everything, I am using the following Jupyter script: https://imgur.com/a/vRDvwqd
However, the screen shows that the top (about 30%) part of the frame is simply a repetition of the bottom part, as shown bellow. I also noticed that the top part of the frame looks more red, while the bottom part looks more green.
Any ideas as to why I can’t see the entire frame I sent on the screen? I am a bit lost
Thank you for your time