📄 al8051.vhd
字号:
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 + -