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

📄 al8051.vhd

📁 使用VHDL语言编写的8051IP核
💻 VHD
📖 第 1 页 / 共 5 页
字号:
				end loop;
				
				zcom1 <= com;
				wait on u3;      
				Port0 <= "ZZZZZZZZ";
				
				wait on u4;
				for j in 0 to 7 loop 
					if pr2(j) = '1' then Port0(j) <= '1'; 
										else Port0(j) <= '0'; 
					end if;
				end loop;
	--	RAM(128):= pr2(7 downto 0);
				for j in 8 to 15 loop
					if pr2(j) = '1' then Port2(j-8) <= '1'; 
										else Port2(j-8) <= '0'; 
					end if;
				end loop;
	--		RAM(160):= pr2(15 downto 8);	
		 		addrhi:= pr2(15 downto 8);
				wait on u5; 
				Port0 <= "ZZZZZZZZ";        
			end if; 
		end procedure Proc1;   						   

--^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-- Port3 logic
--^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
	impure	function p3(pin:Std_Logic;i:Integer) return Std_Logic is
			variable lev:Std_Logic;
		begin
			if (bufp3(i)='1' and pin='H') then lev:='H';
															else lev:='0';
			end if;
			return lev;
		end; 
		
--^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-- this is a Timer Unit  
-- implementation
--^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

		procedure tajm  is              -- Timer one working cycle 
		begin
			if ft = '0' then
				TH0s <= RAM(140);
				TL0s <= RAM(138);
				TH1s <= RAM(141);
				TL1s <= RAM(139); 
				TMODs <= RAM(137);          -- TMOD
				TCONs <=RAM(136);          -- TCON
				wait on u12;           
				
				z1 <= not z1;
				wait for 0.05 ns;
				
				RAM(140) := TH0a;
				RAM(138) := TL0a;
				RAM(141) := TH1a;
				RAM(139) := TL1a; 
				RAM(136) := TCONa;        -- TCON
			end if;
			ft <= not ft;
			wait for 0.5 ns;
		end procedure tajm;
		
--^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-- Implementation MOVX-type instructions
--^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
		procedure rvpd          					      					-- MOVX
			(variable k1 : in  Integer range 0 to 65536;
			c,b : in Bit )is                             						  	-- c=0 then reading
			variable t,k11 : Integer range 0 to 65536;			-- b=0 then address in @ri
			variable pr2 : Bit_Vector (15 downto 0);
			variable pr : Bit_Vector (7 downto 0);
		begin 
			BUFP0 := "11111111";  
			bup0 <= bufp0;
			wait for 0.05 ns;
			larger<='0';
			proc31(k1,pr2);
			yk <= k1;
			wait for 1 ns;
			ik := (ik + 1) mod 32;
			tajm;
			wait on u4;
			   Port0<= to_stdlogicvector(pr2(7 downto 0));

			   RAM(128):= "11111111";
			if b='1' then
				for j in 8 to 15 loop
					if pr2(j) = '1' then Port2(j-8) <= '1'; 
					else Port2(j-8) <= '0'; 
					end if;
				end loop;
			else 
				pr2(7 downto 0) := RAM(160);
				for j in 0 to 7 loop 
					if pr2(j) = '1' then Port2(j) <= 'H'; 
										else Port2(j) <= '0'; 
					end if;
				end loop;
			end if;    
			wait for 0.1 ns;
			flz2 <= '1';
			wait on u6; 
			
			Port0 <= "ZZZZZZZZ";
			Port3(7) <=p3('H',7)  ;
			Port3(6) <= p3('H',6) ;        
			
			if c  = '1' then 
				Port0 <= "ZZZZZZZZ"; 
				wait for 1 ns;
				pr:= RAM(224); 
				for j in 0 to 7 loop 
					if pr(j) = '1' then Port0(j) <= '1'; 
									else Port0(j) <= '0'; 
					end if;
				end loop;  
			end if;
			wait on u; 
			ik := (ik + 1) mod 32;
			tajm;
			if c  = '0' then 
				Port3(7) <= '0';
				wait on u5;
				for j in 0 to 7 loop
					if Port0(j) = '1' then pr(j) := '1'; 
											else pr(j) := '0'; 
					end if;
				end loop;                 
				RAM(224):= pr;
				wait on u6;
				Port0 <= "ZZZZZZZZ";                 
			else 
				Port3(6) <= '0';
				 wait on u6;
			end if;
			
			wait on u;  
			Port3(7) <= p3('H',7)  ;
			Port3(6) <= p3('H',6)  ;  
			flz2 <= '0';
			larger<='1';
			
			wait on u4;
			if outact='0' then
				pr2(7 downto 0) := RAM(128);
				for j in 0 to 7 loop 
					if pr2(j) = '1' then Port0(j) <= 'Z'; 
										else Port0(j) <= '0'; 
					end if;
				end loop;
				pr2(7 downto 0) := RAM(160);
				for j in 0 to 7 loop 
					if pr2(j) = '1' then Port2(j) <= 'H'; 
										else Port2(j) <= '0'; 
					end if;
				end loop;
			end if;   
		end procedure rvpd;  


--^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-- this is a single command cycle 
--^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
		procedure Proc11 is 
			begin  
			tajm;
			if i=65535 then i:=0;   else	i:=i+1; end if;	 
		
			y <= i;
			wait for 1 ns;
			Proc1; 					
		end procedure Proc11;    
		

--^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-- Implementation of a jump-instruction
--^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
		procedure ajmp (l:in Bit_Vector (10 downto 0)) is  
		begin
			ff:='1'; 
			proc2 (k,com); 
			if i=65535 then	 i:=0;   else	i:=i+1;  end if;
			proc31 (i,pr2);
			pr2(10 downto 0):=l;
			proc21 (i,pr2);
			i:=i+k;  
		end procedure ajmp;					  
		
--^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-- Implementation of a call-instruction
--^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
		procedure call is
		begin
			j:=i; 
			proc31(j,pr2);
			proc2(k,RAM(129));
			k:=k+1;
			pr:=pr2(7 downto 0);
			RAM(k):=pr;
			k:=k+1;
			pr:=pr2(15 downto 8);
			RAM(k):=pr;
			proc3(k,RAM(129));
			if k > 255 then k:=0; end if;
			
		end procedure call;		  
		
--^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-- Implementation of a return-instruction
--^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
		procedure ret is
		begin    
			proc2(k,RAM(129));
			pr:=RAM(k);
			pr2(15 downto 8):=pr;
			k:=k-1;
			if k < 0 then k:= 255; end if;
			pr:=RAM(k);
			pr2(7 downto 0):=pr;
			k:=k-1;
			if k < 0 then k:= 255; end if;
			proc3(k,RAM(129));
			proc21(i,pr2);
			ff:='1';
		end procedure ret;			  
		
--^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-- Implementation of an acall-instruction--
--^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
		procedure acall (l1:in Bit_Vector (10 downto 0)) is  
		begin
			call;  
			ajmp(l1);
		end procedure acall;												
		
--^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-- Implementation of a long jump-instruction
--^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
		procedure ljmp is
		begin               
			proc2 (k,com);
			j:= k*256;
			Proc11; 
			proc2 (k,com);                   
			i:= j+k;                   
		end procedure ljmp;      

--^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-- Implementation of a long call-instruction
--^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
		procedure lcall is  
		begin
			if i=65535 then	 i:=0;   else 	i:=i+1; end if; 
			call;
			ljmp;
		end procedure lcall;
		
--^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^	  
-- this procedure returns the Integer <k>
-- -representation of the data pointer    	  	  
--^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
		procedure dptr is  
		begin
			pr2(15 downto 8):= RAM(131);
			pr2(7 downto 0):= RAM(130);
			proc21(k,pr2);
		end procedure dptr;   
		
--^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-- this procedure signales an error	  
--^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
		procedure prerror is  
		begin	 
			 assert false
					report "***UNAFFORDED INSTRUCTION***"
				severity FAILURE;
				wait;
		end procedure prerror; 				  
		
--function reading port p address		
  impure	 function RP(k : integer ) return Bit_Vector  is
		   variable T:  Bit_Vector(7 downto 0);
		begin
		   case k is
			   when 128 => T:=to_bitvector(Port0)  ;	
			   when 144 => T:=to_bitvector(Port1)  ;		 
			   when 160 => T:=to_bitvector(Port2)  ;	
		 	   when 176 => T:=to_bitvector(Port3)  ;	
			   when others =>T:= RAM(k)  ;	
		   end case	 ;
		  return T;
		end;
		--function reading port p	bit	
	impure	 function RPB(k : integer ) return Bit  is
		   variable T:  Bit;
		begin
		   case k is
			   when 128 to 135 => T:=to_bit(Port0(k-128))  ;	
			   when 144 to 151 => T:=to_bit(Port1(k-144))  ;		 
			   when 160 to 167 => T:=to_bit(Port2(k-160))  ;	
		 	   when 176 to 185 => T:=to_bit(Port3(k-176))  ;	
			   when others =>T:= ADBit(k)  ;	
		   end case	 ;
		  return T;
		end;
		
		
--^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-- Implementation of a RAM-register move instruction,
-- if t=0 then MOV Reg'l',k  
-- if t=1 then , MOV k,Reg'l', 
-- where l- register absolute address in RAM
-- k- address RAM, 
--^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^			 		  

		procedure mov_r_ad (l: in Integer range 0 to 256;  
												t:in Integer range 0 to 2) is
		begin
			proc2 (k,com);
			if t = 0 then RAM(l):=  RP(k);--RAM(k);
						else RAM(k):= RP(l);--RAM(l);
			end if;   
		end procedure mov_r_ad;				 

--^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-- Implementation MOV ad,#d -instruction
--^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
	procedure mov_r_d (l: in Integer range 0 to 256) is    
	begin
			RAM(l):=com; 
	end procedure mov_r_d;
		
--^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-- Implementation INC -instruction - +1 to RAM cell
--^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
		procedure inc_r (l: in Integer range 0 to 256 ) is        -- INC **
			variable k: Integer range 0 to 300;
		begin	
			Proc2(k,RAM(l));
			if k < 255 then k:=k+1; 
							else k:=0;
			end if;
			Proc3(k,RAM(l));
		end procedure inc_r;			  
		

--^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
--   Implementation DEC -instruction - -1 to RAM cell
--^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
		procedure dec_r (l: in Integer range 0 to 256 ) is         -- DEC **
		begin	
			Proc2(k,RAM(l));
			if k > 0 then k:=k-1; 
						else k:=255; 
			end if;	                
			Proc3(k,RAM(l));
		end procedure dec_r;			  		   
		
--^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-- Exchange bytes in ACC and RAM cell
--^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
		procedure xch (l: inout Bit_Vector (7 downto 0)) is         -- XCH A,*
		begin	
			pr0:= RAM(224); 
			RAM(224):= l;
			l:= pr0;
		end procedure xch;							 
		
--^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-- Addition  in ACC,  Bit by Bit 
--^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
		procedure add (l: in Bit_Vector (7 downto 0);             
									cc: in Bit) is
			variable x: Bit_Vector(0 to 2);
			variable y: Bit_Vector(8 downto 0):="000000000";
			variable t : Integer range 0 to 8;
		begin	
			pr:= RAM(208);
			pr0:= RAM(224);
			if cc = '1' then  y(0):=pr(7);      -- '0' - ADD; '1' - ADDC	                  
			end if;
			for t in 0 to 7 loop
				x(0):= l(t);
				x(1):= pr0(t);
				x(2):= y(t);
				case x is
					when "000" => pr0(t):='0'; y(t+1):='0';
					when "001" => pr0(t):='1'; y(t+1):='0';
					when "010" => pr0(t):='1'; y(t+1):='0';
					when "011" => pr0(t):='0'; y(t+1):='1';
					when "100" => pr0(t):='1'; y(t+1):='0';
					when "101" => pr0(t):='0'; y(t+1):='1';
					when "110" => pr0(t):='0'; y(t+1):='1';
					when "111" => pr0(t):='1'; y(t+1):='1';
				end case;
			end loop;  
			
			pr(6):=y(4);     
			pr(7):=y(8); 
			if y(7) = y(8) then pr(2):= '0';   
									else pr(2):= '1'; 
			end if;
			RAM(208):= pr;
			RAM(224):= pr0;                      
		end procedure add;					
		
--^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-- Subtraction in ACC, Bit by Bit 
--^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
		procedure subb (l: in Bit_Vector (7 downto 0)) is      -- SUBB A,*
			variable x: Bit_Vector(2 downto 0);
			variable y: Bit_Vector(8 downto 0):="000000000";
			variable t : Integer range 0 to 8;

⌨️ 快捷键说明

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