📄 controllogic.vhd
字号:
if ((MULL_St1 or MLAL_St2) and MulResRdy)='1' then
-- The last cycle of long multiplication/accumulation(high part of 64-bit)
CFlagUse <= '1';
elsif IDR_LdStInst='1' and (nLDR_St0='0' and nLDM_St0='0' and STR_St='0' and STM_St='0') then
-- Base update(second cycle of any load/store)
InvB <= not U_Latched; -- U=1 - add, U=0 subtract
PassA_Reg <= '0';
elsif LDR_St1='1' or LDM_St1='1' or SWP_St1='1' then -- The second cycle of load instruction
-- Write data from data in register to general purpose register
PassA_Reg <= '0'; -- !!!!
InvB <= '0';
PassB_Reg <= '1';
end if;
when others => null;
end case;
end if;
end if;
end process;
PassA <= '1' when ExceptFC='1' else PassA_Reg; -- First cycle of exception (LR<=PC)
PassB <= '0' when ExceptFC='1' else PassB_Reg;
-- +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-- Bus A multiplexer control
-- +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
BusAMUXCtrl:process(nRESET,CLK)
begin
if nRESET='0' then -- Reset
RegFileAOutSel_Reg <= '0';
MultiplierAOutSel_Reg <= '0';
CPSROutSel_Reg <= '0';
SPSROutSel_Reg <= '0';
elsif CLK='1' and CLK'event then -- Clock
if CLKEN='1' then -- Clock enable
case StagnatePipeline_Int is
-- Beginning of the new instruction or pipeline refilling(branch/exception)
when '0' =>
if ((IDR_B or IDR_BL or (IDR_ThBLFP and CPSRTFlag)) and ExecuteInst)='1' or
Branch_St1='1' then
-- Branch (the first and the second cycle)
RegFileAOutSel_Reg <= '1';
else
RegFileAOutSel_Reg <= IDC_DPIImmSh or IDC_DPIRegSh or IDC_DPIImmRot or
IDC_LSImmOffset or IDC_LSRegOffset or
IDC_LSHWImmOffset or IDC_LSHWRegOffset or
IDC_LHWBSImmOffset or IDC_LHWBSRegOffset or
IDC_LDM or IDC_STM or
IDC_Branch or -- B/BL/BX
IDC_SWP or IDC_SWPB; -- SWP/SWPB
MultiplierAOutSel_Reg <= (IDC_MUL or IDC_MLA or IDC_UMULL or IDC_UMLAL or IDC_SMULL or IDC_SMLAL);
CPSROutSel_Reg <= IDC_MRS and not InstForDecode(22); -- Move CPSR to GPR
SPSROutSel_Reg <= IDC_MRS and InstForDecode(22); -- Move SPSR to GPR
end if;
-- Changes of data path control within the instruction
when '1' => null;
when others => null;
end case;
end if;
end if;
end process;
RegFileAOutSel <= '1' when ExceptFC='1' else RegFileAOutSel_Reg; -- First cycle of exception (LR<=PC)
MultiplierAOutSel <= '0' when ExceptFC='1' else MultiplierAOutSel_Reg;
CPSROutSel <= '0' when ExceptFC='1' else CPSROutSel_Reg;
SPSROutSel <= '0' when ExceptFC='1' else SPSROutSel_Reg;
-- +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-- Bus B multiplexer control
-- +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
BusBMUXCtrl:process(nRESET,CLK)
begin
if nRESET='0' then -- Reset
RegFileBOutSel <= '0';
MultiplierBOutSel <= '0';
MemDataRegOutSel <= '0';
SExtOffset24BitSel <= '0';
Offset12BitSel <= '0';
Offset8BitSel <= '0';
Immediate8BitSel <= '0';
AdrGenDataSel <= '0';
elsif CLK='1' and CLK'event then -- Clock
if CLKEN='1' then -- Clock enable
case StagnatePipeline_Int is
-- Beginning of the new instruction or pipeline refilling(branch/exception)
when '0' =>
if ExceptFC='1' or Branch_St1='1' then -- TBD??
-- LR correction
RegFileBOutSel <= '0';
MultiplierBOutSel <= '0';
MemDataRegOutSel <= '0';
SExtOffset24BitSel <= '0';
Offset12BitSel <= '0';
Offset8BitSel <= '0';
Immediate8BitSel <= '0';
AdrGenDataSel <= '1';
else
RegFileBOutSel <= IDC_DPIImmSh or IDC_DPIRegSh or
IDC_LSRegOffset or IDC_LSHWRegOffset or IDC_LHWBSRegOffset or
IDC_MSR_R or IDC_BX; -- !!! TBD
MultiplierBOutSel <= IDC_MUL or IDC_MLA or IDC_UMULL or IDC_UMLAL or IDC_SMULL or IDC_SMLAL;
MemDataRegOutSel <= '0';
SExtOffset24BitSel <= IDC_B or IDC_BL;
Offset12BitSel <= IDC_LSImmOffset;
Offset8BitSel <= IDC_LHWBSImmOffset or IDC_LHWBSImmOffset;
Immediate8BitSel <= IDC_DPIImmRot or IDC_MSR_I;
AdrGenDataSel <= IDC_LDM or IDC_STM;
end if;
-- Changes of data path control within the instruction
when '1' =>
if LDR_St1='1' or LDM_St1='1' then
-- The third cycle of load instruction (write to GPR)
RegFileBOutSel <= '0';
MultiplierBOutSel <= '0';
MemDataRegOutSel <= '1';
SExtOffset24BitSel <= '0';
Offset12BitSel <= '0';
Offset8BitSel <= '0';
Immediate8BitSel <= '0';
AdrGenDataSel <= '0';
elsif (((IDR_LSRegOffset or IDR_LSHWRegOffset) and not L_Latched and not STR_St)or
(IDR_STM and not STM_St))='1' then
-- Store instruction with register offset or store multiple (second cycle - base update)
RegFileBOutSel <= '0';
MultiplierBOutSel <= '0';
MemDataRegOutSel <= '0';
SExtOffset24BitSel <= '0';
Offset12BitSel <= '0';
Offset8BitSel <= '0';
Immediate8BitSel <= '0';
AdrGenDataSel <= '1';
end if;
when others => null;
end case;
end if;
end if;
end process;
-- +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-- -- Bit 0,1 clear/set control
-- +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
ResultBitMask:process(nRESET,CLK)
begin
if nRESET='0' then -- Reset
ClrBitZero_Reg <= '0';
ClrBitOne_Reg <= '0';
SetBitZero_Reg <='0';
elsif CLK='1' and CLK'event then -- Clock
if CLKEN='1' then -- Clock enable
case StagnatePipeline_Int is
-- Beginning of the new instruction or pipeline refilling(branch/exception)
when '0' =>
if ExceptFC='1' or Branch_St1='1' then -- TBD (Thumb BL?)
ClrBitZero_Reg <= '0';
ClrBitOne_Reg <= '0';
SetBitZero_Reg <= '0';
else
-- Clears bits[1..0] during address phase of LDM/STM/STR !!! TBD
ClrBitZero_Reg <= IDC_STR or IDC_STM or IDC_LDM;
ClrBitOne_Reg <= IDC_STR or IDC_STM or IDC_LDM;
SetBitZero_Reg <= (IDR_ThBLSP and CPSRTFlag and ExecuteInst); -- Thumb BL support added(the second part of instruction)
end if;
when '1' => null;
-- Changes of data path control within the instruction
ClrBitZero_Reg <= '0';
ClrBitOne_Reg <= '0';
SetBitZero_Reg <= '0';
when others => null;
end case;
end if;
end if;
end process;
ClrBitZero <= '0' when ExceptFC='1' else ClrBitZero_Reg;
ClrBitOne <= '0' when ExceptFC='1' else ClrBitOne_Reg;
SetBitZero <= '0' when ExceptFC='1' else SetBitZero_Reg;
-- +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-- Address multiplexer and incrementer control (combinatorial) !!! TBD
-- +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-- TBD
PCInSel <= LDR_St1 or(LDR_St2 and not WriteToPC) or -- LDR last two cycles (merged IS cycle)
STR_St or -- STR
(STM_St and LSMStop)or -- STM last cycle
-- (LDM_St1 and LSMStop)or(LDM_St2 and LSMStopDel and not WriteToPC)or -- LDM last cycle !!! Modify !!!
(nLDM_St0 and (LSMStop or (LSMStopDel and not WriteToPC)))or -- LDM (merged IS cycle)
SWP_St2 or SWP_St3; -- SWP/SWPB last two cycles (merged IS cycle) ???
ALUInSel <= WriteToPC or -- Write to PC
((IDR_Branch or(IDR_ThBLFP and CPSRTFlag))and ExecuteInst and not nBranch_St0)or -- First cycle of B,BL,BX
(IDR_LdStInst and ExecuteInst and not(STR_St or nLDR_St0 or nLDM_St0 or STM_St))or -- First cycle of any load/store
((IDR_SWP or IDR_SWPB) and ExecuteInst and not nSWP_St0)or -- SWP/SWPB (Load)
SWP_St1; -- SWP/SWPB (Store)
AdrCntEn <= not StagnatePipeline_Int or -- Address counter is enabled during load/store multiple
IDR_STM or STM_St or
IDR_LDM or nLDM_St0;
ExceptionVectorSel <= ExceptFC; -- First cycle of exception handling
PCIncStep <= '0'; -- TBD '0'- ARM(+4) / '1'- Thumb(+2)
AdrIncStep <= '0'; -- TBD '0'- ARM(+4) or STM/LDM / '1'- Thumb(+2)
-- Switch ADDR register to the input of PC
AdrToPCSel <= ExceptFC or -- First cycle of interrupt entering
Branch_St1; -- Second cycle of branch
-- +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-- Register file control
-- +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-- Combinatorial rgister address control (controled from the execution stage of the pipeline)!!! TBD !!!
ABusRdAdr <= Rs when (IDR_DPIRegSh='1' and DPIRegSh_St='0')or(IDR_MUL or IDR_SMULL or IDR_UMULL or nMLA_St0 or nMLAL_St0)='1' else -- Rs ( The first cycle of "Data processing register shift")
CR_PC when ((IDR_B or IDR_BL or (IDR_ThBLFP and CPSRTFlag)) and ExecuteInst)='1' or Branch_St1='1' or ExceptFC='1' else -- *
CR_LR when Branch_St2='1' or ExceptSM_St1='1' else -- LR correction (BL/Exception)
Rn; -- Rn
-- * Note PC(R15) (target address calculation for B/BL) or store PC to LR (BL/Exception)
-- Thumb BL support added (the first part)
BBusRdAdr <= CurrentRgAdr when STM_St ='1' else -- Store multiple
RnM when ((IDR_MLA and not nMLA_St0)or((IDR_UMLAL or IDR_SMLAL)and not nMLAL_St0))='1' or STR_St='1' else -- Rn/RdLo only for accumulation (MLA/SMLAL/UMLAL), Rd - for STR
Rm; -- Rm
WriteAdr_Int <= CurrentRgAdr when LDM_St2 ='1' else -- Load multiple
CR_LR when nBranch_St0='1' or ExceptFC='1' or ExceptSM_St1='1' or (IDR_ThBLFP='1' and CPSRTFlag='1' and ExecuteInst='1') else -- *
RdM when (MUL_St or MLA_St2 or MULL_St2 or MLAL_St3)='1' or (LDM_St1 or STM_St or LDR_St1 or STR_St)='1' else -- Rd for 32-bit/RdHi for 64-bit multiplications / Base Register for LDM/STM
RnM when (MULL_St1 or MLAL_St2)='1' else -- RdLo for 64-bit multiplications
Rd; -- Rd
-- * Note: !!! check if presence of nExceptSM_St0='0' is necessary for this equation
-- Branch Exception
-- Store LR Second cycle First cycle
-- Modify LR Third cycle Second cycle
--
-- Thumb BL support added (the first part)
-- Write enable for the general purpose register file
WrEn_Int <= '1' when (((IDR_SingleCycleDPI and ExecuteInst)or DPIRegSh_St)and not IDR_Compare)='1' or
((((MUL_St or MLA_St2 or MULL_St1 or MLAL_St2)and MulResRdy) or MULL_St2 or MLAL_St3))='1' or -- Multiplications results
(IDR_MRS and ExecuteInst)='1' or -- Move PSR to GPR
(ExceptFC or ExceptSM_St1)='1' or -- Exception : LR<=PC, LR correction
BLink='1' or -- BL : LR<=PC, LR correction
(BaseRegUdate_St='1' and ABORT='0') or -- Base register update for load/store
(LDR_St2='1' and DAbtStored='0')or -- LDR
(LDM_St2='1' and DAbtStored='0' and LSAbtOccurred='0')or -- LDM
(IDR_ThBLFP='1' and CPSRTFlag='1' and ExecuteInst='1')or -- Thumb BL support added (the first part)
SWP_St2='1' -- SWP/SWPB
else '0';
-- PC control
PCSrcSel <= WriteToPC; -- 0 -> the incrementer, 1 -> external input bus !!! TBD
PCWrEn <= '0' when FirstInstFetch_Int='0' or -- First instruction fetch after reset
StagnatePipelineDel_Int='1' or -- Stop PC for multicycle instructions ??? TBD
(IDR_BL='1' and ExecuteInst='1')or -- First cycle of branch with link (ARM mode) TBD??
(IDR_ThBLSP='1' and CPSRTFlag='1' and ExecuteInst='1') -- First cycle of branch with link (Thumb mode) TBD??
else '1';
-- Base register save/restore for load/store multiple
SaveBaseReg <= BaseRegUdate_St;
RestoreBaseReg <= ((LDM_St2 and LSMStopDel)or(STM_St and LSMStop))and
LSAbtOccurred and BaseRegWasUdated_St;
-- +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-- Address generator for Load/Store instructions control
-- +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-- Load/Store multiple registers(LDM/STM) start address and base register update calculation TBD
RegisterList <= InstForDecode(15 downto 0);
IncBeforeSel <= '1' when (U='1' and P='1') or -- Selects 4 for : Load/store
ExceptFC='1' or -- Start of exceptions (for LR correction)
Branch_St1='1' else '0'; -- Branch with link (for LR correction)
DecBeforeSel <= '1' when U='0' and P='1' else '0';
DecAfterSel <= '1' when U='0' and P='0' else '0';
MltAdrSel <= (IDR_LDM or IDR_STM) and ExecuteInst; -- Base register update for LDM/STM
SngMltSel <= (IDR_LDR or IDR_LDRT or IDR_LDRB or IDR_LDRBT or
IDR_LDRSB or IDR_LDRH or IDR_LDRSH or
IDR_STR or IDR_STRT or IDR_STRB or IDR_STRBT or IDR_STRH)and ExecuteInst; -- ??? TBD '0' -> LDM/STM and LR corrections
-- Notes:
-- IncBeforeSel has the highest priority
-- DecAfterSel has the lowest priority
-- +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-- Instruction pipeline and data in registers control
-- +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-- Pipeline stagnation control for multicycle instructions
-- All the instructions that stagnates pipeline - all there cycles except last one
StagnatePipeline_Int <= (((IDR_DPIRegSh and not DPIRegSh_St)or
((IDR_STR or IDR_STRT or IDR_STRB or IDR_STRBT or IDR_STRH)and not STR_St)or
((IDR_LDR or IDR_LDRT or IDR_LDRB or IDR_LDRBT or IDR_LDRSB or IDR_LDRH or IDR_LDRSH)and not nLDR_St0)or
(IDR_STM and not STM_St)or
(IDR_LDM and not nLDM_St0)or
((IDR_SWP or IDR_SWPB)and not nSWP_St0)or
(IDR_MUL and not MUL_St)or
(IDR_MLA and not nMLA_St0)or
((IDR_UMULL or IDR_SMULL)and not nMULL_St0)or
((IDR_UMLAL or IDR_SMLAL)and not nMLAL_St0)
)and ExecuteInst)or
(LDR_St1 or -- LDR
(STM_St and not LSMStop) or -- STM Check???
(LDM_St1 or (LDM_St2 and not LSMStopDel))or -- LDM Check???
SWP_St1 or SWP_St2 or -- SWAP/SWAPB
((MUL_St or MLA_St2)and not MulResRdy)or MLA_St1 or -- MUL/MLA
MULL_St1 or MLAL_St1 or MLAL_St2 -- SMULL/UMULL/SMLAL
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -