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

📄 dp32_rtl.vhd

📁 DLX CPU VHDL CODE UNIVERSITY
💻 VHD
📖 第 1 页 / 共 3 页
字号:
	  addr_latch_l : out bit;	  name_signext_en : out bit;	  shift_op : out bit_2;	  shift_mux : out bit;	  force_reg_31_dest : out bit;	  multdiv_op:out bit_2;	  fpadd_op:out bit_4;	  fp2_en:out bit;	  fpreg_port3_data_mux_sel: out bit;	  convert_op : out bit_3;	  fpreg_res_latch_en: out bit;	  fsr_latch_en: out bit;	  float_mux_sel: out bit_2;	  feedback_latch_l:out bit;	  feedback_latch_en:out bit;	  fpdisp_out_oen:out bit;	  fpdisp_out_len:out bit;	  fpreg_port3_incr:out bit;	  fpreg_port2_incr:out bit;	  fpmult_op:out bit_2;	  fpdiv_op:out bit_2;	  fsr_mux_sel: out bit_2);	      port map (rom_address => rom_address,	      rom_data => rom_data,	      fsr_out=>fsr_out,	      phi1 => phi1, phi2 => phi2,      	      reset => reset,      	      opcode => instr_op,	      opcode_ex => instr_fu,	      ready => ready,      	      read => read, write => write,      	      addr_latch_en => addr_latch_en,      	      instr_latch_en => instr_latch_en,      	      immed_signext_en => immed_signext_en,      	      ALU_op => ALU_op,	      PC_out_en1 => PC_out_en1,	      PC_out_en2 => PC_out_en2,      	      fpreg_port1_en => fpreg_port1_en,      	      fpreg_port2_en => fpreg_port2_en,      	      fpreg_port3_en => fpreg_port3_en,              fpreg_port4_en => fpreg_port4_en,      	      reg_port1_en => reg_port1_en,      	      reg_port2_en => reg_port2_en,      	      reg_port3_en => reg_port3_en,              reg_port4_en => reg_port4_en,	      fpreg_port1_mux_sel => fpreg_port1_mux_sel,	      fpreg_port2_mux_sel => fpreg_port2_mux_sel,	      fpreg_port3_mux_sel => fpreg_port3_mux_sel,	      reg_port1_mux_sel => reg_port1_mux_sel,      	      reg_port2_mux_sel => reg_port2_mux_sel,	      reg_port3_mux_sel => reg_port3_mux_sel,              reg_port4_mux_sel => reg_port4_mux_sel,	      reg_res_latch_en => reg_res_latch_en,	      main_mux_sel => main_mux_sel,	      datao_latch_oen=>datao_latch_oen,	      datao_latch_len =>datao_latch_len, 	      fpdatao_latch_oen=>fpdatao_latch_oen,	      fpdatao_latch_len =>fpdatao_latch_len, 	      jump => jump,	      jump_without_add => jump_without_add,	      PC_incr => PC_incr,	      addr_latch_l => addr_latch_l,	      name_signext_en => name_signext_en,	      shift_op => shift_op,	      shift_mux => shift_mux,	      force_reg_31_dest => force_reg_31_dest,	      multdiv_op =>multdiv_op,	      fpadd_op=>fpadd_op,	      fp2_en=>fp2_en,	      fpreg_port3_data_mux_sel=>fpreg_port3_data_mux_sel,	      convert_op=>convert_op,	      fpreg_res_latch_en=>fpreg_res_latch_en,	      fsr_latch_en=>fsr_latch_en,	      float_mux_sel=>float_mux_sel,	      feedback_latch_l=>feedback_latch_l,	      feedback_latch_en=>feedback_latch_en,	      fpdisp_out_oen=>fpdisp_out_oen,	      fpdisp_out_len=>fpdisp_out_len,	      fpreg_port3_incr=>fpreg_port3_incr,	      fpreg_port2_incr=>fpreg_port2_incr,	      fpmult_op=>fpmult_op,	      fpdiv_op=>fpdiv_op,	      fsr_mux_sel=>fsr_mux_sel);  begin -- control  -- this processor just reades the opcode for the curent state, and  -- and outputs the control signals at the specific time that they  -- are required as dictated by what clock cycle ther are set in,  -- ie look below and see how some are set when phi1='1' and some  -- are set when phi1 falls to '0'.  state_machine: process       variable state:natural;      variable next_state:natural :=0;	  -- map out the control signals ont he micro rom data bus      	  alias Aread:  bit is rom_data(0);	  alias Awrite : bit is rom_data(1);      	  alias Aaddr_latch_en : bit is rom_data(2);      	  alias Ainstr_latch_en : bit is rom_data(3);      	  alias Aimmed_signext_en : bit is rom_data(4);      	  alias AALU_op : bit_5 is rom_data(9 downto 5);	  alias APC_out_en1 :  bit is rom_data(10);	  alias APC_out_en2 :  bit is rom_data(11);      	  alias Afpreg_port1_en : bit is rom_data(12);      	  alias Afpreg_port2_en : bit is rom_data(13);      	  alias Afpreg_port3_en : bit is rom_data(14);          alias Afpreg_port4_en : bit is rom_data(15);      	  alias Areg_port1_en : bit is rom_data(16);      	  alias Areg_port2_en : bit is rom_data(17);      	  alias Areg_port3_en : bit is rom_data(18);          alias Areg_port4_en : bit is rom_data(19);	  alias Afpreg_port1_mux_sel : bit is rom_data(20);      	  alias Afpreg_port2_mux_sel : bit is rom_data(21);	  alias Afpreg_port3_mux_sel : bit is rom_data(22);	  alias Areg_port1_mux_sel : bit is rom_data(23);      	  alias Areg_port2_mux_sel : bit is rom_data(24);      	  alias Areg_port3_mux_sel : bit is rom_data(25); 	  alias Areg_port4_mux_sel : bit is rom_data(26);	  alias Areg_res_latch_en : bit is rom_data(27);	  alias Amain_mux_sel : bit_vector(2 downto 0) is rom_data(30 downto 28);	  alias Adatao_latch_oen: bit is rom_data(31);	  alias Adatao_latch_len : bit is rom_data(32);	  alias Afpdatao_latch_oen: bit is rom_data(33);	  alias Afpdatao_latch_len : bit is rom_data(34);	  alias Ajump : bit is rom_data(35);	  alias Ajump_without_add : bit is rom_data(36);          alias APC_incr : bit is rom_data(37);	  alias Aaddr_latch_l :  bit is rom_data(38);	  alias Aname_signext_en : bit is rom_data(39);	  alias Ashift_op : bit_2 is rom_data(41 downto 40);	  alias Ashift_mux : bit is rom_data(42);	  alias Aforce_reg_31_dest : bit is rom_data(43);	  alias Abeqz : bit is rom_data(44);	  alias Abnez : bit is rom_data(45);     	  alias Amultdiv_op : bit_2 is rom_data(47 downto 46);           alias Afsr_latch_en : bit is rom_data(48);	  alias Afpreg_port3_incr : bit is rom_data(49);          alias Afp2_en: bit is rom_data(50);	  alias Afpreg_port3_data_mux_sel: bit is rom_data(51);	  alias Aconvert_op:bit_3 is rom_data(54 downto 52);          alias Afpreg_res_latch_en:bit is rom_data(55);	  alias Afpadd_op : bit_4 is rom_data(59 downto 56);	  alias Afloat_mux_sel :bit_2 is rom_data(61 downto 60);	  alias Afeedback_latch_l: bit is rom_data(62);	  alias Afeedback_latch_en: bit is rom_data(63);	  alias Afpdisp_out_oen: bit is rom_data(64);	  alias Afpdisp_out_len: bit is rom_data(65);	  alias Afpreg_port2_incr: bit is rom_data(66);          alias Abfpt: bit is rom_data(67);          alias Abfpf: bit is rom_data(68);	  alias Afpmult_op: bit_2 is rom_data(70 downto 69);	  alias Afpdiv_op: bit_2 is rom_data(72 downto 71);	  alias Afsr_mux_sel: bit_2 is rom_data(74 downto 73);          alias Anext_op : bit is rom_data(95);	variable temp:bit_32;   begin -- state machine    -- set the state #    state:=next_state;    -- get the contol line values for this state    natural_to_bits(state,temp);    rom_address<=temp;      ------------------------------------------------------------    wait until phi1='1';  ------------------------------------------------------------        --set the control lines that need to be set in the very	--beginning of cycle	fsr_mux_sel<=Afsr_mux_sel;        fpdiv_op<=Afpdiv_op;	fpmult_op<=Afpmult_op;	fpdisp_out_oen<=Afpdisp_out_oen;	fpreg_port3_incr<=Afpreg_port3_incr;	fpreg_port2_incr<=Afpreg_port2_incr;	fp2_en<=Afp2_en;	immed_signext_en<=Aimmed_signext_en;	ALU_op<=AALU_op;	multdiv_op<=Amultdiv_op;	fpadd_op<=Afpadd_op;	PC_out_en1<=APC_out_en1; -- full cycle, no turn off	PC_out_en2<=APC_out_en2;	reg_port1_en<=Areg_port1_en;	reg_port2_en<=Areg_port2_en;	reg_port4_en<=Areg_port4_en;	fpreg_port1_mux_sel<=Afpreg_port1_mux_sel;	fpreg_port2_mux_sel<=Afpreg_port2_mux_sel;	fpreg_port3_mux_sel<=Afpreg_port3_mux_sel;	reg_port1_mux_sel<=Areg_port1_mux_sel;	reg_port2_mux_sel<=Areg_port2_mux_sel;	reg_port3_mux_sel<=Areg_port3_mux_sel;	reg_port4_mux_sel<=Areg_port4_mux_sel;	main_mux_sel<=Amain_mux_sel;	float_mux_sel<=Afloat_mux_sel;	datao_latch_oen<=Adatao_latch_oen;		fpdatao_latch_oen<=Afpdatao_latch_oen;	PC_incr<=APC_incr;		name_signext_en<=Aname_signext_en;	jump_without_add<=Ajump_without_add;	shift_op<=Ashift_op;	shift_mux<=Ashift_mux;	force_reg_31_dest<=Aforce_reg_31_dest;        feedback_latch_l<=Afeedback_latch_l;	addr_latch_en<=Aaddr_latch_en;	feedback_latch_en<=Afeedback_latch_en;	fpreg_port3_data_mux_sel<=Afpreg_port3_data_mux_sel;		fpreg_res_latch_en<=Afpreg_res_latch_en;		-- some lines cant be set till others settle, so wait	wait for 15 ns; -- for logic to stabalize	fpreg_port1_en<=Afpreg_port1_en;	fpreg_port2_en<=Afpreg_port2_en;	convert_op<=Aconvert_op;	fpreg_port3_en<=Afpreg_port3_en;	fpreg_port4_en<=Afpreg_port4_en;	reg_port3_en<=Areg_port3_en;	--jump if a jump instruction and condition is met	jump<=Ajump or (Abeqz and bool_to_bit(dlatch=X"0000_0000")) or (Abnez and not bool_to_bit(dlatch=X"0000_0000")) or (Abfpt and bool_to_bit(fsr_out(12)='1')) or (Abfpf and bool_to_bit(fsr_out(12)='0'));	write<=Awrite;	wait for 30 ns;  ------------------------------------------------------------    wait until phi1='0';  ------------------------------------------------------------		reg_res_latch_en<=Areg_res_latch_en;		fpreg_port3_en<='0';	fpreg_port3_incr<='0';	fpdisp_out_oen<='0';	write<='0';	fpdatao_latch_oen<='0';	--wait a bit before doing this	wait for 10 ns; --	read<=Aread;	  ------------------------------------------------------------    wait until phi2='1';  ------------------------------------------------------------	fpdisp_out_len<=Afpdisp_out_len;	addr_latch_en<='0';		read<='0';	jump<='0';	addr_latch_l<=Aaddr_latch_l; -- when pipelined, we will need to somehow make the address changeable in mid cycle to aloow for a read and a write	datao_latch_len<=Adatao_latch_len;	fpdatao_latch_len<=Afpdatao_latch_len;	feedback_latch_l<='0';	PC_incr<='0';	instr_latch_en<=Ainstr_latch_en;		fsr_latch_en<=Afsr_latch_en;    wait for 15 ns;	jump_without_add<='0';   wait for 10 ns;	addr_latch_l<='0';   ------------------------------------------------------------    wait until phi2='0';  ------------------------------------------------------------		fsr_mux_sel<="00";	fpdiv_op<=b"00";	fpmult_op<=b"00";	fpdisp_out_len<='0';	fp2_en<='0';	fsr_latch_en<='0';	fpreg_port2_incr<='0';	feedback_latch_en<='0';	instr_latch_en<='0';	immed_signext_en<='0';	ALU_op<="00000";	multdiv_op<="00";	fpadd_op<="0000";	PC_out_en2<='0';	fpreg_port1_en<='0';	fpreg_port2_en<='0';	fpreg_port4_en<='0';	reg_port1_en<='0';	reg_port2_en<='0';	reg_port3_en<='0';	reg_port4_en<='0';	fpreg_port1_mux_sel<='0';	fpreg_port2_mux_sel<='0';	fpreg_port3_mux_sel<='0';	reg_port1_mux_sel<='0';	reg_port2_mux_sel<='0';	reg_port3_mux_sel<='0';	reg_port4_mux_sel<='0';	reg_res_latch_en<='0';	main_mux_sel<="000";	float_mux_sel<="00";	datao_latch_oen<='0';	datao_latch_len<='0';	fpdatao_latch_len<='0';	name_signext_en<='0';	shift_op<="00";	shift_mux<='0';	force_reg_31_dest<='0';	fpreg_port3_data_mux_sel<='0';	convert_op<="000";	fpreg_res_latch_en<='0';	-- calculate next state	-- if we are at the end of an instruction (ie        -- bit 94 is set in this states microcode rom)        -- start at state 1        -- if we are at state 2 then use opcode to determine new location.	if(state=2) then	case opcode is          when "000000" =>	    next_state:=bits_to_uint(bits_or(opcode_ex, "1000000"))*8;	  	  when "000001" => 	    next_state:=bits_to_uint(bits_or(opcode_ex, "10000000"))*8;	  	  when others =>	 	    next_state:=bits_to_uint(opcode)*8;	  end case;	else	  next_state:=state+1;	end if;	if (Anext_op = '1' ) then	  next_state :=1;	end if;  end process state_machine;  end block control;  end block controller;  end RTL;

⌨️ 快捷键说明

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