⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 al8051.vhd

📁 使用VHDL语言编写的8051IP核
💻 VHD
📖 第 1 页 / 共 5 页
字号:
								proc2(j,RAM(bank+1));
								if j = 128 then RAM(128):= BUFP0; end if;
								if j = 144 then RAM(144):= BUFP1; end if;
								if j = 160 then RAM(160):= BUFP2; end if;
								if j = 176 then RAM(176):= BUFP3; end if;
								dec_r(j);
								k := j;
								flag;         
			when "00100000" =>                            -- JB Bit,rel     3 b.
								proc2 (k,com);
								Proc11;
								if RPB(k) = '1' then rel; end if; --ADBit(k) = '1' then rel; end if;
			when "00100001" => ajmp("00100000000");      -- AJMP 001+ad 8  2 b.                     
			when "00100010" =>  ret;                      -- RET            1 b.
			when "00100011" =>                            -- RL A           1 b.
								pr := RAM(224);
								pr1(7 downto 1):=pr(6 downto 0);
								pr1(0):=pr(7);
								RAM(224):=pr1;
			when "00100100" =>                          -- ADD A,#d       2 b.
								add(com,'0');
			when "00100101" =>                           -- ADD A,ad       2 b.
								proc2(k,com);
								add(RP(k),'0');--add(RAM(k),'0');
			when "00100110" =>                            -- ADD A,@R0      1 b.
								proc2(k,RAM(bank+0));
								add(RP(k),'0');--add(RAM(k),'0');
			when "00100111" =>                            -- ADD A,@R1      1 b.
								proc2(k,RAM(bank+1));
								add(RP(k),'0');--add(RAM(k),'0');
			when "00110000" =>                             -- JNB bir,rel    3 b.
								proc2 (k,com);
								x <= k;
								zo <= RAM(128);
								wait for 1 ps;
								Proc11;
								if RPB(k) = '0' then rel; end if; --	if ADBit(k) = '0' then rel;  end if;
			when "00110001" =>   acall("00100000000");      -- ACALL 001+ad8  2 b.
			when "00110010" =>                              -- RETI            1 b.
								ret; 
								if  fl1 = '1' then fl1 := '0';
								else fl0 := '0';
								end if; 
								flint1 := '1';
			when "00110011" =>                              -- RLC A           1 b.
								pr := RAM(224);
								pr0:= RAM(208);
								pr1(7 downto 1):=pr(6 downto 0);
								pr1(0):=pr0(7);
								pr0(7):= pr(7);
								RAM(224):=pr1;
								RAM(208):=pr0;
			when "00110100" =>                        -- ADDC A,#d       2 b.
								add(com,'1');
			when "00110101" =>                        -- ADDC A,ad       2 b.
								proc2(k,com);
								add(RP(k),'1');--add(RAM(k),'1');
			when "00110110" =>                        -- ADDC A,@R0      1 b.
								proc2(k,RAM(bank+0));
								add(RP(k),'1');--add(RAM(k),'1');
			when "00110111" =>                        -- ADDC A,@R1      1 b.
								proc2(k,RAM(bank+1));
								add(RP(k),'1');--add(RAM(k),'1');
			when "01000000" =>                                   -- JC rel   2 b.  
								ccom := com;
								y <= i;
								wait for 0.5ns;
								tajm;
								Proc1;
								com:= ccom;
								if ADBit(215) = '1' then rel; end if;
			when "01000001" =>  ajmp("01000000000");             -- AJMP 010+ad 8  2 b. 
			when "01000010" =>                                   -- ORL ad,A       2 b.   
								proc2(k,com);
								if k = 128 then RAM(128):= BUFP0; end if;
								if k = 144 then RAM(144):= BUFP1; end if;
								if k = 160 then RAM(160):= BUFP2; end if;
								if k = 176 then RAM(176):= BUFP3; end if;
								RAM(k):= RAM(k) or RAM(224);
								flag;
			when "01000011" =>                                   -- ORL ad,#d      3 b.     
								proc2(k,com);
								if k = 128 then RAM(128):= BUFP0; end if;
								if k = 144 then RAM(144):= BUFP1; end if;
								if k = 160 then RAM(160):= BUFP2; end if;
								if k = 176 then RAM(176):= BUFP3; end if;
								proc11;
								RAM(k):= RAM(224) or com;
								flag;
			when "01000100" =>                                      -- ORL A,#d       2 b. 
								RAM(224):= RAM(224) or com;
			when "01000101" =>                                      -- ORL A,ad       2 b.  
								proc2(k,com);
								RAM(224):= RAM(224) or RP(k); --RAM(k);
			when "01000110" =>                                      -- ORL A,@R0      1 b.      1 b.
								proc2(k,RAM(bank+0));
								RAM(224):= RAM(224) or RP(k); --RAM(k);
			when "01000111" =>                                      -- ORL A,@R1      1 b.
								proc2(k,RAM(bank+1));
								RAM(224):= RAM(224) or RP(k); --RAM(k);
			when "01010000" =>                                      -- JNC rel        2 b.   
								ccom := com;
								y <= i;
								wait for 0.5ns;
								tajm;
								Proc1; 
								com := ccom;
								if ADBit(215) = '0' then  rel; end if;
			when "01010001" =>   acall("01000000000");               -- ACALL 010+ad8  2 b.
			when "01010010" =>                                       -- ANL ad,A       2 b.
								proc2(k,com);
								if k = 128 then RAM(128):= BUFP0; end if;
								if k = 144 then RAM(144):= BUFP1; end if;
								if k = 160 then RAM(160):= BUFP2; end if;
								if k = 176 then RAM(176):= BUFP3; end if;
								RAM(k):= RAM(224) and RAM(k);
								flag;
			when "01010011" =>            
								proc2(k,com);
								if k = 128 then RAM(128):= BUFP0; end if;
								if k = 144 then RAM(144):= BUFP1; end if;
								if k = 160 then RAM(160):= BUFP2; end if;
								if k = 176 then RAM(176):= BUFP3; end if;
								proc11;
								RAM(k):= RAM(k) and com;
								flag;
			when "01010100" =>                                       -- ANL A,#d      2 b.
								RAM(224):= RAM(224) and com;
			when "01010101" =>                                       -- ANL A,ad      2 b.
								proc2(k,com);
								RAM(224):= RAM(224) and RP(k); --RAM(k);
			when "01010110" =>                                       -- ANL A,@R0      1 b.
								proc2(k,RAM(bank+0));
								RAM(224):= RAM(224) and RP(k); --RAM(k);
			when "01010111" =>                                       -- ANL A,@R1      1 b.
								proc2(k,RAM(bank+1));
								RAM(224):= RAM(224) and RP(k); --RAM(k);
			when "01100000" =>                                        -- JZ rel         2 b.   
								ccom := com;
								y <= i;
								wait for 0.5ns;
								tajm;
								Proc1; 
								com := ccom;
								if RAM(224) = "00000000" then  rel; end if;
			when "01100001" =>  ajmp("01100000000");                   -- AJMP 011+ad 8  2 b.          
			when "01100010" =>                                         -- XRL ad,A       2 b.
								proc2(k,com);
								if k = 128 then RAM(128):= BUFP0; end if;
								if k = 144 then RAM(144):= BUFP1; end if;
								if k = 160 then RAM(160):= BUFP2; end if;
								if k = 176 then RAM(176):= BUFP3; end if;
								RAM(k):= RAM(224) xor RAM(k);
								flag;
			when "01100011" =>                                         -- XRL ad,#d   3 b.
								proc2(k,com);
								if k = 128 then RAM(128):= BUFP0; end if;
								if k = 144 then RAM(144):= BUFP1; end if;
								if k = 160 then RAM(160):= BUFP2; end if;
								if k = 176 then RAM(176):= BUFP3; end if;
								proc11;
								RAM(k):= RAM(k) xor com;
								flag;
			when "01100100" =>                                         -- XRL A,#d       2 b.
								RAM(224):= RAM(224) xor com;
			when "01100101" =>                                         -- XRL A,ad       2 b.
								proc2(k,com);
								RAM(224):= RAM(224) xor RP(k); --RAM(k);
			when "01100110" =>                                         -- XRL A,@R0      1 b.
								proc2(k,RAM(bank+0));
								RAM(224):= RAM(224) xor RP(k); --RAM(k);
			when "01100111" =>                                         -- XRL A,@R1      1 b.
								proc2(k,RAM(bank+1));
								RAM(224):= RAM(224) xor RP(k); --RAM(k);
			when "01110000" =>                                         -- JNZ rel        2 b.   
								ccom := com;
								y <= i;
								wait for 0.5ns;
								tajm;
								Proc1; 
								com := ccom;
								if RAM(224) /= "00000000" then  rel;
										else  
								end if;
			when "01110001" =>   acall("01100000000");    -- ACALL 011+ad8  2 b.
			when "01110010" =>                            -- ORL C,Bit      2 b.
								proc2(k,com);
								pr:=RAM(208);
								pr(7):=pr(7) or RPB(k); --AdBit(k);
								RAM(208):=pr; 
								ff:= '1';
			when "01110011" =>                            -- JMP @A+DPTR    1 b.
								dptr;
								proc2(j,RAM(224));
								ff:='1';
								i:=k+j;                     
								if i > 65535 then i:= i - 65536; end if;
			when "01110100" =>   mov_r_d (224);               -- MOV A,#d       2 b.                   
			when "01110101" =>                                -- MOV ad,#d   3 b.
								proc2(k,com);
								proc11;
								mov_r_d (k);
								flag;
			when "01110110" =>                             -- MOV @R0,#d  2 b.                 
								proc2(k,RAM(bank+0));
								mov_r_d (k);
								flag;
			when "01110111" =>                             -- MOV @R1,#d  2 b.
								proc2(k,RAM(bank+1));
								mov_r_d (k);
								flag;
			when "10000000" =>    
								rel;                        -- SJMP rel       2 b.
			when "10000001" =>  ajmp("10000000000");  -- AJMP 100+ad 8  2 b. 
			when "10000010" =>                        -- ANL C,Bit      2 b.
								proc2(k,com);
								pr:=RAM(208);
								pr(7):=pr(7) and RPB(k); --AdBit(k);
								RAM(208):=pr;
								ff:='1';
			when "10000011" =>                        -- MOVC A,@A+PC   1 b.
								proc2(j,RAM(224)); 
								k:=j+i;
								if k > 65535 then k:= k - 65535; end if;
								tajm; 
								y <= k;
								wait for 1 ns;
								proc1;
								tajm; 
								y <= i;
								wait for 1 ns;
								proc1;
								RAM(224):=com;
			when "10000100" =>                         -- DIV AB         1 b.
								proc2(k,RAM(224));
								proc2(j,RAM(240));
								if j = 0 then 
									RAM(208):= RAM(208) or "00000100"; 
								else
									k1:=k mod j;
									proc3(k1,RAM(240));
									k:=k - k1;
									k:=k/j;
									proc3(k,RAM(224)); 
									RAM(208):= RAM(208) and "01111011"; 
								end if;
								proc1; tajm;
								proc1; tajm;
								proc1; tajm;
								proc1; tajm;
								proc1; tajm;
								proc1; tajm;
			when "10000101" =>                         -- MOV add,ads    3 b.
								proc2(k,com);
								proc11;
								proc2(j,com);
								RAM(j):=RP(k);--RAM(k); 
								flag;
			when "10000110" =>                          -- MOV ad,@R0     2 b. 
								proc2(k,com);
								proc2(j,RAM(bank+0));
								RAM(k):=RP(j);--RAM(j);
								flag;
			when "10000111" =>                           -- MOV ad,@R1     2 b.
								proc2(k,com);
								proc2(j,RAM(bank+1));
								RAM(k):=RP(j);--RAM(j);
								flag;             
			when "10010000" =>                           -- MOV DPTR,#d16   3 b.
								RAM(131):=com;
								proc11;
								RAM(130):=com;
			when "10010001" =>   acall("10000000000");    -- ACALL 100+ad8  2 b.
			when "10010010" =>                            -- MOV Bit,C       2 b.
								proc2(k,com);
								case com(7 downto 3) is
									when "10000" => ADBit(135 downto 128) := BUFP0; flp0 <= '1';
									when "10010" => ADBit(151 downto 144) := BUFP1; flp1 <= '1';
									when "10100" => ADBit(167 downto 160) := BUFP2; flp2 <= '1';
									when "10110" => ADBit(183 downto 176) := BUFP3; flp3 <= '1';
									when others =>		 flp0 <= '0'; flp1 <= '0'; flp2 <= '0'; flp3 <= '0';
								end case;                
								pr:=RAM(208);
								AdBit(k):= pr(7);
								FBit := '1';  
								ff:='1';                  
			when "10010011" =>                             -- MOVC A,@A+DPTR   1 b.
								dptr;
								proc2(j,RAM(224)); 
								k:=j+k;
								if k > 65535 then k:= k - 65535; end if; 
								tajm; 
								y <= k;
								wait for 1 ns;
								proc1;
								tajm; 
								y <= i;
								wait for 1 ns;
								proc1;
								RAM(224):=com;
			when "10010100" =>                        -- SUBB A,#d       2 b.
								subb(com);
			when "10010101" =>                        -- SUBB A,ad       2 b.
								proc2(k,com);
								subb(RP(k));--subb(RAM(k));
			when "10010110" =>                        -- SUBB A,@R0      1 b.
								proc2(k,RAM(bank+0));
								subb(RP(k));--subb(RAM(k));
			when "10010111" =>                        -- SUBB A,@R1      1 b.
								proc2(k,RAM(bank+1));
								subb(RP(k));--subb(RAM(k));
			when "10100000" =>                        -- ORL C,/Bit      2 b.
								proc2(k,com);
								b1:=RPB(k); --AdBit(k);
								pr:=RAM(208);
								b1:= not b1;
								pr(7):=pr(7) or b1;
								RAM(208):=pr;
								ff := '1';
			when "10100001" =>  ajmp("10100000000");      -- AJMP 101+ad 8  2 b. 
			when "10100010" =>                            -- MOV C,Bit      2 b.
								proc2(k,com);
								pr:=RAM(208);
								pr(7):= RPB(k);--AdBit(k);
								RAM(208):=pr;
			when "10100011" =>                             -- INC DPTR       1 b.
								dptr;
								if k > 65534 then k:=0;
								else k:=k+1;
								end if;
								proc31(k,pr2);
								RAM(130):= pr2(7 downto 0);
								RAM(131):= pr2(15 downto 8);   
								proc1; tajm;
								proc1; tajm;
			when "10100100" =>                           -- MUL AB         1 b.       
								proc2(k,RAM(224));
								proc2(j,RAM(240));
								k:=k*j;
								if k > 255 then RAM(208):= (RAM(208) and "01111111") or "00000100";
												else RAM(208):= RAM(208) and "01111011";
								end if;           
								proc31(k,pr2);
								RAM(240):=pr2(15 downto 8);                    
								RAM(224):=pr2(7 downto 0);
								proc1; tajm;
								proc1; tajm;
								proc1; tajm;
								proc1; tajm;
								proc1; tajm;
								proc1; tajm;
			when "10100101" =>     j:=j; --prerror ;        -- invalid instruction
			when "10100110" =>                           -- MOV @R0,ad     2 b.
								proc2(k,com);
								proc2(j,RAM(bank+0));
								RAM(j):=RP(k);--RAM(k);
			when "10100111" =>                           -- MOV @R1,ad     2 b.
								proc2(k,com);
								proc2(j,RAM(bank+1));
								RAM(j):=RP(k);--RAM(k);   
			when "10110000" =>                           -- ANL C,/Bit     2 b.
								proc2(k,com);
								b1:=RPB(k);--AdBit(k);
								pr:=RAM(208);
								b1:= not b1;
								pr(7):=pr(7) and b1;
								RAM(208):=pr;
								ff:='1';
			when "10110010" =>                             -- CPL Bit        2 b.
								proc2(k,com);
								case com(7 downto 3) is
									when "10000" => ADBit(135 downto 128) := BUFP0; flp0 <= '1';
									when "10010" => ADBit(151 downto 144) := BUFP1; flp1 <= '1';
									when "10100" => ADBit(167 downto 160) := BUFP2; flp2 <= '1';
									when "10110" => ADBit(183 downto 176) := BUFP3; flp3 <= '1';
									when others =>		 flp0 <= '0'; flp1 <= '0'; flp2 <= '0'; flp3 <= '0';
								end case;                
								AdBit(k):=not AdBit(k);
								FBit := '1'; 
			when "10110011" =>                           -- CPL C          1 b.
								pr:=RAM(208);
								pr(7):= not pr(7);
								RAM(208):=pr;
			when "10110100" =>                            -- CJNE A,#d,rel  3 b.
								cjne(RAM(224),com);
			when "10110101" =>                            -- CJNE A,ad,rel  3 b.
								proc2(k,com);
								cjne(RAM(224),RP(k));--RAM(k));
			when "10110110" =>                            -- CJNE @R0,#d,rel  3 b.
								proc2(k,RAM(bank+0));
								cjne(RP(k),com);--RAM(k),com);
			when "10110111" =>                            -- CJNE @R1,#d,rel  3 b.
								proc2(k,RAM(bank+1));
								cjne(RP(k),com);--RAM(k),com);
			when "11000000" =>                            -- PUSH ad       2b.
								proc2(k,RAM(129));
								k:=k+1;
								proc3(k,RAM(129));
								proc2(j,com);
								RAM(k):= RP(j);--RAM(j);
			when "11000001" =>  ajmp("11000000000");       -- AJMP 110+ad 8  2 b. 
			when "11000010" =>                             -- CLR Bit        2 b.
								proc2(k,com);
								case com(7 downto 3) is
									when "10000" => ADBit(135 downto 128) := BUFP0; flp0 <= '1';
									when "10010" => ADBit(151 downto 144) := BUFP1; flp1 <= '1';
									when "10100" => ADBit(167 downto 160) := BUFP2; flp2 <= '1';
									when "10110" => ADBit(183 downto 176) := BUFP3; flp3 <= '1';
									when others =>		 flp0 <= '0'; flp1 <= '0'; flp2 <= '0'; flp3 <= '0';
								end case;                
								ADBit(k):='0';
								FBit := '1'; 
			when "11000011" =>  ADBit(215):='0';              -- CLR C          1 b.
								FBit := '1'; 
								flp0 <= '0'; flp1 <= '0'; 
								flp2 <= '0'; flp3 <= '0';
			when "11000100" =>                        

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -