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

📄 opcode_decoder.vhd

📁 用vhdl语用实现简单的16位cpu功能
💻 VHD
📖 第 1 页 / 共 3 页
字号:
					OP_CAT  <= MOVE_cRR_RU;					LAST    <= M2;					D_OP    <= ALU_MOVE_Y;					D_SX    <= SX_ANY;					D_SY    <= SY_UM;					D_SA    <= ADR_cRR_L;					D_RD_O  <= IS_M1;					D_WE_RR <= IS_M2;					PC_OP  <= pc(IS_M1, PC_WAIT);				when "1001001" =>					OP_CAT  <= MOVE_ci_RR;					LAST    <= M4;					D_SX    <= SX_RR;					D_SY    <= SY_UM;					PC_OP   <= pc(IS_M3, PC_WAIT);					D_OP    <= mix(IS_M4);					D_WE_RR <= IS_M3_M4;					D_SA    <= hadr(IS_M3, ADR_cI16_H);					D_RD_O  <= IS_M2_M3;					D_LOCK  <= IS_M2;				when "1001010" =>					OP_CAT  <= MOVE_ci_RS;					LAST    <= M3;					D_OP    <= ALU_MOVE_Y;					D_SX    <= SX_ANY;					D_SY    <= SY_SM;					D_SA    <= ADR_cI16_L;					D_RD_O  <= IS_M2;					D_WE_RR <= IS_M3;				when "1001011" =>					OP_CAT  <= MOVE_ci_RU;					LAST    <= M3;					D_OP    <= ALU_MOVE_Y;					D_SX    <= SX_ANY;					D_SY    <= SY_UM;					D_SA    <= ADR_cI16_L;					D_RD_O  <= IS_M2;					D_WE_RR <= IS_M3;				when "1001100" =>					OP_CAT  <= MOVE_ci_LL;					LAST    <= M4;					D_SX    <= SX_LL;					D_SY    <= SY_UM;					PC_OP   <= pc(IS_M3, PC_WAIT);					D_OP    <= mix(IS_M4);					D_SA    <= hadr(IS_M3, ADR_cI16_H);					D_RD_O  <= IS_M2_M3;					D_LOCK  <= IS_M2;					D_WE_LL <= IS_M3_M4;				when "1001101" =>					OP_CAT  <= MOVE_ci_LS;					LAST    <= M3;					D_OP    <= ALU_MOVE_Y;					D_SX    <= SX_ANY;					D_SY    <= SY_SM;					D_SA    <= ADR_cI16_L;					D_RD_O  <= IS_M2;					D_WE_LL <= IS_M3;				when "1001110" =>					OP_CAT  <= MOVE_ci_LU;					LAST    <= M3;					D_OP    <= ALU_MOVE_Y;					D_SX    <= SX_ANY;					D_SY    <= SY_UM;					D_SA    <= ADR_cI16_L;					D_RD_O  <= IS_M2;					D_WE_LL <= IS_M3;				when "1001111" =>					OP_CAT  <= MOVE_RR_SP;					D_SA    <= ADR_cRR_L;					D_WE_SP <= SP_LOAD;				-- 55555555555555555555555555555555555555555555555555555555555555555555				when "1010000" =>					-- spare				when "1010001" =>					-- spare				when "1010010" =>					OP_CAT  <= LSL_RR_i;					LAST    <= M2;					D_OP    <= ALU_X_LSL_Y;					D_SX    <= SX_RR;					D_SY    <= SY_UI8;					D_WE_RR <= IS_M1;				when "1010011" =>					OP_CAT  <= ASR_RR_i;					LAST    <= M2;					D_OP    <= ALU_X_ASR_Y;					D_SX    <= SX_RR;					D_SY    <= SY_UI8;					D_WE_RR <= IS_M1;				when "1010100" =>					OP_CAT  <= LSR_RR_i;					LAST    <= M2;					D_OP    <= ALU_X_LSR_Y;					D_SX    <= SX_RR;					D_SY    <= SY_UI8;					D_WE_RR <= IS_M1;				when "1010101" =>					OP_CAT  <= LSL_LL_RR;					D_OP    <= ALU_X_LSL_Y;					D_SX    <= SX_LL;					D_SY    <= SY_RR;					D_WE_RR <= IS_M1;				when "1010110" =>					OP_CAT  <= ASR_LL_RR;					D_OP    <= ALU_X_ASR_Y;					D_SX    <= SX_LL;					D_SY    <= SY_RR;					D_WE_RR <= IS_M1;				when "1010111" =>					OP_CAT  <= LSR_LL_RR;					D_OP    <= ALU_X_LSR_Y;					D_SX    <= SX_LL;					D_SY    <= SY_RR;					D_WE_RR <= IS_M1;				when "1011000" =>					OP_CAT  <= ADD_LL_RR;					D_OP    <= ALU_X_ADD_Y;					D_SX    <= SX_LL;					D_SY    <= SY_RR;					D_WE_RR <= IS_M1;				when "1011001" =>					OP_CAT  <= SUB_LL_RR;					D_OP    <= ALU_X_SUB_Y;					D_SX    <= SX_LL;					D_SY    <= SY_RR;					D_WE_RR <= IS_M1;				when "1011010" =>					OP_CAT  <= MOVE_RR_ci;					LAST    <= M3;					D_SX    <= SX_RR;					D_SY    <= SY_SY0;					D_OP    <= ALU_X_OR_Y;					D_SA    <= hadr(IS_M3, ADR_cI16_H);					D_WE_O  <= IS_M2_M3;					D_LOCK  <= IS_M2;					D_SMQ   <= IS_M3;				when "1011011" =>					OP_CAT  <= MOVE_R_ci;					LAST    <= M3;					D_SX    <= SX_RR;					D_SY    <= SY_SY0;					D_OP    <= ALU_X_OR_Y;					D_SA    <= ADR_cI16_L;					D_WE_O  <= IS_M2;				when "1011100" =>		-- long offset / long move					OP_CAT  <= MOVE_RR_uSP;					LAST    <= M3;					D_SX    <= SX_RR;					D_SY    <= SY_SY0;					D_OP    <= ALU_X_OR_Y;					D_SA    <= hadr(IS_M3, ADR_16SP_H);					D_WE_O  <= IS_M2_M3;					D_LOCK  <= IS_M2;					D_SMQ   <= IS_M3;				when "1011101" =>		-- short offset / long move					OP_CAT  <= MOVE_RR_uSP;					LAST    <= M2;					D_SX    <= SX_RR;					D_SY    <= SY_SY0;					D_OP    <= ALU_X_OR_Y;					D_SA    <= hadr(IS_M2, ADR_8SP_H);					D_WE_O  <= IS_M1_M2;					D_LOCK  <= IS_M1;					D_SMQ   <= IS_M2;				when "1011110" =>		-- long offset / short move					OP_CAT  <= MOVE_R_uSP;					LAST    <= M3;					D_SX    <= SX_RR;					D_SY    <= SY_SY0;					D_OP    <= ALU_X_OR_Y;					D_SA    <= ADR_16SP_L;					D_WE_O  <= IS_M2;					D_OP    <= ALU_X_OR_Y;				when "1011111" =>		-- short offset / short move					OP_CAT  <= MOVE_R_uSP;					LAST    <= M2;					D_SX    <= SX_RR;					D_SY    <= SY_SY0;					D_OP    <= ALU_X_OR_Y;					D_SA    <= ADR_8SP_L;					D_WE_O  <= IS_M1;					D_OP    <= ALU_X_OR_Y;				-- 66666666666666666666666666666666666666666666666666666666666666666666				when "1100000" =>	-- long offset, long move					OP_CAT <= MOVE_uSP_RR;					LAST   <= M4;					D_SX   <= SX_RR;					D_SY   <= SY_UM;					PC_OP   <= pc(IS_M3, PC_WAIT);					D_OP    <= mix(IS_M3_M4);					D_SA    <= hadr(IS_M3, ADR_16SP_H);					D_RD_O  <= IS_M2_M3;					D_LOCK  <= IS_M2;					D_WE_RR <= IS_M3_M4;				when "1100001" =>	-- short offset, long move					OP_CAT  <= MOVE_uSP_RR;					LAST    <= M3;					D_SX    <= SX_RR;					D_SY    <= SY_UM;					PC_OP   <= pc(IS_M2, PC_WAIT);					D_OP    <= mix(IS_M3);					D_SA    <= hadr(IS_M2, ADR_8SP_H);					D_RD_O  <= IS_M1_M2;					D_LOCK  <= IS_M1;					D_WE_RR <= IS_M2_M3;				when "1100010" =>	-- long offset, short move					OP_CAT  <= MOVE_uSP_RS;					LAST    <= M3;					D_OP    <= ALU_MOVE_Y;					D_SX    <= SX_RR;					D_SY    <= SY_SM;					D_SA    <= ADR_16SP_L;					D_RD_O  <= IS_M2;					D_WE_RR <= IS_M3;				when "1100011" =>	-- short offset, short move					OP_CAT  <= MOVE_uSP_RS;					LAST    <= M2;					D_OP    <= ALU_MOVE_Y;					D_SX    <= SX_RR;					D_SY    <= SY_SM;					D_SA    <= ADR_8SP_L;					D_RD_O  <= IS_M1;					D_WE_RR <= IS_M2;				when "1100100" =>	-- long offset, short move					OP_CAT  <= MOVE_uSP_RU;					LAST    <= M3;					D_OP    <= ALU_MOVE_Y;					D_SX    <= SX_RR;					D_SY    <= SY_UM;					D_SA    <= ADR_16SP_L;					D_RD_O  <= IS_M2;					D_WE_RR <= IS_M3;				when "1100101" =>	-- short offset, short move					OP_CAT  <= MOVE_uSP_RU;					LAST    <= M2;					D_OP    <= ALU_MOVE_Y;					D_SX    <= SX_RR;					D_SY    <= SY_UM;					D_SA    <= ADR_8SP_L;					D_RD_O  <= IS_M1;					D_WE_RR <= IS_M2;				when "1100110" =>	-- long offset, long move					OP_CAT  <= MOVE_uSP_LL;					LAST    <= M4;					D_SX    <= SX_LL;					D_SY    <= SY_UM;					PC_OP   <= pc(IS_M3, PC_WAIT);					D_OP    <= mix(IS_M4);					D_SA    <= hadr(IS_M3, ADR_8SP_H);					D_RD_O  <= IS_M2_M3;					D_LOCK  <= IS_M2;					D_WE_LL <= IS_M3_M4;				when "1100111" =>	-- short offset, long move					OP_CAT  <= MOVE_uSP_LL;					LAST    <= M3;					D_SX    <= SX_LL;					D_SY    <= SY_UM;					PC_OP   <= pc(IS_M2, PC_WAIT);					D_OP    <= mix(IS_M3);					D_SA    <= hadr(IS_M2, ADR_8SP_H);					D_RD_O  <= IS_M1_M2;					D_LOCK  <= IS_M1;					D_WE_LL <= IS_M2_M3;				when "1101000" =>	-- long offset, short move					OP_CAT  <= MOVE_uSP_LS;					LAST    <= M3;					D_OP    <= ALU_MOVE_Y;					D_SX    <= SX_RR;					D_SY    <= SY_SM;					D_SA    <= ADR_16SP_L;					D_RD_O  <= IS_M2;					D_WE_LL <= IS_M3;				when "1101001" =>	-- short offset, short move					OP_CAT  <= MOVE_uSP_LS;					LAST    <= M2;					D_OP    <= ALU_MOVE_Y;					D_SX    <= SX_RR;					D_SY    <= SY_SM;					D_SA    <= ADR_8SP_L;					D_RD_O  <= IS_M1;					D_WE_LL <= IS_M2;				when "1101010" =>	-- long offset, short move					OP_CAT  <= MOVE_uSP_LU;					LAST    <= M3;					D_OP    <= ALU_MOVE_Y;					D_SX    <= SX_RR;					D_SY    <= SY_UM;					D_SA    <= ADR_16SP_L;					D_RD_O  <= IS_M2;					D_WE_LL <= IS_M3;				when "1101011" =>	-- short offset, short move					OP_CAT  <= MOVE_uSP_LU;					LAST    <= M2;					D_OP    <= ALU_MOVE_Y;					D_SX    <= SX_RR;					D_SY    <= SY_UM;					D_SA    <= ADR_8SP_L;					D_RD_O  <= IS_M1;					D_WE_LL <= IS_M2;				when "1101100" =>					OP_CAT  <= LEA_uSP_RR;					LAST    <= M3;					D_OP    <= ALU_X_ADD_Y;					D_SX    <= SX_SP;					D_SY    <= SY_I16;					D_WE_RR <= IS_M2;				when "1101101" =>					OP_CAT  <= LEA_uSP_RR;					LAST    <= M2;					D_OP    <= ALU_X_ADD_Y;					D_SX    <= SX_SP;					D_SY    <= SY_UI8;					D_WE_RR <= IS_M1;				when "1101110" =>					OP_CAT  <= MOVE_dRR_dLL;					LAST    <= M3;					D_WE_RR <= IS_M1;					D_RD_O  <= IS_M1;					D_WE_O  <= IS_M2;					D_WE_LL <= IS_M3;					PC_OP  <= pc(IS_M1_M2, PC_WAIT);					case OP_CYC is						when M1 =>	-- decrement RR							D_OP    <= ALU_X_SUB_Y;							D_SX    <= SX_RR;							D_SY    <= SY_SY1;							D_SA    <= ADR_dRR;						when M2 =>	-- write read memory							D_OP    <= ALU_MOVE_Y;							D_SX    <= SX_ANY;							D_SY    <= SY_UM;							D_SA    <= ADR_dLL;						when others =>	-- decrement LL							D_OP    <= ALU_X_SUB_Y;							D_SX    <= SX_LL;							D_SY    <= SY_SY1;					end case;				when "1101111" =>					OP_CAT  <= MOVE_RRi_LLi;					LAST    <= M3;					D_WE_RR <= IS_M1;					D_RD_O  <= IS_M1;					D_WE_O  <= IS_M2;					D_WE_LL <= IS_M3;					PC_OP  <= pc(IS_M1_M2, PC_WAIT);					case OP_CYC is						when M1 =>	-- decrement RR							D_OP    <= ALU_X_ADD_Y;							D_SX    <= SX_RR;							D_SY    <= SY_SY1;							D_SA    <= ADR_RRi;						when M2 =>	-- write read memory							D_OP    <= ALU_MOVE_Y;							D_SX    <= SX_ANY;							D_SY    <= SY_UM;							D_SA    <= ADR_dLL;						when others =>	-- decrement LL							D_OP    <= ALU_X_ADD_Y;							D_SX    <= SX_LL;							D_SY    <= SY_SY1;					end case;				-- 77777777777777777777777777777777777777777777777777777777777777777777				when "1110000" =>					OP_CAT  <= MUL_IS;					D_OP    <= ALU_MUL_IS;					D_SX    <= SX_LL;					D_SY    <= SY_RR;					D_WE_RR <= IS_M1;				when "1110001" =>					OP_CAT  <= MUL_IU;					D_OP    <= ALU_MUL_IU;					D_SX    <= SX_LL;					D_SY    <= SY_RR;					D_WE_RR <= IS_M1;				when "1110010" =>					OP_CAT  <= DIV_IS;					D_OP    <= ALU_DIV_IS;					D_SX    <= SX_LL;					D_SY    <= SY_RR;					D_WE_RR <= IS_M1;				when "1110011" =>					OP_CAT  <= DIV_IU;					D_OP    <= ALU_DIV_IU;					D_SX    <= SX_LL;					D_SY    <= SY_RR;					D_WE_RR <= IS_M1;				when "1110100" =>					OP_CAT  <= MD_STEP;					D_OP    <= ALU_MD_STP;					D_SX    <= SX_LL;					D_SY    <= SY_RR;					D_WE_RR <= IS_M1;				when "1110101" =>					OP_CAT  <= MD_FIN;					D_OP    <= ALU_MD_FIN;					D_SX    <= SX_LL;					D_SY    <= SY_RR;					D_WE_RR <= IS_M1;				when "1110110" =>					OP_CAT  <= MOD_FIN;					D_OP    <= ALU_MOD_FIN;					D_SX    <= SX_LL;					D_SY    <= SY_RR;					D_WE_RR <= IS_M1;				when "1110111" =>					OP_CAT      <= EI;					ENABLE_INT  <= IS_M1;				when "1111001" =>					OP_CAT      <= DI;					DISABLE_INT <= IS_M1;				-- undefined --------------------------------------------------------				when others =>			end case;		end if;	end process;end Behavioral;

⌨️ 快捷键说明

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