Skip to content
Snippets Groups Projects
Commit 637dda3a authored by Majd Hafiri's avatar Majd Hafiri
Browse files

Update pixel.cpp

parent 4ce950ee
No related branches found
No related tags found
No related merge requests found
#include <stdio.h>
#include <hls_stream.h>
#include <ap_axi_sdata.h>
#include<math.h>
#include <string.h>
using namespace std;
typedef ap_int<32> apint;
typedef ap_axis<32,0,0,0> pkt_t;
typedef hls::stream< pkt_t > stream;
//Initializations
static int count_streams = 0; //counter of data input streams
static long long charIn=0; // to store binary values for each charachter decimal val
static long long final_char=0; // binary value of decoded data
int addNum=0; // holds lsb of CharIn
static int decNum = 0; //holds the decimal value for all characters
static int decimalCounter = 0; //used to shift to other charachter decimal value
static int decimalOut = 0; // holds the decimal value of the characters (decoding)
int lastDecimalVal; //holds decimal value of one character
long long convert(int n);
int convertBinInt(long long n);
void decrypt(int data);
void toAscii(char *c);
int getDecimal(int n);
pkt_t tmpA;
#include "pixel.hpp"
void pixel(apint &in_decimal,
apint selector,
apint stream_count,
stream &din,
stream &dout
apint selector,
apint stream_count,
stream &din,
stream &dout
) {
#pragma HLS INTERFACE ap_ctrl_none port=return
#pragma HLS INTERFACE s_axilite port=in_decimal
#pragma HLS INTERFACE s_axilite port=selector
#pragma HLS INTERFACE s_axilite port=stream_count
#pragma HLS INTERFACE s_axilite port=in_decimal // ascii values for the characters(word)
#pragma HLS INTERFACE s_axilite port=selector // to select the mode (encoding or decoding)
#pragma HLS INTERFACE s_axilite port=stream_count // size of data stream
#pragma HLS INTERFACE axis port=din
#pragma HLS INTERFACE axis port=dout
din >> tmpA;
din >> tmpA; //input data
switch(selector)
{
{
// case 0 is for encoding
case 0:
if (count_streams == 0){
final_char=0;
decNum = in_decimal;
final_char=0;
decNum = in_decimal; //getting the ascii values of the word from the register
}
addNum=0;
if(decimalCounter % 8 == 0){
/*checking if the counter is 8 which means the process reached the 8th bit*/
lastDecimalVal = getDecimal(decNum);
decNum /= 100;
charIn=convert(lastDecimalVal);
decNum /= 100; //to delete the processed ascii value and get the next one
charIn=convert(lastDecimalVal); //to find the binary of the next ascii value
}
addNum=charIn%10;
charIn=(int)charIn/10;
addNum=charIn%10; //LSB of charIn
charIn=(int)charIn/10; //deleting lsb and get the next bit(lsb)
//updating the input data according to addNum and lsb of the input data.
//if addNum is equal to 1 and input data is even , 1 will be added to input data which turns to odd
//otherwise no action needed
if(tmpA.data % 2 == 0 && addNum == 1){
tmpA.data += 1;
}else if(tmpA.data % 2 != 0 && addNum == 0){
}
//if addNum is equal to 0, input data is odd, 1 will be subtracted fro the input data which will turn it to even
//otherwise no action needed
else if(tmpA.data % 2 != 0 && addNum == 0){
tmpA.data -= 1;
}
decimalCounter++;
break;
//case 1 is for decoding
case 1:
decrypt(tmpA.data);
decode(tmpA.data); //getting decoded binary value bit by bit for every character
decimalCounter++;
if(decimalCounter == 8){
//after processing 8 bits, the ascii value will be returned by the convertBinInt
decimalOut=decimalOut*100+convertBinInt(final_char);
decimalCounter=0;
final_char=0;
......@@ -92,6 +80,7 @@ void pixel(apint &in_decimal,
count_streams++;
if (count_streams == stream_count){
//resetting variables
count_streams = 0;
charIn=0;
addNum=0;
......@@ -105,17 +94,19 @@ void pixel(apint &in_decimal,
}
if(count_streams == stream_count){
tmpA.last = 1;
//setting TLAST signal to 1
tmpA.last = 1;
}
tmpA.strb = 0xf;
dout << tmpA;
}
long long convert(int n) {
/**/
/*
This function converts a decimal number to a Binary number and returns it
*/
long long bin = 0;
int rem, i = 1, step = 1;
while (n != 0) {
......@@ -127,33 +118,40 @@ long long convert(int n) {
return bin;
}
void decrypt(int data) {
/**/
int bit;
if(data % 2 == 0){
bit = 0;
}else if(data % 2 != 0){
bit=1;
}
final_char= final_char*10+bit;
void decode(int data) {
/*
get the binary value of the embedded ascii values by combining the LSBs.
*/
int bit;
if(data % 2 == 0){
bit = 0;
}else if(data % 2 != 0){
bit=1;
}
final_char= final_char*10+bit;
}
int convertBinInt(long long n) {
/**/
int dec = 0, i = 7, b=0,rem=0;
while (n != 0) {
b=pow(10,i);
rem = n / b;
n =n % b;
dec += rem * pow(2, 7-i);
--i;
}
/*
This function returns decimal value from a binary number
*/
int dec = 0, i = 7, b=0,rem=0;
while (n != 0) {
b=pow(10,i);
rem = n / b;
n =n % b;
dec += rem * pow(2, 7-i);
--i;
}
return dec;
}
int getDecimal(int n) {
/**/
/*
returns the last two digits (which represents one character) of the corresponding ascii values passed to this function.
*/
int num = 0;
num = n % 100;
return num;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment