Advertisement
Guest User

Untitled

a guest
Feb 27th, 2019
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. //------------------------------------------------------------------------------
  2. // Company:          UIUC ECE Dept.
  3. // Engineer:         Stephen Kempf
  4. //
  5. // Create Date:    17:44:03 10/08/06
  6. // Design Name:    ECE 385 Lab 6 Given Code - Incomplete ISDU
  7. // Module Name:    ISDU - Behavioral
  8. //
  9. // Comments:
  10. //    Revised 03-22-2007
  11. //    Spring 2007 Distribution
  12. //    Revised 07-26-2013
  13. //    Spring 2015 Distribution
  14. //    Revised 02-13-2017
  15. //    Spring 2017 Distribution
  16. //------------------------------------------------------------------------------
  17.  
  18.  
  19. module ISDU (   input logic         Clk,
  20.                                     Reset,
  21.                                     Run,
  22.                                     Continue,
  23.                                    
  24.                 input logic[3:0]    Opcode,
  25.                 input logic         IR_5,
  26.                 input logic         IR_11,
  27.                 input logic         BEN,
  28.                  
  29.                 output logic        LD_MAR,
  30.                                     LD_MDR,
  31.                                     LD_IR,
  32.                                     LD_BEN,
  33.                                     LD_CC,
  34.                                     LD_REG,
  35.                                     LD_PC,
  36.                                     LD_LED, // for PAUSE instruction
  37.                                    
  38.                 output logic        GatePC,
  39.                                     GateMDR,
  40.                                     GateALU,
  41.                                     GateMARMUX,
  42.                                    
  43.                 output logic [1:0]  PCMUX,
  44.                 output logic        DRMUX,
  45.                                     SR1MUX,
  46.                                     SR2MUX,
  47.                                     ADDR1MUX,
  48.                 output logic [1:0]  ADDR2MUX,
  49.                                     ALUK,
  50.                  
  51.                 output logic        Mem_CE,
  52.                                     Mem_UB,
  53.                                     Mem_LB,
  54.                                     Mem_OE,
  55.                                     Mem_WE
  56.                 );
  57.  
  58.     enum logic [4:0] {  Halted,
  59.                         PauseIR1,
  60.                         PauseIR2,
  61.                         S_18,
  62.                         S_33_1,
  63.                         S_33_2,
  64.                         S_35,
  65.                         S_32,
  66.                         S_01,
  67.                         S_05,
  68.                         S_09,
  69.                         S_06,
  70.                         S_25,
  71.                         S_25_2,
  72.                         S_27,
  73.                         S_07,
  74.                         S_23,
  75.                         S_16,
  76.                         S_16_2,
  77.                         S_04,
  78.                         S_21,
  79.                         S_12,
  80.                         S_00,
  81.                         S_22 }   State, Next_state;   // Internal state logic
  82.        
  83.     always_ff @ (posedge Clk)
  84.     begin
  85.         if (Reset)
  86.             State <= Halted;
  87.         else
  88.             State <= Next_state;
  89.     end
  90.    
  91.     always_comb
  92.     begin
  93.         // Default next state is staying at current state
  94.         Next_state = State;
  95.        
  96.         // Default controls signal values
  97.         LD_MAR = 1'b0;
  98.         LD_MDR = 1'b0;
  99.         LD_IR = 1'b0;
  100.         LD_BEN = 1'b0;
  101.         LD_CC = 1'b0;
  102.         LD_REG = 1'b0;
  103.         LD_PC = 1'b0;
  104.         LD_LED = 1'b0;
  105.          
  106.         GatePC = 1'b0;
  107.         GateMDR = 1'b0;
  108.         GateALU = 1'b0;
  109.         GateMARMUX = 1'b0;
  110.          
  111.         ALUK = 2'b00;
  112.          
  113.         PCMUX = 2'b00;
  114.         DRMUX = 1'b0;
  115.         SR1MUX = 1'b0;
  116.         SR2MUX = 1'b0;
  117.         ADDR1MUX = 1'b0;
  118.         ADDR2MUX = 2'b00;
  119.          
  120.         Mem_OE = 1'b1;
  121.         Mem_WE = 1'b1;
  122.    
  123.         // Assign next state
  124.         unique case (State)
  125.             Halted :
  126.                 if (Run)
  127.                     Next_state = S_18;                      
  128.             S_18 :
  129.                 Next_state = S_33_1;
  130.             // Any states involving SRAM require more than one clock cycles.
  131.             // The exact number will be discussed in lecture.
  132.             S_33_1 :
  133.                 Next_state = S_33_2;
  134.             S_33_2 :
  135.                 Next_state = S_35;
  136.             S_35 :
  137.                 Next_state = S_32;
  138.             // PauseIR1 and PauseIR2 are only for Week 1 such that TAs can see
  139.             // the values in IR. We are repurposing PauseIR1 and PauseIR2 as the regular Pause and Pause2.
  140.             PauseIR1 :
  141.                 if (~Continue)
  142.                     Next_state = PauseIR1;
  143.                 else
  144.                     Next_state = PauseIR2;
  145.             PauseIR2 :
  146.                 if (Continue)
  147.                     Next_state = PauseIR2;
  148.                 else
  149.                     Next_state = S_18;
  150.             S_32 :
  151.                 case (Opcode)
  152.                     //ADD
  153.                     4'b0001 :
  154.                         Next_state = S_01;
  155.                     //AND
  156.                     4'b0101 :
  157.                         Next_state = S_05;
  158.                     //NOT
  159.                     4'b1001 :
  160.                         Next_state = S_09;
  161.                     //LDR
  162.                     4'b0110 :
  163.                         Next_state = S_06;
  164.                     //STR
  165.                     4'b0111 :
  166.                         Next_state = S_07;
  167.                     //JSR
  168.                     4'b0100 :
  169.                         Next_state = S_04;
  170.                     //JMP
  171.                     4'b1100 :
  172.                         Next_state = S_12;
  173.                     //BR
  174.                     4'b0000 :
  175.                         Next_state = S_00;
  176.                     4'b1101 :
  177.                         Next_state = PauseIR1;
  178.                     default :
  179.                         Next_state = S_18;
  180.                 endcase
  181.             S_01 :
  182.                 Next_state = S_18;
  183.             S_05 :
  184.                 Next_state = S_18;
  185.             S_09 :
  186.                 Next_state = S_18;
  187.             S_06 :
  188.                 Next_state = S_25;
  189.             S_25 :
  190.                 Next_state = S_25_2;
  191.             S_25_2 :
  192.                 Next_state = S_27;
  193.             S_27 :
  194.                 Next_state = S_18;
  195.             S_07 :
  196.                 Next_state = S_23;
  197.             S_23 :
  198.                 Next_state = S_16;
  199.             S_16 :
  200.                 Next_state = S_16_2;
  201.             S_16_2 :
  202.                 Next_state = S_18;
  203.             S_04 :
  204.                 Next_state = S_21;
  205.             S_21 :
  206.                 Next_state = S_18;
  207.             S_12 :
  208.                 Next_state = S_18;
  209.             S_00 :
  210.                 if(BEN)
  211.                     Next_state = S_22;
  212.                 else
  213.                     Next_state = S_18;
  214.             S_22 :
  215.                 Next_state = S_18;
  216.             // You need to finish the rest of states.....(should be done for now)
  217.  
  218.             default : ;
  219.  
  220.         endcase
  221.        
  222.         // Assign control signals based on current state
  223.         case (State)
  224.             Halted: ;
  225.             S_18 :
  226.                 begin
  227.                     GatePC = 1'b1;
  228.                     LD_MAR = 1'b1;
  229.                     PCMUX = 2'b00;
  230.                     LD_PC = 1'b1;
  231.                 end
  232.             S_33_1 :
  233.                 Mem_OE = 1'b0;
  234.             S_33_2 :
  235.                 begin
  236.                     Mem_OE = 1'b0;
  237.                     LD_MDR = 1'b1;
  238.                 end
  239.             S_35 :
  240.                 begin
  241.                     GateMDR = 1'b1;
  242.                     LD_IR = 1'b1;
  243.                 end
  244.             PauseIR1:
  245.                 LD_LED = 1'b1;
  246.             PauseIR2: ;
  247.                 //LD_LED = 1'b1;
  248.                 //i don't THINK the led's should be on here. but take this with a grain of salt.
  249.             S_32 :
  250.                 LD_BEN = 1'b1;
  251.             S_01 :
  252.                 begin
  253.                     //ADD
  254.                     SR2MUX = IR_5;
  255.                     ALUK = 2'b00;
  256.                     GateALU = 1'b1;
  257.                     LD_REG = 1'b1;
  258.                     DRMUX = 1'b0;
  259.                     SR1MUX = 1'b1;
  260.                     LD_CC = 1'b1;
  261.                     // might be done
  262.                 end
  263.             S_05 :
  264.                 begin
  265.                     //AND
  266.                     SR2MUX = IR_5;
  267.                     ALUK = 2'b01;
  268.                     GateALU = 1'b1;
  269.                     LD_REG = 1'b1;
  270.                     DRMUX = 1'b0;
  271.                     SR1MUX = 1'b1;
  272.                     LD_CC = 1'b1;
  273.                 end
  274.             S_09 :
  275.                 begin
  276.                     //NOT
  277.                     SR2MUX = IR_5; //this doesn't actually matter here
  278.                     ALUK = 2'b10;
  279.                     GateALU = 1'b1;
  280.                     LD_REG = 1'b1;
  281.                     DRMUX = 1'b0;
  282.                     SR1MUX = 1'b1;
  283.                     LD_CC = 1'b1;
  284.                 end
  285.             S_06 :
  286.                 begin
  287.                     //LDR
  288.                     //DRMUX = 1'b0;
  289.                     //LD_REG = 1'b0;
  290.                     SR1MUX = 1'b1;
  291.                     ADDR1MUX = 1'b1;
  292.                     ADDR2MUX = 2'b01;
  293.                     GateMARMUX = 1'b1;
  294.                     LD_MAR = 1'b1;
  295.                 end
  296.             S_25 :
  297.                 Mem_OE = 1'b0;
  298.             S_25_2 :
  299.                 begin
  300.                     Mem_OE = 1'b0;
  301.                     LD_MDR = 1'b1;
  302.                 end
  303.             S_27 :
  304.                 begin
  305.                     GateMDR = 1'b1;
  306.                     LD_REG = 1'b1;
  307.                     LD_CC = 1'b1;
  308.                 end
  309.             S_07 :
  310.                 begin
  311.                     //STR
  312.                     //DRMUX = 1'b0;
  313.                     //LD_REG = 1'b0;
  314.                     SR1MUX = 1'b1;
  315.                     ADDR1MUX = 1'b1;
  316.                     ADDR2MUX = 2'b01;
  317.                     GateMARMUX = 1'b1;
  318.                     LD_MAR = 1'b1;
  319.                 end
  320.             S_23 :
  321.                 begin
  322.                     //LD_MAR = 1'b0;
  323.                     LD_MDR = 1'b1;
  324.                     Mem_OE = 1'b1;
  325.                     SR1MUX = 1'b0;
  326.                     GateALU = 1'b1;
  327.                     ALUK = 2'b11;
  328.                 end
  329.             S_16 :
  330.                 Mem_WE = 1'b0;
  331.             S_16_2 :
  332.                 Mem_WE = 1'b0;
  333.             S_04 :
  334.                 begin
  335.                     //JSR
  336.                     GatePC = 1'b1;
  337.                     DRMUX = IR_11;
  338.                     LD_REG = 1'b1;
  339.                 end
  340.             S_21 :
  341.                 begin
  342.                     ADDR2MUX = 2'b11;
  343.                     ADDR1MUX = 1'b0;
  344.                     PCMUX = 2'b10;
  345.                     LD_PC = 1'b1;
  346.                 end
  347.             S_12 :
  348.                 begin
  349.                     //JMP
  350.                     SR1MUX = 1'b1;
  351.                     PCMUX = 2'b01;
  352.                     LD_PC = 1'b1;
  353.                     ALUK = 2'b11;
  354.                     GateALU = 1'b1;
  355.                 end
  356.             S_00 : ;
  357.                 //BEN
  358.             S_22:
  359.                 begin
  360.                     PCMUX = 2'b10;
  361.                     ADDR1MUX = 1'b0;
  362.                     ADDR2MUX = 2'b10;
  363.                     LD_PC = 1'b1;
  364.                 end
  365.                    
  366.             // We might be done...
  367.  
  368.             default : ;
  369.         endcase
  370.     end
  371.  
  372.      // These should always be active
  373.     assign Mem_CE = 1'b0;
  374.     assign Mem_UB = 1'b0;
  375.     assign Mem_LB = 1'b0;
  376.    
  377. endmodule
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement