Advertisement
Guest User

datapath.sv

a guest
Feb 27th, 2019
78
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,
  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. //      if (LD_LED)
  38. //          LED <= IR[11:0];           
  39. //      else   
  40. //          LED <= 12'b0;
  41. //  end
  42.    
  43.     assign LED = IR[11:0];
  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), //done - this is from week 1 lol.
  74.                                 .Din2(MDR_output),
  75.                                 .Din3(ALU_output),
  76.                                 .Din4(ADDER_output),
  77.                                 .sel1(GatePC),
  78.                                 .sel2(GateMDR),
  79.                                 .sel3(GateALU),
  80.                                 .sel4(GateMARMUX),
  81.                                 .Dout(mem_bus));
  82.                                
  83.     two_one_mux mdr_mux(.Din0(mem_bus), //done - this is from week 1 lol.
  84.                               .Din1(Data_To_CPU),
  85.                               .sel(MIO_EN),
  86.                               .Dout(MDR_input));
  87.                              
  88.     mux4 pc_mux(.Din0(PC_plus_one), //checked over this
  89.                     .Din1(mem_bus),
  90.                     .Din2(ADDER_output),
  91.                     .Din3(16'bx),
  92.                     .sel(PCMUX),
  93.                     .Dout(PC_input));
  94.                    
  95.     two_one_mux addr1_mux(.Din0(PC_output), //checked over this
  96.                                  .Din1(SR1_output),
  97.                                  .sel(ADDR1MUX),
  98.                                  .Dout(ADDR1_output));
  99.                                  
  100.     mux4 addr2_mux(.Din0(16'b0), //checked over this
  101.                         .Din1(SEXT6),
  102.                         .Din2(SEXT9),
  103.                         .Din3(SEXT11),
  104.                         .sel(ADDR2MUX),
  105.                         .Dout(ADDR2_output));
  106.    
  107.     two_one_mux #(3) dr_mux(.Din0(IR[11:9]), //checked over this
  108.                                     .Din1(3'b111),
  109.                                     .sel(DRMUX),
  110.                                     .Dout(DRMUX_output));
  111.                                    
  112.     two_one_mux #(3) sr1_mux(.Din0(IR[11:9]), //checked over this
  113.                                      .Din1(IR[8:6]),
  114.                                      .sel(SR1MUX),
  115.                                      .Dout(SR1MUX_output));
  116.                                      
  117.     two_one_mux sr2_mux(.Din0(SR2_output), //checked over this
  118.                               .Din1(SEXT5),
  119.                               .sel(SR2MUX),
  120.                               .Dout(SR2MUX_output));
  121.    
  122.    
  123.     //Registers & Flip Flops
  124.        
  125.     //registers - tentatively done 
  126.     reg_16 PC_reg(.Clk, //checked over this
  127.                       .Reset,
  128.                       .Load(LD_PC),
  129.                       .D(PC_input),
  130.                       .Data_Out(PC_output));
  131.                      
  132.     reg_16 IR_reg(.Clk, //checked over this
  133.                       .Reset,
  134.                       .Load(LD_IR),
  135.                       .D(mem_bus),
  136.                       .Data_Out(IR));
  137.                      
  138.     reg_16 MAR_reg(.Clk, //checked over this
  139.                         .Reset,
  140.                         .Load(LD_MAR),
  141.                         .D(mem_bus),
  142.                         .Data_Out(MAR));
  143.                        
  144.     reg_16 MDR_reg(.Clk, //checked over this
  145.                         .Reset,
  146.                         .Load(LD_MDR),
  147.                         .D(MDR_input),
  148.                         .Data_Out(MDR_output));
  149.    
  150.         //flip flops - tentatively done
  151.     flipflop N_reg(.Clk, //checked over this
  152.                         .Load(LD_CC),
  153.                         .Reset,
  154.                         .D(N_input),
  155.                         .Q(N_output));
  156.                        
  157.     flipflop Z_reg(.Clk, //checked over this
  158.                         .Load(LD_CC),
  159.                         .Reset,
  160.                         .D(Z_input),
  161.                         .Q(Z_output));
  162.                        
  163.     flipflop P_reg(.Clk, //checked over this
  164.                         .Load(LD_CC),
  165.                         .Reset,
  166.                         .D(P_input),
  167.                         .Q(P_output));
  168.                        
  169.     flipflop ben_reg(.Clk, //checked over this
  170.                           .Load(LD_BEN),
  171.                           .Reset,
  172.                           .D((IR[11] & N_output) | (IR[10] & Z_output) | (IR[9] & P_output)),
  173.                           .Q(BEN));
  174.    
  175.    
  176.     //RegFile Unit - tentatively done
  177.     RegFile file(.Clk,
  178.                      .Reset,
  179.                      .Load(LD_REG),
  180.                      .mem_shit(mem_bus),
  181.                      .DRMUX_output,
  182.                      .SR2_select(IR[2:0]),
  183.                      .SR1MUX_output,
  184.                      .SR2_output,
  185.                      .SR1_output);
  186.    
  187.    
  188.     //ALUs - tentatively done
  189.     ALU adder(.A(ADDR1_output), .B(ADDR2_output), .ALUK(2'b00), .Dout(ADDER_output));
  190.     ALU main_ALU(.A(SR1_output), .B(SR2MUX_output), .ALUK, .Dout(ALU_output));
  191.    
  192.    
  193.     //Assignments
  194.     assign PC_plus_one = PC_output + 16'h0001;
  195.     assign PC = PC_output;
  196.     assign MDR = MDR_output;
  197.     assign SEXT5 = 16'(signed'(IR[4:0])); //these sign extension things are working fine according to modelsim.
  198.     assign SEXT6 = 16'(signed'(IR[5:0]));
  199.     assign SEXT9 = 16'(signed'(IR[8:0]));
  200.     assign SEXT11 = 16'(signed'(IR[10:0]));
  201.  
  202.    
  203. endmodule
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement