1
Fork 0
mirror of https://github.com/Steffo99/unimore-hpc-assignments.git synced 2024-11-26 10:04:23 +00:00
hpc-2022-g3/hls/assignment/sobel/sobel.cpp

65 lines
1.7 KiB
C++
Raw Normal View History

#include <cstring>
2022-12-18 23:00:31 +00:00
#include <math.h>
#include "sobel.h"
2022-12-19 08:35:20 +00:00
void sobel(uint8_t *__restrict__ out, uint8_t *__restrict__ in, const int width, const int height)
2022-12-18 23:00:31 +00:00
{
#pragma HLS INTERFACE m_axi port=out offset=slave bundle=bout
#pragma HLS INTERFACE m_axi port=in offset=slave bundle=bin
#pragma HLS INTERFACE s_axilite port=width bundle=bwidth
#pragma HLS INTERFACE s_axilite port=height bundle=bheight
2022-12-19 08:35:20 +00:00
const int sobelFilter[3][3] = {
{-1, 0, 1},
{-2, 0, 2},
{-1, 0, 1}
};
2022-12-18 23:00:31 +00:00
// Carica le prime tre righe nel buffer
uint8_t inBuffer[3*height];
memcpy(inBuffer, in, 3*height*sizeof(uint8_t));
esternoY:
for (int y = 0; y < height - 2; y++)
2022-12-18 23:00:31 +00:00
{
#pragma HLS PIPELINE
esternoX:
for (int x = 0; x < width - 2; x++)
2022-12-18 23:00:31 +00:00
{
int dx = 0;
int dy = 0;
internoY:
2022-12-18 23:00:31 +00:00
for (int k = 0; k < 3; k++)
{
#pragma HLS UNROLL
const int inYOffset = ((y + k) % 3) * width;
internoX:
2022-12-18 23:00:31 +00:00
for (int z = 0; z < 3; z++)
{
#pragma HLS UNROLL
const int inXOffset = x + z;
const int inOffset = inYOffset + inXOffset;
const int inElement = inBuffer[inOffset];
dx += sobelFilter[k][z] * inElement;
dy += sobelFilter[z][k] * inElement;
2022-12-18 23:00:31 +00:00
}
}
const int outYOffset = (y + 1) * width;
const int outXOffset = (x + 1);
const int outOffset = outYOffset + outXOffset;
out[outOffset] = sqrt((float)((dx * dx) + (dy * dy)));
2022-12-18 23:00:31 +00:00
}
memcpy(inBuffer, in + (y % 3) * height, height*sizeof(uint8_t));
2022-12-18 23:00:31 +00:00
}
}