Academic Integrity: tutoring, explanations, and feedback — we don’t complete graded work or submit on a student’s behalf.

Design and verify a communications interface. Often data sent over a data link a

ID: 2247950 • Letter: D

Question

Design and verify a communications interface. Often data sent over a data link are organized as packets of data, each packet containing some identification bits, data, and some check bits used to determine if a transmission error has occurred. Your hardware must meet the following specification: Inputs: Clock: Reset: //reset is active low Clear: //clears output registers - active high InData[11: 0]: //Input data, organized as follows: // InData1 [11: 8] contains the 'header', // InData[7: 4] contains the 'data payload' // InData[3: 1] are not used // InData[0] is a parity bit. It is '1' if InData[7: 4] is meant to be even parity. // A new 'InData' arrives every clock Outputs: All outputs are registered and are cleared when reset, is low or 'clear', is high. Payload[3: 0]: //is changed to contain the 'data payload', when 'InData', is of type 1 Count[7: 0];// total count of type 1 datas Error[7: 0]: //number of type 1 datas of wrong parity number of type 1 datas of wrong parity Clock 10101010101010101010101010 Clear 1000000000000000000000000 1 InData 1F1 0E0 171 0E0 (ie., IFI: 'type 1', payload = F, parity should be even 0E0: 'not type 1', payload = E, odd parity 170: 'type 1', payload = 7, payload should have been even parity Payload 0 FF77 The piece of hardware checks lnData on each clock cycle. If InData[11: 8] = 1, then it transfers the middle four bits of InData to payload and increments count. At the same time, it checks the parity of the middle four bits and sees if it is as expected. If it is not, then there is a transmission error, and error is incremented.

Explanation / Answer

#include <stdio.h>

#include <bios.h>

#include <conio.h>

#define COM1       0

#define DATA_READY 0x100

#define TRUE       1

#define FALSE      0

#define SETTINGS ( 0xE0 | 0x03 | 0x00 | 0x00)

int main(void)

{

   int in, out, status, DONE = FALSE,i=0;

   char c;

   FILE *fp,*fp1;

   unsigned long count = 0,shiftcount = 0;

   clrscr();

   fp = fopen("C:/TC/pic.jpg","rb"); //opened for reading actual content

   fp1 = fopen("C:/TC/pic.jpg","rb"); //opened for reading the size of file

fseek(fp1,0L,2);

   count = ftell(fp1) + 1; // file size

bioscom(0, SETTINGS, COM1); // initializing the port

printf("No. of Characters = %lu ",count);

// since bioscom function can send or receive only 8bits at a time, am sending file size in

    4 rounds so that we can send at max of 4GB file.

   bioscom(1,count,COM1); // sneding 1st lower 8bits

bioscom(1,count>>8,COM1); // sending 2nd set of lower 8bits

   bioscom(1,count>>16,COM1); // sending 3rd set of lower 8bits

bioscom(1,count>>24,COM1); // sending upper 8 bits

cprintf("... BIOSCOM [ESC] to exit ... ");

   while (!DONE)

   {

      status = bioscom(3, 0, COM1);// get the status of port

      //printf("%d",status);

      if (status & DATA_READY) //checks if data is ready

      {

        out = bioscom(2, 0, COM1); // receives the ack

        if(!feof(fp))

        {

            c = fgetc(fp); //read character by character from file

            bioscom(1,c,COM1);//send character to receiver

            putch(c);//display

        }

     }

//to interrupt

     if (kbhit())

     {

        if ((in = getch()) == '')

           DONE = TRUE;

     }

   }

   fclose(fp);

   return 0;

}

output

#include <stdio.h>

#include <bios.h>

#include <conio.h>

#define COM4       3

#define DATA_READY 0x100

#define TRUE       1

#define FALSE      0

#define SETTINGS ( 0xE0 | 0x03 | 0x00 | 0x00)

int main(void)

{

   int in, out, status;

   char c;

   FILE *fp;

   unsigned long shiftcount1=0,shiftcount2=0,shiftcount3=0,shiftcount4=0;

   unsigned long count = 0, DONE = 1;

clrscr();

   fp = fopen("C:/TC/pic1.jpg","wb");// file opened for writing

bioscom(0, SETTINGS, COM4);//initialize tyhe port

   cprintf("... BIOSCOM [ESC] to exit ... ");

//receives all the 32 bits of file size sent from sender

   shiftcount1 = bioscom(2,0,COM4);

   shiftcount2 = bioscom(2,0,COM4);

   shiftcount3 = bioscom(2,0,COM4);

   shiftcount4 = bioscom(2,0,COM4);

/send an ack

   bioscom(1,'x',COM4);

   count = shiftcount1 | (shiftcount2<<8) | (shiftcount3<<16) | (shiftcount4<<24);

   printf("shift4 = %lu shift3 = %lu shift2 = %lu shift1 = %lu ",shiftcount4,shiftcount3,shiftcount2,shiftcount1);

   printf("File Size = %lu ",count);

//loop till the size of the file

   while (DONE < count)

   {

      status = bioscom(3, 0, COM4);// check the status

     // printf("%d",status);

      if (status & DATA_READY)//check for data ready at the port

      {

        out = bioscom(2, 0, COM4);//receive the data

        DONE++;

        fputc(out,fp);

        putch(out);

        bioscom(1,'x',COM4);//send an ack

      }

     if (kbhit())

     {

        if ((in = getch()) == '')

        break;

     }

   }

   fclose(fp);

   return 0;

}

Hire Me For All Your Tutoring Needs
Integrity-first tutoring: clear explanations, guidance, and feedback.
Drop an Email at
drjack9650@gmail.com
Chat Now And Get Quote