📄 datapath_struct.vhd
字号:
selds<='1';
when "010" => if xmod="11" then eam_s <= dx_s;
else eam_s <= bp_s + si_s + disp;
end if;
selds<='0';
when "011" => if xmod="11" then eam_s <= bx_s;
else eam_s <= bp_s + di_s + disp;
end if;
selds<='0';
when "100" => if xmod="11" then eam_s <= sp_s;
else eam_s <= si_s + disp;
end if;
selds<='1';
when "101" => if xmod="11" then eam_s <= bp_s;
else eam_s <= di_s + disp;
end if;
selds<='1';
when "110" => if xmod="00" then
eam_s <= disp;
selds <='1';
elsif xmod="11" then
eam_s <= si_s;
selds <='1';
else
eam_s <= bp_s + disp;
selds <='0'; -- Use SS
end if;
when others=> if xmod="11" then eam_s <= di_s;
else eam_s <= bx_s + disp;
end if;
selds<='1';
end case;
end process;
ea<=eam_s;
-- HDL Embedded Text Block 6 eb5
-- eb5 6
abusdp_out <= (segbus&"0000") + ("0000"&eabus); -- 20 bits address e.g. CS:IP
-- HDL Embedded Text Block 7 simux
-- simux 7
process(data_in,eabus,alubus,mdbus_in,simux)
begin
case simux is
when "00" => sibus <= data_in;
when "01" => sibus <= eabus;
when "10" => sibus <= alubus;
when others => sibus <= mdbus_in;
end case;
end process;
process(dispmux,nbreq,disp,mdbus_in,ipreg,eabus)
begin
case dispmux is
when "000" => ipbus <= ("0000000000000"&nbreq) + ipreg;
when "001" => ipbus <= (("0000000000000"&nbreq)+disp) + ipreg;
when "011" => ipbus <= disp; -- disp contains new IP value
when "100" => ipbus <= eabus; -- ipbus=effective address
when "101" => ipbus <= ipreg; -- bodge to get ipreg onto ipbus
when others => ipbus <= mdbus_in; -- (31 downto 16) FIX!!!!only used for "int x" instruction
end case;
end process;
-- HDL Embedded Text Block 9 eb8
-- eb8 9
domux_s <= eabus(0) & domux;
process(domux_s, alubus,ccbus, dibus, ipbus)
begin
case domux_s is
when "000" => dbusdp_out <= alubus; -- Even
when "001" => dbusdp_out <= ccbus;
when "010" => dbusdp_out <= dibus;
when "011" => dbusdp_out <= ipbus; -- CALL Instruction
when "100" => dbusdp_out <= alubus(7 downto 0)& alubus(15 downto 8); -- Odd
when "101" => dbusdp_out <= ccbus(7 downto 0) & ccbus(15 downto 8);
when "110" => dbusdp_out <= dibus(7 downto 0) & dibus(15 downto 8);
when others => dbusdp_out <= ipbus(7 downto 0) & ipbus(15 downto 8);
end case;
end process;
-- HDL Embedded Text Block 10 segoverride
-- segoverride 10
-- Write Prefix Register
process(clk,reset)
begin
if (reset = '1') then
opreg_s <= "01"; -- Default CS Register
opflag_s<= '0'; -- Clear Override Prefix Flag
elsif rising_edge(clk) then
if wrop='1' then
opreg_s <= segop(1 downto 0);-- Set override register
opflag_s<= '1'; -- segop(2); -- Set flag
elsif clrop='1' then
opreg_s <= "11"; -- Default Data Segment Register
opflag_s<= '0';
end if;
end if;
end process;
process (opflag_s,opreg_s,selds,eamux,segop)
begin
if opflag_s='1' and segop(2)='0' then -- Prefix register set and disable override not set?
opmux <= opreg_s(1 downto 0); -- Set mux to override prefix reg
elsif eamux(3)='1' then
opmux <= eamux(1 downto 0);
elsif eamux(0)='0' then
opmux <= "01"; -- Select CS for IP
else
opmux <= '1'&selds; -- DS if selds=1 else SS
end if;
end process;
-- HDL Embedded Text Block 11 drmux
-- eb9
process(dimux, data_in,alubus,mdbus_in,sdbus,eabus)
begin
case dimux is
when "000" => dibus <= data_in; -- Operand
when "001" => dibus <= eabus; -- Offset
when "010" => dibus <= alubus; -- Output ALU
when "011" => dibus <= mdbus_in; -- Memory Bus
when others => dibus <= sdbus; -- Segment registers
end case;
end process;
-- HDL Embedded Text Block 12 eb9
---- eb9 12 Segment Output Mux
int0cs_s <= '1' when eamux(3 downto 1)="011" else '0';
segsel_s <= iomem & int0cs_s & eamux(2 downto 1) & opmux; -- 5 bits
process(segsel_s,es_s,cs_s,ss_s,ds_s) -- Segment Output Mux
begin
case segsel_s is
when "000000" => segbus <= es_s; -- 00**, opmux select register
when "000001" => segbus <= cs_s;
when "000010" => segbus <= ss_s;
when "000011" => segbus <= ds_s;
when "000100" => segbus <= es_s; -- 01**, opmux select register
when "000101" => segbus <= cs_s;
when "000110" => segbus <= ss_s;
when "000111" => segbus <= ds_s;
when "001000" => segbus <= ss_s; -- 10**=SS, used for PUSH& POP
when "001001" => segbus <= ss_s;
when "001010" => segbus <= ss_s;
when "001011" => segbus <= ss_s;
when "001100" => segbus <= es_s; -- 01**, opmux select register
when "001101" => segbus <= cs_s;
when "001110" => segbus <= ss_s;
when "001111" => segbus <= ds_s;
when others => segbus <= ZEROVECTOR_C(15 downto 0);-- IN/OUT instruction 0x0000:PORT/DX
end case;
end process;
-- HDL Embedded Text Block 13 eb10
-- eb10 13
-- Offset Mux
process(ipreg,ea,sp_s,dx_s,eamux,si_s,di_s,bx_s,ax_s)
begin
case eamux is
when "0000" => eabus <= ipreg;--ipbus;--ipreg;
when "0001" => eabus <= ea;
when "0010" => eabus <= dx_s;
when "0011" => eabus <= ea + "10"; -- for call mem32/int
when "0100" => eabus <= sp_s; -- 10* select SP_S
when "0101" => eabus <= sp_s;
when "0110" => eabus <= ea(13 downto 0)&"00";
when "0111" => eabus <=(ea(13 downto 0)&"00") + "10"; -- for int
when "1000" => eabus <= di_s; -- Select ES:DI
when "1011" => eabus <= si_s; -- Select DS:SI
when "1001" => eabus <= ea; -- added for JMP SI instruction
when "1111" => eabus <= bx_s + (X"00"&ax_s(7 downto 0)); -- XLAT instruction
when others => eabus <= DONTCARE(15 downto 0);
end case;
end process;
-- Instance port mappings.
I6 : ALU
PORT MAP (
alu_inbusa => alu_inbusa,
alu_inbusb => alu_inbusb,
aluopr => aluopr,
ax_s => ax_s,
clk => clk,
cx_s => cx_s,
dx_s => dx_s,
reset => reset,
w => w,
wralu => wralu,
wrcc => wrcc,
wrtemp => wrtemp,
alubus => alubus,
ccbus => ccbus,
div_err => div_err
);
I0 : dataregfile
PORT MAP (
dibus => dibus,
selalua => selalua,
selalub => selalub,
seldreg => seldreg,
w => w,
wrd => wrd,
alu_inbusa => alu_inbusa,
alu_inbusb => alu_inbusb,
bp_s => bp_s,
bx_s => bx_s,
di_s => di_s,
si_s => si_s,
reset => reset,
clk => clk,
data_in => data_in,
mdbus_in => mdbus_in,
sp_s => sp_s,
ax_s => ax_s,
cx_s => cx_s,
dx_s => dx_s
);
I9 : ipregister
PORT MAP (
clk => clk,
ipbus => ipbus,
reset => reset,
wrip => wrip,
ipreg => ipreg
);
I15 : segregfile
PORT MAP (
selsreg => selsreg,
sibus => sibus,
wrs => wrs,
reset => reset,
clk => clk,
sdbus => sdbus,
dimux => dimux,
es_s => es_s,
cs_s => cs_s,
ss_s => ss_s,
ds_s => ds_s
);
END struct;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -