Advertisement
Guest User

uc

a guest
May 21st, 2018
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
VHDL 7.38 KB | None | 0 0
  1. library IEEE;
  2. use IEEE.STD_LOGIC_1164.ALL;
  3. use IEEE.NUMERIC_STD.ALL;
  4.  
  5. entity uc is
  6. Port (
  7.     CLK : in STD_LOGIC;
  8.     RESET : in STD_LOGIC;
  9.     GPIO_0 : out STD_LOGIC_VECTOR(15 downto 0);
  10.     GPIO_1 : out STD_LOGIC_VECTOR(15 downto 0) );
  11. end entity;
  12.  
  13. architecture Behavioral of uc is
  14. type rom_t is array ( 0 to 255 ) of STD_LOGIC_VECTOR(15 downto 0);
  15. type ram_t is array ( 0 to 63 ) of STD_LOGIC_VECTOR(7 downto 0);
  16.  
  17. -- memory
  18. signal RAM : ram_t := (x"02", x"03", others => x"00");
  19. signal ROM : rom_t := (x"0100", x"0600", x"0102", x"0601",
  20.             x"0200", x"0801", x"0A01", x"0600",
  21.             x"0201", x"0A01", x"0601", x"0200",
  22.             x"1C0A", x"2300", x"2004", x"1E0E",
  23.             others=>x"0000");
  24. -- signals
  25.  
  26. signal C : STD_LOGIC := '0';
  27. signal Z : STD_LOGIC := '0';
  28. signal i : STD_LOGIC_VECTOR (15 downto 0) := (others => '0');
  29. signal a : STD_LOGIC_VECTOR( 7 downto 0 ) := (others => '0');
  30. signal o : STD_LOGIC_VECTOR( 7 downto 0 ) := (others => '0');
  31. signal ac : STD_LOGIC_VECTOR(15 downto 0) := (others => '1');
  32. signal ct : INTEGER := 0;
  33. signal adrt : STD_LOGIC_VECTOR ( 7 downto 0 ) := (others => '0');
  34. begin
  35.  
  36. -- INSTRUCTION DECODER
  37. process(CLK, RESET)
  38. variable ADDR : STD_LOGIC_VECTOR ( 7 downto 0 ) := (others => '0');
  39. variable CNT : INTEGER := 0;
  40. variable INSTR : STD_LOGIC_VECTOR ( 15 downto 0 ) := (others => '0');
  41. variable OPCODE : STD_LOGIC_VECTOR ( 7 downto 0 ) := (others => '0');
  42. variable ARG : STD_LOGIC_VECTOR ( 7 downto 0 ) := (others => '0');
  43. variable ACC : STD_LOGIC_VECTOR ( 15 downto 0 ) := (others => '1');
  44. variable TMP : STD_LOGIC_VECTOR(8 downto 0) := (others => '0');
  45. begin
  46.     if RESET = '1' then
  47.         GPIO_0 <= (others => '0');
  48.         GPIO_1 <= (others => '0');
  49.         CNT := 0;
  50.     elsif RISING_EDGE(CLK) then
  51.         INSTR := ROM(CNT);
  52.         OPCODE := INSTR(15 downto 8);
  53.         ARG := INSTR(7 downto 0);
  54.         if OPCODE = x"00" then  -- NOP
  55.             CNT := CNT + 1;
  56.         elsif OPCODE = x"01" then -- LOAD #ddd, ACC = ddd
  57.             ACC := x"00" & ARG;
  58.             CNT := CNT + 1;
  59.         elsif OPCODE = x"02" then -- LOAD aaa, ACC = RAM(aaa)
  60.             ADDR := ARG;
  61.             ACC := x"00" & RAM(TO_INTEGER(UNSIGNED(ADDR)));
  62.             CNT := CNT + 1;
  63.         elsif OPCODE = x"03" then -- LOADW aaa, ACC = RAM(aaa+1):RAM(aaa)
  64.         elsif OPCODE = x"04" then -- LOAD @aaa, ACC = RAM(RAM(aaa))
  65.         elsif OPCODE = x"05" then -- LOADW @aaa, ACC = RAM(RAM(aaa+1)):RAM(RAM(aaa))
  66.         elsif OPCODE = x"06" then -- STORE aaa, RAM(aaa) = ACC
  67.             RAM(TO_INTEGER(UNSIGNED(ARG))) <= ACC(7 downto 0);
  68.             CNT := CNT + 1;
  69.         elsif OPCODE = x"07" then -- STOREW aaa, RAM(aaa+1):RAM(aaa) = ACCH:ACCL
  70.         elsif OPCODE = x"08" then -- STORE @aaa, RAM(RAM(aaa)) = ACC
  71.             ADDR := RAM(TO_INTEGER(UNSIGNED(ARG)));
  72.             RAM(TO_INTEGER(UNSIGNED(ADDR))) <= ACC(7 downto 0);
  73.             CNT := CNT + 1;
  74.         elsif OPCODE = x"09" then -- STOREW @aaa, RAM(RAM(aaa+1)):RAM(RAM(aaa) = ACCH:ACCL
  75.         elsif OPCODE = x"0A" then -- ADD #ddd, ACC = ACC + ddd
  76.             TMP := STD_LOGIC_VECTOR(UNSIGNED('0' & ACC(7 downto 0)) + UNSIGNED(ARG));
  77.             C <= TMP(8);
  78.             ACC := x"00" & TMP(7 downto 0);
  79.             CNT := CNT + 1;
  80.         elsif OPCODE = x"0B" then -- ADD aaa, ACC = ACC + RAM(aaa);
  81.             ADDR := ARG;
  82.             TMP := STD_LOGIC_VECTOR(UNSIGNED('0' & ACC(7 downto 0)) + UNSIGNED(RAM(TO_INTEGER(UNSIGNED(ADDR)))));
  83.             C <= TMP(8);
  84.             ACC := x"00" & TMP(7 downto 0);
  85.             CNT := CNT + 1;
  86.         elsif OPCODE = x"0C" then -- ADDW aaa, ACC = ACC + RAM(aaa+1):RAM(aaa)
  87.         elsif OPCODE = x"0D" then -- SUB #ddd, ACC = ACC - ddd
  88.             if ACC(7 downto 0) >= ARG then
  89.                 TMP := STD_LOGIC_VECTOR(UNSIGNED('0' & ACC(7 downto 0)) + UNSIGNED(ARG));
  90.                 Z <= '0';              
  91.                 CNT := CNT + 1;
  92.             elsif ACC(7 downto 0) < ARG then
  93.                 TMP := STD_LOGIC_VECTOR(UNSIGNED('0' & ARG) - UNSIGNED(ACC(7 downto 0)));
  94.                 Z <= '1';              
  95.                 CNT := CNT + 1;
  96.             end if;
  97.         elsif OPCODE = x"0E" then -- SUB aaa, ACC = ACC - RAM(aaa)
  98.             ADDR := ARG;
  99.             if ACC(7 downto 0) >= RAM(TO_INTEGER(UNSIGNED(ADDR))) then
  100.                 TMP := STD_LOGIC_VECTOR(UNSIGNED('0' & ACC) - UNSIGNED(RAM(TO_INTEGER(UNSIGNED(ADDR)))));
  101.                 ACC := x"00" & TMP(7 downto 0);
  102.                 Z <= '0';
  103.                 CNT := CNT + 1;
  104.             elsif ACC(7 downto 0) < RAM(TO_INTEGER(UNSIGNED(ADDR))) then
  105.                 TMP := STD_LOGIC_VECTOR(UNSIGNED('0' & RAM(TO_INTEGER(UNSIGNED(ADDR)))) - UNSIGNED(ACC));
  106.                 ACC := x"00" & TMP(7 downto 0);
  107.                 CNT := CNT + 1;
  108.                 Z <= '1';
  109.             end if;
  110.         elsif OPCODE = x"0F" then -- SUBW aaa, ACC = ACC - RAM(aaa+1):RAM(aaa)
  111.         elsif OPCODE = x"10" then -- NOT ddd, ACC = not ddd
  112.             ACC := x"00" & not ARG;
  113.             CNT := CNT + 1;
  114.         elsif OPCODE = x"11" then -- NOT aaa, ACC = not RAM(aaa)
  115.             ADDR := ARG;
  116.             ACC := x"00" & not RAM(TO_INTEGER(UNSIGNED(ADDR)));
  117.             CNT := CNT + 1;
  118.         elsif OPCODE = x"12" then -- NOT @aaa, ACC = not RAM(RAM(aaa))
  119.         elsif OPCODE = x"13" then -- AND ddd, ACC = ACC and ddd
  120.             TMP := ACC(7 downto 0) and ARG;
  121.             ACC := x"00" & TMP(7 downto 0);
  122.             CNT := CNT + 1;
  123.         elsif OPCODE = x"14" then -- AND aaa, ACC = ACC and RAM(aaa)
  124.             ADDR := ARG;
  125.             TMP := ACC(7 downto 0) and RAM(TO_INTEGER(UNSIGNED(ADDR)));
  126.             ACC := x"00" & TMP( 7 downto 0 );
  127.             CNT := CNT + 1;
  128.         elsif OPCODE = x"15" then -- AND @aaa, ACC = ACC and RAM(RAM(aaa))
  129.         elsif OPCODE = x"16" then -- OR ddd, ACC = ACC or ddd
  130.             TMP := ACC(7 downto 0) or ARG;
  131.             ACC := x"00" & TMP(7 downto 0);
  132.             CNT := CNT + 1;
  133.         elsif OPCODE = x"17" then -- OR aaa, ACC = ACC or RAM(aaa)
  134.             ADDR := ARG;
  135.             TMP := ACC(7 downto 0) or RAM(TO_INTEGER(UNSIGNED(ADDR)));
  136.             ACC := x"00" & TMP(7 downto 0);
  137.             CNT := CNT + 1;
  138.         elsif OPCODE = x"18" then -- OR @aaa, ACC = ACC or RAM(RAM(aaa))
  139.         elsif OPCODE = x"19" then -- XOR ddd, ACC = ACC xor ddd
  140.             TMP := ACC(7 downto 0) xor ARG;
  141.             ACC := x"00" & TMP(7 downto 0);
  142.             CNT := CNT + 1;
  143.         elsif OPCODE = x"1A" then -- XOR aaa, ACC = ACC xor RAM(aaa)
  144.             ADDR := ARG;
  145.             TMP := ACC(7 downto 0) xor RAM(TO_INTEGER(UNSIGNED(ADDR)));
  146.             ACC := x"00" & TMP(7 downto 0);
  147.             CNT := CNT + 1;
  148.         elsif OPCODE = x"1B" then -- XOR @aaa, ACC = ACC xor RAM(RAM(aaa))
  149.         elsif OPCODE = x"1C" then -- CMP #ddd, if(ACC=ddd) Z=1 elsif(ACC<ddd) C=1
  150.             if ACC(7 downto 0) = ARG then
  151.                 Z <= '1';
  152.                 CNT := CNT + 1;
  153.             elsif ACC(7 downto 0) < ARG then
  154.                 C <= '1';
  155.                 CNT := CNT + 1;
  156.             end if;
  157.         elsif OPCODE = x"1D" then -- CMP aaa, if(ACC=RAM(aaa)) Z=1 elsif( ACC<RAM(aaa)) C=1
  158.             ADDR := ARG;
  159.             if ACC(7 downto 0) = RAM(TO_INTEGER(UNSIGNED(ADDR))) then
  160.                 Z <= '1';
  161.                 CNT := CNT + 1;
  162.             elsif ACC(7 downto 0) < RAM(TO_INTEGER(UNSIGNED(ADDR))) then
  163.                 C <= '1';
  164.                 CNT := CNT + 1;
  165.             end if;
  166.         elsif OPCODE = x"1E" then -- JUMP aaa, CNT = aaa
  167.             CNT := TO_INTEGER(UNSIGNED(ARG));
  168.         elsif OPCODE = x"1F" then -- JUMPZ aaa, if(Z) CNT = aaa
  169.             if Z = '1' then
  170.                 CNT := TO_INTEGER(UNSIGNED(ARG));
  171.             else
  172.                 CNT := CNT + 1;
  173.             end if;
  174.         elsif OPCODE = x"20" then -- JUMPNZ aaa, if(notZ) CNT = aaa
  175.             if Z = '0' then
  176.                 CNT := TO_INTEGER(UNSIGNED(ARG));
  177.             else
  178.                 CNT := CNT + 1;
  179.             end if;
  180.         elsif OPCODE = x"21" then -- JUMPC aaa, if(C) CNT = aaa
  181.             if C = '1' then
  182.                 CNT := TO_INTEGER(UNSIGNED(ARG));
  183.             else
  184.                 CNT := CNT + 1;
  185.             end if;
  186.         elsif OPCODE = x"22" then -- JUMPNC aaa, if(notC) CNT = aaa
  187.             if C = '0' then
  188.                 CNT := TO_INTEGER(UNSIGNED(ARG));
  189.             else
  190.                 CNT := CNT + 1;
  191.             end if;
  192.         elsif OPCODE = x"23" then -- OUT ddd, GPIOddd = ACC
  193.             if ARG = x"00" then
  194.                 GPIO_0 <= ACC;
  195.             elsif ARG = x"01" then
  196.                 GPIO_1 <= ACC;
  197.             end if;
  198.             CNT := CNT + 1;
  199.         end if;
  200.         i <= INSTR;
  201.         a <= ARG;
  202.         o <= OPCODE;
  203.         ac <= ACC;
  204.         ct <= CNT;
  205.         adrt <= ADDR;
  206.     end if;
  207. end process;
  208.  
  209. end Behavioral;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement