Advertisement
omarahmad293

PCI_Device

Dec 20th, 2018
108
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. module device(address, GNT, CLK, force_req, addressToContact, RESET, REQ, Frame,AD , C_BE, IReady, TReady, DevSel);
  2.     input GNT, CLK, RESET, force_req;
  3.     input [31:0] address, addressToContact;
  4.    
  5.     output REQ;
  6.    
  7.     inout [31:0] AD;
  8.     input [3:0] C_BE;
  9.     inout Frame, IReady, TReady, DevSel;
  10.  
  11.     reg [31:0] mem [9:0];
  12.     wire [31:0] data [2:0]; //contains AA.., BB.., CC..
  13.    
  14.     integer i = 0;
  15.     integer numberOfTransactions;
  16.    
  17.     wire [1:0]phasesWire;
  18.     reg [1:0]numberOfPhases;
  19.    
  20.     integer posEdge = 0; //determines which edge of the clock
  21.    
  22.     //manually entering data inside device
  23.     assign data[0] = 32'hAA_AA_AA_AA;
  24.     assign data[1] = 32'hBB_BB_BB_BB;
  25.     assign data[2] = 32'hCC_CC_CC_CC;
  26.  
  27.     //number of data phases depends on device address and contact address according to scenarios
  28.     assign phasesWire= (address == 0 && addressToContact == 1)? 3 : (address == 0 && addressToContact == 2) ? 2 :(address == 1)? 2:(address==2)? 1 :0;
  29.  
  30.     reg isData; //determines which phase I'm in (address or data)
  31.    
  32.     reg isMaster = 0; //true when device is master (granted and bus is idle)
  33.  
  34.     reg REQ_reg;
  35.     assign REQ = REQ_reg;
  36.  
  37.    
  38.     reg Frame_reg;
  39.     reg [31:0] AD_reg;
  40.     reg DevSel_reg;
  41.     reg IReady_reg;
  42.     reg TReady_reg;
  43.  
  44.     //asserting signals when master only
  45.     assign Frame = (isMaster) ? Frame_reg : 1'bz;
  46.     assign AD = (isMaster) ? AD_reg : 32'bz;
  47.     assign IReady = (isMaster) ? IReady_reg : 1'bz;
  48.  
  49.     //asserting DevSel only when not master
  50.     assign DevSel = (!isMaster) ? DevSel_reg : 1'bz;
  51.     assign Tready = (!isMaster) ? TReady_reg : 1'bz;
  52.  
  53.     always @(CLK)
  54.     begin
  55.     posEdge = ~posEdge;
  56.         if (posEdge) //on positive edge read values and set flags
  57.         begin
  58.             if (!force_req) //as long as the force_req signal is low keep counting
  59.             begin
  60.                 i = i+1;
  61.                 REQ_reg = 0;
  62.             end
  63.            
  64.             else if (i != 0) // if it isn't low save the number of transactions in a register and reset the counter
  65.             begin
  66.                 numberOfTransactions = i; //
  67.                 i = 0;
  68.             end
  69.            
  70.             else //for synthesis purpose
  71.                 i = 0;
  72.            
  73.             if (GNT == 0 && Frame && IReady) //bus granted and bus is idle
  74.             begin
  75.                 isMaster = 1;
  76.                 isData=0; //send address on AD
  77.                 numberOfPhases <= phasesWire; //initialize the counter register
  78.             end //if
  79.         end //posEdge
  80.  
  81.         else //on negative edge write values
  82.         begin
  83.             if (isMaster)
  84.             begin
  85.                 Frame_reg = 0;
  86.                 if(!isData) //sending address
  87.                 begin
  88.                     AD_reg = addressToContact;
  89.                     isData=1;
  90.                 end
  91.  
  92.                 else //sending data
  93.                     if(numberOfPhases>0)
  94.                     begin
  95.                         numberOfPhases = numberOfPhases - 1;
  96.                         AD_reg = data[address];
  97.                         IReady_reg = 0;
  98.                         if(numberOfPhases ==0)
  99.                             Frame_reg = 1;
  100.                     end
  101.  
  102.                     else
  103.                         begin
  104.                         IReady_reg = 1;
  105.                         isMaster=0;
  106.                         end
  107.             end //if (isMaster)
  108.            
  109.             else //target not master
  110.             begin
  111.                 //read from master
  112.                 if (AD == address)
  113.                     DevSel_reg = 0;
  114.                     TReady_reg = 1;
  115.             end //slave not master
  116.         end //else negEdge     
  117.     end //always
  118. endmodule
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement