使用Case语句和流程声明的VHDL语法错误

时间:2014-03-02 23:26:37

标签: syntax-error vhdl computer-architecture

我正在尝试使用VHDL中的精简指令集建模控制单元。我一直在编译以确保代码仍然可以编译,但是在某个地方,我一定做错了。在充实了许多指令的解码状态后,我开始收到以下错误集。

  

错误(10500):controlunit.vhd(164)的VHDL语法错误接近文本“when”;期待“结束”,或“(”或标识符(“when”是保留关键字)或顺序语句

     

错误(10500):controlunit.vhd(176)的VHDL语法错误接近文本“when”;期待“结束”,或“(”或标识符(“when”是保留关键字)或顺序语句

     

错误(10500):controlunit.vhd(183)的VHDL语法错误接近文本“when”;期待“结束”,或“(”或标识符(“when”是保留关键字)或顺序语句

     

错误(10500):controlunit.vhd(190)附近文本“case”的VHDL语法错误;期待“如果”

     

错误(10500):controlunit.vhd(195)处文本“Begin”附近的VHDL语法错误;期待“:=”或“< =”

     

错误(10500):在文本“process”附近的controlunit.vhd(203)处的VHDL语法错误;期待“如果”

     

错误(10500):controlunit.vhd(204)处的VHDL语法错误接近文本“behavior”;期待“如果”

通常情况下,这些类型的错误都在我修复的能力范围内,但我已经多次查看了我的代码,据我所知,所有的进程块和case语句都是正确定义的。 / p>

我担心,因为我对VHDL很新,我可能会遗漏一些我从未发现过的语法细微之处。任何VHDL专家都能帮我隔离代码中的问题吗?谢谢!

您可以在下面的代码块中找到我的代码。

library IEEE;
use IEEE.STD_LOGIC_1164.all;
use IEEE.STD_LOGIC_UNSIGNED.all;

entity ControlUnit is
 port(
    clk: IN  std_logic; 
    Mem_rd: OUT  std_logic  :='1';      --signal to read from RAM/ROM
    Mem_wr: OUT  std_logic  :='1';      --signal to write RAM
    Mem_cs: OUT std_logic :='1';        --signal to select either RAM or ROM 
    Z: IN std_logic;                    --zero signal from ALU
    N: IN std_logic;                    --negative signal from ALU
    R_we: OUT std_logic;                --read/write enable signal to register file
    ld_op: OUT std_logic;               --bus control signal for memory load operations
    st_op: OUT std_logic;               --bus control signal for memory read operations
    ctl_wd: OUT std_logic_vector(14 downto 0);          --processor control word
    const_out: OUT  std_logic_vector(15 downto 0);      --constant value from instruction
    CU_addr_bus: INOUT  std_logic_vector(15 downto 0);  --processor address bus connection
    CU_data_bus: INOUT  std_logic_vector(15 downto 0);  --processor data bus connection
    run: IN std_logic;                  --signal allowing processor to execute its program
    rst: IN  std_logic                  --system reset signal
     );
end ControlUnit;


architecture Behavior of ControlUnit is
-- Control Unit states for multi-cycle instruction execution
type states is (Reset, Fetch, Decode, Execute, WB);
signal CurrState, NextState : states;

-- Instruction set types
type ops is (nop, subx, orx, jmp, addx, andx, notx, srlx, sllx, ld, st, hlt, ret, addi, ba, bn, bz, sethi, call);
signal CurrOp, NextOp : ops;

-- Internal signal declarations
signal CurrPC, CurrSP, CurrIR, CurrDisp : std_logic_vector(15 downto 0);
signal NextPC, NextSP, NextIR, NextDisp : std_logic_vector(15 downto 0);
signal PCaEN, SPEN, PCdEN : std_logic;
signal currStatus, nextStatus : std_logic_vector(1 downto 0); --N & Z

begin
-- tri-state enables:
addr_bus <= CurrPC when PCaEN='1' else     
                CurrSP when SPEN='1' else 
                (others=>'Z');
data_bus <= CurrPC when PCdEN='1' else       
                (others => 'Z');

CombLogic : process(CurrState, run, CurrPC, CurrSP, CurrIR, CurrOp, data_bus)
    begin
    case CurrState is
        when Reset =>           -------------------------RESET-------------------------
            NextPC <= x"0080"; NextSP <= x"04FE"; 
            NextIR <= x"0000"; NextOp <= nop;
            NextStatus <= "00"; NextDisp <= x"0000";
            PCaEN <= '1'; SPEN <= '0'; PCdEN <= '0';      -- setup     fetch
            mem_cs <= '0'; mem_rd <= '0'; mem_wr <= '1';  -- active low; setup fetch
            if run = '0' then NextState <= Reset;         -- active low run
            else NextState <= Fetch; 
            end if;

        when Fetch =>   -------------------------FETCH-------------------------
            NextPC <= currPC; NextSP <= currSP; 
            NextIR <= data_bus; NextOp <= currOP;
            PCaEN <= '1'; SPEN <= '0'; PCdEN <= '0';      
            mem_cs <= '0'; mem_rd <= '0'; mem_wr <= '1';  -- active low
            R_we <= '0'; ctl_wd <= (others => '0'); const_out <= x"FFFF";
            NextState <= Decode;

        when Decode =>  ------------------------DECODE-------------------------
            --fill in decode logic
            if currIR(15) = '1' then NextOp <= call;
                NextPC <= CurrPC+1; NextSP <= CurrSP; NextIR <= CurrIR; nextStatus <= currStatus; nextDisp <= currDisp;
                PCaEN <= '0'; SPEN <= '0'; PCdEN <= '0';   -- store CurrPC to M[SP]
                mem_cs <= '1'; mem_rd <= '1'; mem_wr <= '1';
                R_we <= '0'; ctl_wd <= "0000"; const_out <= x"0000";
            else if currIR(14) = '1' then
                case currOP(10 downto 8) is
                    when "000" => NextOP <= hlt;   --set signals for hlt
                    when "001" => NextOP <= ret;   --set signals for ret
                    when "011" => NextOP <= addi;  --set signals for addi
                    when "100" => NextOP <= ba;    --set signals for ba
                    when "101" => NextOP <= bn;    --set signals for bn
                    when "110" => NextOP <= bz;    --set signals for bz
                    when "111" => NextOP <= sethi; --set signals for sethi
                end case;
            else
                case currOP(10 downto 7) is
                    when "1010" => NextOP <= nop; --set signals for nop
                        NextPC <= CurrPC; NextSP <= CurrSP; NextIR <= CurrIR; nextStatus <= currStatus; nextDisp <= currDisp;
                        PCaEN <= '0'; SPEN <= '0'; PCdEN <= '0';
                        mem_cs <= '1'; mem_rd <= '1'; mem_wr <= '1';
                        R_we <= '0'; ctl_wd <= x"0000"; const_out <= x"0000";
                    when "1001" => NextOP <= subx; --set signals for subx
                        NextPC <= CurrPC; NextSP <= CurrSP; NextIR <= CurrIR; nextStatus <= currStatus; nextDisp <= currDisp;
                        PCaEN <= '0'; SPEN <= '0'; PCdEN <= '0';
                        mem_cs <= '1'; mem_rd <= '1'; mem_wr <= '1';
                        R_we <= '1'; ctl_wd <= currOP(14 downto 0)&'0'; const_out <= x"0000";
                    when "1000" => NextOP <= orx; --set signals for orx
                        NextPC <= CurrPC; NextSP <= CurrSP; NextIR <= CurrIR; nextStatus <= currStatus; nextDisp <= currDisp;
                        PCaEN <= '0'; SPEN <= '0'; PCdEN <= '0';
                        mem_cs <= '1'; mem_rd <= '1'; mem_wr <= '1';
                        R_we <= '1'; ctl_wd <= currOP(14 downto 0)&'0'; const_out <= x"0000";
                    when "0111" => NextOP <= jmp; --set signals for jmp
                        NextPC <= CurrPCL; NextSP <= CurrSP; NextIR <= CurrIR; nextStatus <= currStatus; nextDisp <= currDisp;
                        PCaEN <= '0'; SPEN <= '0'; PCdEN <= '0';
                        mem_cs <= '1'; mem_rd <= '1'; mem_wr <= '1';
                        R_we <= '0'; ctl_wd <= currOP(14 downto 0)&'0'; const_out <= x"0000";
                    when "0110" => NextOP <= addx; --set signals for addx
                        NextPC <= CurrPC; NextSP <= CurrSP; NextIR <= CurrIR; nextStatus <= currStatus; nextDisp <= currDisp;
                        PCaEN <= '0'; SPEN <= '0'; PCdEN <= '0';
                        mem_cs <= '1'; mem_rd <= '1'; mem_wr <= '1';
                        R_we <= '1'; ctl_wd <= currOP(14 downto 0)&'0'; const_out <= x"0000";
                    when "0101" => NextOP <= andx; --set signals for andx
                        NextPC <= CurrPC; NextSP <= CurrSP; NextIR <= CurrIR; nextStatus <= currStatus; nextDisp <= currDisp;
                        PCaEN <= '0'; SPEN <= '0'; PCdEN <= '0';
                        mem_cs <= '1'; mem_rd <= '1'; mem_wr <= '1';
                        R_we <= '1'; ctl_wd <= currOP(14 downto 0)&'0'; const_out <= x"0000";
                    when "0100" => NextOP <= notx; --set signals for notx
                        NextPC <= CurrPC; NextSP <= CurrSP; NextIR <= CurrIR; nextStatus <= currStatus; nextDisp <= currDisp;
                        PCaEN <= '0'; SPEN <= '0'; PCdEN <= '0';
                        mem_cs <= '1'; mem_rd <= '1'; mem_wr <= '1';
                        R_we <= '1'; ctl_wd <= currOP(14 downto 0)&'0'; const_out <= x"0000";
                    when "0011" => NextOP <= srlx; --set signals for srlx
                        NextPC <= CurrPC; NextSP <= CurrSP; NextIR <= CurrIR; nextStatus <= currStatus; nextDisp <= currDisp;
                        PCaEN <= '0'; SPEN <= '0'; PCdEN <= '0';
                        mem_cs <= '1'; mem_rd <= '1'; mem_wr <= '1';
                        R_we <= '1'; ctl_wd <= currOP(14 downto 0)&'0'; const_out <= x"0000";
                    when "0010" => NextOP <= sllx; --set signals for sllx
                        NextPC <= CurrPC; NextSP <= CurrSP; NextIR <= CurrIR; nextStatus <= currStatus; nextDisp <= currDisp;
                        PCaEN <= '0'; SPEN <= '0'; PCdEN <= '0';
                        mem_cs <= '1'; mem_rd <= '1'; mem_wr <= '1';
                        R_we <= '1'; ctl_wd <= currOP(14 downto 0)&'0'; const_out <= x"0000";
                    when "0001" => NextOP <= ld;   --set signals for ld
                        NextPC <= CurrPC; NextSP <= CurrSP; NextIR <= CurrIR; nextStatus <= currStatus; nextDisp <= currDisp;
                        PCaEN <= '0'; SPEN <= '0'; PCdEN <= '0';
                        mem_cs <= '0'; mem_rd <= '0'; mem_wr <= '1';
                        R_we <= '1'; ctl_wd <= currOP(14 downto 0)&'0'; const_out <= x"0000";
                    when "0000" => NextOP <= st;   --set signals for st
                        NextPC <= CurrPC; NextSP <= CurrSP; NextIR <= CurrIR; nextStatus <= currStatus; nextDisp <= currDisp;
                        PCaEN <= '0'; SPEN <= '0'; PCdEN <= '0';
                        mem_cs <= '0'; mem_rd <= '1'; mem_wr <= '0';
                        R_we <= '0'; ctl_wd <= currOP(14 downto 0)&'0'; const_out <= x"0000";
                end case;
            end if;
            NextState <= Execute;


        when Execute => -------------------------EXECUTE-------------------------
            case CurrOp is
                when call => --call
                    NextPC <= CurrPC+1; NextSP <= CurrSP; NextIR <= CurrIR; nextStatus <= currStatus; nextDisp <= currDisp;
                    PCaEN <= '0'; SPEN <= '1'; PCdEN <= '1';   -- store CurrPC to M[SP]
                    mem_cs <= '0'; mem_rd <= '1'; mem_wr <= '0';
                    R_we <= '0'; ctl_wd <= "0000"; const_out <= x"0000";
            --for bn and bz, execution of operation is dependent on signals N and Z
                when others => null;
            end case;
            NextState <= WB;

        when WB =>      -------------------------WB-------------------------
            NextPC <= '0'&currIR(6 downto 0); NextSP <= CurrSP - 1; NextIR <= CurrIR; NextOp <= CurrOp;
            PCaEN <= '0'; SPEN <= '0'; PCdEN <= '0';      -- setup fetch
            mem_cs <= '1'; mem_rd <= '1'; mem_wr <= '1';  -- active low; setup fetch
            R_we <= '0'; ctl_wd <= "0000"; const_out <= x"0000";
            NextState <= Fetch;

        when others =>  -------------------------OTHERS-------------------------
            -- Should never be in this state!
            NextPC <= x"00"; NextSP <= x"00"; NextIR <= x"00"; NextOp <= call;
            PCaEN <= '0'; SPEN <= '0'; PCdEN <= '0';      
            mem_cs <= '1'; mem_rd <= '1'; mem_wr <= '1';  -- active low
            R_we <= '0'; ctl_wd <= "00"; const_out <= x"FF";    
            NextState <= Reset;
    end case;
end process;

-- Sequential Logic (asynchronous reset; registers update at positive-edge clock)  
Regs : process(clk,rst)
Begin
    if rst = '0' then CurrState <= Reset;  -- Active Low Reset
        CurrOp <= sethi; CurrPC <= x"80"; CurrSP <= x"FF"; CurrIR <= (others=>'0');
        CurrStatus <= "00";
    elsif (rising_edge(clk)) then CurrState <= NextState; 
        CurrOp <= NextOp; CurrPC <= NextPC; CurrSP <= NextSP; CurrIR <= NextIR; 
        CurrStatus <= NextStatus;
    end if;
end process Regs;
end behavior;

1 个答案:

答案 0 :(得分:1)

-- Instruction set types
type ops is (nop, subx, orx, jmp, addx, andx, notx, srlx, sllx, ld, st, hlt, ret, addi, ba, bn, bz, sethi, call);
signal CurrOp, NextOp : ops;

例如CurrOp是枚举类型,其值显示为ops枚举。但你有CurrOp

的片段
case currOP(10 downto 8) is

case currOP(10 downto 7) is  

case语句的when表达式分别是字符串文字,长度为3或4。

因此,CurrOp不是一种数组类型,你不能将其切片并将其与字符串进行比较。

现在为什么分析到目前为止还没有告诉你这是有趣的。表达式在精化时间而不是分析时间进行评估,与信号分配的目标不同:

library ieee;
use ieee.std_logic_1164.all;

entity foo is
end entity;

architecture fum of foo is
    -- Instruction set types
    type ops is (nop, subx, orx, jmp, addx, andx, notx, srlx, sllx, ld, st, hlt, ret, addi, ba, bn, bz, sethi, call);
    signal CurrOp, NextOp: ops;

begin
    CurrOp(10 downto 7) <= "1001";
    NextOp(10 downto 8) <= "011";

end architecture;
  

ghdl -a foo.vhdl   foo.vhdl:13:11:前缀的类型不是数组
  foo.vhdl:14:11:前缀的类型不是数组
  ghdl:编译错误

( - a是ghdl分析命令)

有效地,选择只能是操作枚举值。为了让它更可口,你可以选择:

  

choices :: = choice {|选择}

您还可以在案例陈述之前为选择中的所有信号分配默认值,然后在每个案例陈述备选中仅分配具有不同值的那些信号。在相同的模拟增量中,仅调度最后一个分配(只有一个未来事件)。

除了过多的错误之外,阻止进一步分析的主要因素是else if其中和`其他是合适的。

在发现问题时发现很多错误或错误,您需要将它们与文件中相同的语法位置进行比较:

library IEEE;
use IEEE.STD_LOGIC_1164.all;
-- use IEEE.STD_LOGIC_UNSIGNED.all;
use ieee.numeric_std.all;

entity ControlUnit is
 port(
    clk: IN  std_logic; 
    Mem_rd: OUT  std_logic  :='1';      --signal to read from RAM/ROM
    Mem_wr: OUT  std_logic  :='1';      --signal to write RAM
    Mem_cs: OUT std_logic :='1';        --signal to select either RAM or ROM 
    Z: IN std_logic;                    --zero signal from ALU
    N: IN std_logic;                    --negative signal from ALU
    R_we: OUT std_logic;                --read/write enable signal to register file
    ld_op: OUT std_logic;               --bus control signal for memory load operations
    st_op: OUT std_logic;               --bus control signal for memory read operations
    ctl_wd: OUT std_logic_vector(14 downto 0);          --processor control word
    const_out: OUT  std_logic_vector(15 downto 0);      --constant value from instruction
    CU_addr_bus: INOUT  std_logic_vector(15 downto 0);  --processor address bus connection
    CU_data_bus: INOUT  std_logic_vector(15 downto 0);  --processor data bus connection
    run: IN std_logic;                  --signal allowing processor to execute its program
    rst: IN  std_logic                  --system reset signal
     );
end ControlUnit;


architecture Behavior of ControlUnit is
    -- Control Unit states for multi-cycle instruction execution
    type states is (Reset, Fetch, Decode, Execute, WB);
    signal CurrState, NextState : states;

    -- Instruction set types
    type ops is (nop, subx, orx, jmp, addx, andx, notx, srlx, sllx, ld, st, hlt, ret, addi, ba, bn, bz, sethi, call);
    signal CurrOp, NextOp : ops;

    -- Internal signal declarations
    signal CurrPC, CurrSP, CurrIR, CurrDisp : std_logic_vector(15 downto 0);
    signal NextPC, NextSP, NextIR, NextDisp : std_logic_vector(15 downto 0);
    signal PCaEN, SPEN, PCdEN : std_logic;
    signal currStatus, nextStatus : std_logic_vector(1 downto 0); --N & Z

begin
-- tri-state enables:
CU_addr_bus <= CurrPC when PCaEN='1' else     
                CurrSP when SPEN='1' else 
                (others=>'Z');
CU_data_bus <= CurrPC when PCdEN='1' else       
                (others => 'Z');

CombLogic : process(CurrState, run, CurrPC, CurrSP, CurrIR, CurrOp, CU_data_bus)
    begin
    case CurrState is
        when Reset =>           -------------------------RESET-------------------------
            NextPC <= x"0080"; 
            NextSP <= x"04FE"; 
            NextIR <= x"0000"; 
            NextOp <= nop;
            NextStatus <= "00"; 
            NextDisp <= x"0000";
            PCaEN <= '1'; 
            SPEN <= '0'; 
            PCdEN <= '0';      -- setup     fetch
            mem_cs <= '0'; 
            mem_rd <= '0';
            mem_wr <= '1';  -- active low; setup fetch
            if run = '0' then NextState <= Reset;         -- active low run
                else NextState <= Fetch; 
            end if;

        when Fetch =>   -------------------------FETCH-------------------------
            NextPC <= currPC; 
            NextSP <= currSP; 
            NextIR <= CU_data_bus; 
            NextOp <= currOP;
            PCaEN <= '1'; 
            SPEN <= '0'; 
            PCdEN <= '0';      
            mem_cs <= '0'; 
            mem_rd <= '0'; 
            mem_wr <= '1';  -- active low
            R_we <= '0'; 
            ctl_wd <= (others => '0'); 
            const_out <= x"FFFF";
            NextState <= Decode;

        when Decode =>  ------------------------DECODE-------------------------
            --fill in decode logic
            if currIR(15) = '1' then 
                NextOp <= call;
                NextPC <= std_logic_vector (unsigned(CurrPC) + 1); 
                NextSP <= CurrSP; 
                NextIR <= CurrIR; 
                nextStatus <= currStatus; 
                nextDisp <= currDisp;
                PCaEN <= '0'; 
                SPEN <= '0'; 
                PCdEN <= '0';   -- store CurrPC to M[SP]
                mem_cs <= '1'; 
                mem_rd <= '1'; 
                mem_wr <= '1';
                R_we <= '0'; 
                ctl_wd <= (others => '0'); 
                const_out <= x"0000";
            elsif currIR(14) = '1' then
                case currIR(10 downto 8) is
                    when "000" => NextOP <= hlt;   --set signals for hlt
                    when "001" => NextOP <= ret;   --set signals for ret
                    when "011" => NextOP <= addi;  --set signals for addi
                    when "100" => NextOP <= ba;    --set signals for ba
                    when "101" => NextOP <= bn;    --set signals for bn
                    when "110" => NextOP <= bz;    --set signals for bz
                    when "111" => NextOP <= sethi; --set signals for sethi
                    when others => NextOp <= nop;
                end case;
            else
                case currIR(10 downto 7) is
                    when "1010" => 
                        NextOP <= nop; --set signals for nop
                        NextPC <= CurrPC; 
                        NextSP <= CurrSP; 
                        NextIR <= CurrIR; 
                        nextStatus <= currStatus; 
                        nextDisp <= currDisp;
                        PCaEN <= '0'; 
                        SPEN <= '0'; 
                        PCdEN <= '0';
                        mem_cs <= '1'; 
                        mem_rd <= '1';
                         mem_wr <= '1';
                        R_we <= '0'; 
                        ctl_wd <= (others => '0'); 
                        const_out <= x"0000";
                    when "1001" => 
                        NextOP <= subx; --set signals for subx
                        NextPC <= CurrPC;
                        NextSP <= CurrSP; 
                        NextIR <= CurrIR; 
                        nextStatus <= currStatus; 
                        nextDisp <= currDisp;
                        PCaEN <= '0'; 
                        SPEN <= '0'; 
                        PCdEN <= '0';
                        mem_cs <= '1'; 
                        mem_rd <= '1'; 
                        mem_wr <= '1';
                        R_we <= '1'; 
                        ctl_wd <= currIR(14 downto 0) & '0'; 
                        const_out <= x"0000";
                    when "1000" => 
                        NextOP <= orx; --set signals for orx
                        NextPC <= CurrPC; 
                        NextSP <= CurrSP; 
                        NextIR <= CurrIR; 
                        nextStatus <= currStatus; 
                        nextDisp <= currDisp;
                        PCaEN <= '0'; 
                        SPEN <= '0'; 
                        PCdEN <= '0';
                        mem_cs <= '1'; 
                        mem_rd <= '1'; 
                        mem_wr <= '1';
                        R_we <= '1'; 
                        ctl_wd <= currIR(14 downto 0) & '0'; 
                        const_out <= x"0000";
                    when "0111" => 
                        NextOP <= jmp; --set signals for jmp
                        NextPC <= CurrPC; 
                        NextSP <= CurrSP; 
                        NextIR <= CurrIR; 
                        nextStatus <= currStatus; 
                        nextDisp <= currDisp;
                        PCaEN <= '0'; 
                        SPEN <= '0'; 
                        PCdEN <= '0';
                        mem_cs <= '1'; 
                        mem_rd <= '1'; 
                        mem_wr <= '1';
                        R_we <= '0'; 
                        ctl_wd <= currIR(14 downto 0) & '0'; 
                        const_out <= x"0000";
                    when "0110" => 
                        NextOP <= addx; --set signals for addx
                        NextPC <= CurrPC; 
                        NextSP <= CurrSP; 
                        NextIR <= CurrIR; 
                        nextStatus <= currStatus; 
                        nextDisp <= currDisp;
                        PCaEN <= '0'; 
                        SPEN <= '0'; 
                        PCdEN <= '0';
                        mem_cs <= '1'; 
                        mem_rd <= '1'; 
                        mem_wr <= '1';
                        R_we <= '1'; 
                        ctl_wd <= currIR(14 downto 0) & '0'; 
                        const_out <= x"0000";
                    when "0101" => 
                        NextOP <= andx; --set signals for andx
                        NextPC <= CurrPC; 
                        NextSP <= CurrSP; 
                        NextIR <= CurrIR; 
                        nextStatus <= currStatus; 
                        nextDisp <= currDisp;
                        PCaEN <= '0'; 
                        SPEN <= '0'; 
                        PCdEN <= '0';
                        mem_cs <= '1'; 
                        mem_rd <= '1'; 
                        mem_wr <= '1';
                        R_we <= '1'; 
                        ctl_wd <= currIR(14 downto 0) & '0'; 
                        const_out <= x"0000";
                    when "0100" => 
                        NextOP <= notx; --set signals for notx
                        NextPC <= CurrPC; 
                        NextSP <= CurrSP; 
                        NextIR <= CurrIR; 
                        nextStatus <= currStatus; 
                        nextDisp <= currDisp;
                        PCaEN <= '0'; 
                        SPEN <= '0'; 
                        PCdEN <= '0';
                        mem_cs <= '1'; 
                        mem_rd <= '1'; 
                        mem_wr <= '1';
                        R_we <= '1'; 
                        ctl_wd <= currIR(14 downto 0) & '0'; 
                        const_out <= x"0000";
                    when "0011" => 
                        NextOP <= srlx; --set signals for srlx
                        NextPC <= CurrPC; 
                        NextSP <= CurrSP; 
                        NextIR <= CurrIR; 
                        nextStatus <= currStatus; 
                        nextDisp <= currDisp;
                        PCaEN <= '0'; 
                        SPEN <= '0'; 
                        PCdEN <= '0';
                        mem_cs <= '1'; 
                        mem_rd <= '1'; 
                        mem_wr <= '1';
                        R_we <= '1'; 
                        ctl_wd <= currIR(14 downto 0) & '0'; 
                        const_out <= x"0000";
                    when "0010" => 
                        NextOP <= sllx; --set signals for sllx
                        NextPC <= CurrPC; 
                        NextSP <= CurrSP; 
                        NextIR <= CurrIR; 
                        nextStatus <= currStatus; 
                        nextDisp <= currDisp;
                        PCaEN <= '0'; 
                        SPEN <= '0'; 
                        PCdEN <= '0';
                        mem_cs <= '1'; 
                        mem_rd <= '1';
                         mem_wr <= '1';
                        R_we <= '1'; 
                        ctl_wd <= currIR(14 downto 0) & '0'; 
                        const_out <= x"0000";
                    when "0001" => 
                        NextOP <= ld;   --set signals for ld
                        NextPC <= CurrPC; 
                        NextSP <= CurrSP; 
                        NextIR <= CurrIR; 
                        nextStatus <= currStatus; 
                        nextDisp <= currDisp;
                        PCaEN <= '0'; 
                        SPEN <= '0'; 
                        PCdEN <= '0';
                        mem_cs <= '0'; 
                        mem_rd <= '0'; 
                        mem_wr <= '1';
                        R_we <= '1'; 
                        ctl_wd <= currIR(14 downto 0)&'0'; 
                        const_out <= x"0000";
                    when "0000" => 
                        NextOP <= st;   --set signals for st
                        NextPC <= CurrPC; 
                        NextSP <= CurrSP; 
                        NextIR <= CurrIR; 
                        nextStatus <= currStatus; 
                        nextDisp <= currDisp;
                        PCaEN <= '0'; 
                        SPEN <= '0'; 
                        PCdEN <= '0';
                        mem_cs <= '0'; 
                        mem_rd <= '1'; 
                        mem_wr <= '0';
                        R_we <= '0'; 
                        ctl_wd <= currIR(14 downto 0) & '0';
                        const_out <= x"0000";
                    when others =>
                        NextOP <= nop; --set signals for nop
                        NextPC <= CurrPC; 
                        NextSP <= CurrSP; 
                        NextIR <= CurrIR; 
                        nextStatus <= currStatus; 
                        nextDisp <= currDisp;
                        PCaEN <= '0'; 
                        SPEN <= '0'; 
                        PCdEN <= '0';
                        mem_cs <= '1'; 
                        mem_rd <= '1';
                         mem_wr <= '1';
                        R_we <= '0'; 
                        ctl_wd <= (others => '0'); 
                        const_out <= x"0000";
                end case;
            end if;

            NextState <= Execute;

        when Execute => -------------------------EXECUTE-------------------------
            case CurrOp is
                when call => --call
                    NextPC <= std_logic_vector( unsigned (CurrPC) + 1); 
                    NextSP <= CurrSP; 
                    NextIR <= CurrIR; 
                    nextStatus <= currStatus; 
                    nextDisp <= currDisp;
                    PCaEN <= '0'; 
                    SPEN <= '1'; 
                    PCdEN <= '1';   -- store CurrPC to M[SP]
                    mem_cs <= '0'; 
                    mem_rd <= '1'; 
                    mem_wr <= '0';
                    R_we <= '0'; 
                    ctl_wd <= (others => '0'); 
                    const_out <= x"0000";
            --for bn and bz, execution of operation is dependent on signals N and Z
                when others => null;
            end case;
            NextState <= WB;

        when WB =>      -------------------------WB-------------------------
            NextPC <= '0' & currIR(6 downto 0); 
            NextSP <= std_logic_vector(unsigned(CurrSP) - 1); 
            NextIR <= CurrIR; 
            NextOp <= CurrOp;
            PCaEN <= '0'; 
            SPEN <= '0'; 
            PCdEN <= '0';      -- setup fetch
            mem_cs <= '1'; 
            mem_rd <= '1'; 
            mem_wr <= '1';  -- active low; setup fetch
            R_we <= '0'; 
            ctl_wd <=  (others => '0'); -- "0000"; 
            const_out <= x"0000";
            NextState <= Fetch;

        -- when others =>  -------------------------OTHERS-------------------------
        --     -- Should never be in this state!
        --     NextPC <= x"00"; NextSP <= x"00"; NextIR <= x"00"; NextOp <= call;
        --     PCaEN <= '0'; SPEN <= '0'; PCdEN <= '0';      
        --     mem_cs <= '1'; mem_rd <= '1'; mem_wr <= '1';  -- active low
        --     R_we <= '0'; ctl_wd <= "00"; const_out <= x"FF";    
        --     NextState <= Reset;
    end case;
end process;

-- Sequential Logic (asynchronous reset; registers update at positive-edge clock)  
Regs : process(clk,rst)
Begin
    if rst = '0' then CurrState <= Reset;  -- Active Low Reset
        CurrOp <= sethi; 
        CurrPC <= x"0080"; 
        CurrSP <= x"FFFE"; 
        CurrIR <= (others=>'0');
        CurrStatus <= "00";
    elsif (rising_edge(clk)) then CurrState <= NextState; 
        CurrOp <= NextOp; 
        CurrPC <= NextPC; 
        CurrSP <= NextSP; 
        CurrIR <= NextIR; 
        CurrStatus <= NextStatus;
    end if;
end process Regs;
end behavior;