Advertisement
Guest User

datapath.sv

a guest
Feb 26th, 2019
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. module datapath (
  2.                      //week 1 stuff
  3.                      input Clk, Reset,
  4.                      input LD_MAR, LD_MDR, MIO_EN, LD_IR, LD_PC,
  5.                      input GatePC, GateMDR, GateALU, GateMARMUX,
  6.                      input [15:0] Data_To_CPU,
  7.                      input [1:0] ADDR2MUX, ALUK, PCMUX,
  8.                      //week 2 stuff
  9.                      input LD_BEN, LD_CC, LD_REG, LD_LED, //not sure about LD_LED
  10.                      input DRMUX, SR1MUX, SR2MUX, ADDR1MUX,
  11.                      //week 1 stuff
  12.                      output logic [15:0] MAR,
  13.                      output logic [15:0] MDR,
  14.                      output logic [15:0] IR,
  15.                      output logic [15:0] PC,
  16.                      //week 2 stuff
  17.                      output logic [11:0] LED,
  18.                      output logic BEN
  19.                      );
  20.    
  21.     logic [15:0] mem_bus;
  22.     logic [15:0] MDR_input; //thing that goes into MDR
  23.     logic [15:0] PC_input; //thing that goes into PC
  24.     logic [15:0] PC_plus_one;
  25.     logic [15:0] ADDR2_output, ADDR1_output, ADDER_output;
  26.     logic [15:0] ALU_output;
  27.     logic [15:0] PC_output;
  28.     logic [15:0] MDR_output;
  29.     logic [15:0] SR2_output, SR1_output, SR2MUX_output;
  30.     logic [15:0] SEXT5, SEXT6, SEXT9, SEXT11;
  31.     logic [2:0] DRMUX_output, SR1MUX_output;
  32.     logic N_input, Z_input, P_input, N_output, Z_output, P_output;
  33.    
  34.     //LED logic for IR
  35.     always_ff @ (posedge Clk)
  36.     begin
  37.    
  38.         if (~LD_LED)
  39.             LED <= 12'h0;
  40.         else   
  41.             LED <= IR[11:0];
  42.     end
  43.    
  44.    
  45.     //NZP Logic Stuff - tentatively done
  46.     always_comb begin
  47.         if (mem_bus[15] == 1'b1) begin
  48.             N_input = 1'b1;
  49.             Z_input = 1'b0;
  50.             P_input = 1'b0;
  51.         end
  52.         else if (mem_bus[15] == 1'b0) begin
  53.             if (mem_bus == 16'h0) begin
  54.                 N_input = 1'b0;
  55.                 Z_input = 1'b1;
  56.                 P_input = 1'b0;
  57.             end
  58.             else begin
  59.                 N_input = 1'b0;
  60.                 Z_input = 1'b0;
  61.                 P_input = 1'b1;
  62.             end
  63.         end
  64.         else begin //default
  65.             N_input = 1'b0;
  66.             Z_input = 1'b1;
  67.             P_input = 1'b0;
  68.         end
  69.     end
  70.    
  71.    
  72.     //MUXES - tentatively done
  73.     one_hot tristate_mux(.Din1(PC_output), .Din2(MDR_output), .Din3(ALU_output), .Din4(ADDER_output),
  74.                                 .sel1(GatePC), .sel2(GateMDR), .sel3(GateALU), .sel4(GateMARMUX), .Dout(mem_bus));
  75.     two_one_mux mdr_mux(.Din0(mem_bus), .Din1(Data_To_CPU), .sel(MIO_EN), .Dout(MDR_input));
  76.     mux4 pc_mux(.Din0(PC_plus_one), .Din1(mem_bus), .Din2(ADDER_output), .Din3(16'bx), .sel(PCMUX), .Dout(PC_input));
  77.     two_one_mux addr1_mux(.Din0(PC_output), .Din1(SR1_output), .sel(ADDR1MUX), .Dout(ADDR1_output));
  78.     mux4 addr2_mux(.Din0(16'b0), .Din1(SEXT6), .Din2(SEXT9), .Din3(SEXT11), .sel(ADDR2MUX), .Dout(ADDR2_output));
  79.     two_one_mux #(3) dr_mux(.Din0(IR[11:9]), .Din1(3'b111), .sel(DRMUX), .Dout(DRMUX_output));
  80.     two_one_mux #(3) sr1_mux(.Din0(IR[11:9]), .Din1(IR[8:6]), .sel(SR1MUX), .Dout(SR1MUX_output));
  81.     two_one_mux sr2_mux(.Din0(SR2_output), .Din1(SEXT5), .sel(SR2MUX), .Dout(SR2MUX_output));
  82.    
  83.    
  84.     //Registers & Flip Flops
  85.         //registers - tentatively done
  86.     reg_16 PC_reg(.Clk, .Reset, .Load(LD_PC), .D(PC_input), .Data_Out(PC_output));
  87.     reg_16 IR_reg(.Clk, .Reset, .Load(LD_IR), .D(mem_bus), .Data_Out(IR));
  88.     reg_16 MAR_reg(.Clk, .Reset, .Load(LD_MAR), .D(mem_bus), .Data_Out(MAR));
  89.     reg_16 MDR_reg(.Clk, .Reset, .Load(LD_MDR), .D(MDR_input), .Data_Out(MDR_output));
  90.    
  91.         //flip flops - tentatively done
  92.     flipflop N_reg(.Clk, .Load(LD_CC), .Reset, .D(N_input), .Q(N_output));
  93.     flipflop_z Z_reg(.Clk, .Load(LD_CC), .Reset, .D(Z_input), .Q(Z_output));
  94.     flipflop P_reg(.Clk, .Load(LD_CC), .Reset, .D(P_input), .Q(P_output));
  95.     flipflop ben_reg(.Clk, .Load(LD_BEN), .Reset,
  96.                         .D((IR[11] & N_output) | (IR[10] & Z_output) | (IR[9] & P_output)),
  97.                         .Q(BEN));
  98.    
  99.    
  100.     //RegFile Unit - tentatively done
  101.     RegFile file(.Clk, .Reset, .Load(LD_REG), .mem_shit(mem_bus), .DRMUX_output, .SR2_select(IR[2:0]), .SR1MUX_output, .SR2_output, .SR1_output);
  102.    
  103.    
  104.     //ALUs - tentatively done
  105.     ALU adder(.A(ADDR1_output), .B(ADDR2_output), .ALUK(2'b00), .Dout(ADDER_output));
  106.     ALU main_ALU(.A(SR1_output), .B(SR2MUX_output), .ALUK, .Dout(ALU_output));
  107.    
  108.    
  109.     //Assignments
  110.     assign PC_plus_one = PC_output + 16'h0001;
  111.     assign PC = PC_output;
  112.     assign MDR = MDR_output;
  113.     assign SEXT5 = 16'(signed'(IR[4:0]));
  114.     assign SEXT6 = 16'(signed'(IR[5:0]));
  115.     assign SEXT9 = 16'(signed'(IR[8:0]));
  116.     assign SEXT11 = 16'(signed'(IR[10:0]));
  117.  
  118.    
  119. endmodule
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement