📄 data_decode.vhd
字号:
LIBRARY IEEE;USE IEEE.std_logic_1164.ALL;USE IEEE.numeric_std.ALL;-- use packageUSE work.procmem_definitions.ALL;ENTITY data_decode ISPORT (-- inputsclk : IN STD_ULOGIC;rst_n : IN STD_ULOGIC;instr_25_21 : IN STD_ULOGIC_VECTOR(4 DOWNTO 0);instr_20_16 : IN STD_ULOGIC_VECTOR(4 DOWNTO 0);instr_15_0 : IN STD_ULOGIC_VECTOR(15 DOWNTO 0);reg_memdata : IN STD_ULOGIC_VECTOR(width-1 DOWNTO 0);alu_out : IN STD_ULOGIC_VECTOR(width-1 DOWNTO 0);-- control signalsRegDst : IN STD_ULOGIC;RegWrite : IN STD_ULOGIC;MemtoReg : IN STD_ULOGIC;-- outputsreg_A : OUT STD_ULOGIC_VECTOR(width-1 DOWNTO 0);reg_B : OUT STD_ULOGIC_VECTOR(width-1 DOWNTO 0);instr_15_0_se : OUT STD_ULOGIC_VECTOR(width-1 DOWNTO 0);instr_15_0_se_sl : OUT STD_ULOGIC_VECTOR(width-1 DOWNTO 0));END data_decode;ARCHITECTURE behave OF data_decode ISCOMPONENT regfile ISPORT (clk,rst_n : IN std_ulogic;wen : IN std_ulogic; -- write controlwriteport : IN std_ulogic_vector(width-1 DOWNTO 0); -- register inputadrwport : IN std_ulogic_vector(regfile_adrsize-1 DOWNTO 0);-- address writeadrport0 : IN std_ulogic_vector(regfile_adrsize-1 DOWNTO 0);-- address port 0adrport1 : IN std_ulogic_vector(regfile_adrsize-1 DOWNTO 0);-- address port 1readport0 : OUT std_ulogic_vector(width-1 DOWNTO 0); -- output port 0readport1 : OUT std_ulogic_vector(width-1 DOWNTO 0) -- output port 1);END COMPONENT;COMPONENT tempreg ISPORT (clk : IN STD_ULOGIC;rst_n : IN STD_ULOGIC;reg_in : IN STD_ULOGIC_VECTOR(width-1 DOWNTO 0);reg_out : OUT STD_ULOGIC_VECTOR(width-1 DOWNTO 0) );END COMPONENT;-- internal signalsSIGNAL write_reg : STD_ULOGIC_VECTOR(regfile_adrsize-1 DOWNTO 0);SIGNAL write_data : STD_ULOGIC_VECTOR(width-1 DOWNTO 0);SIGNAL data_1 : STD_ULOGIC_VECTOR(width-1 DOWNTO 0);SIGNAL data_2 : STD_ULOGIC_VECTOR(width-1 DOWNTO 0);BEGINA : tempregPORT MAP (clk => clk,rst_n => rst_n,reg_in => data_1,reg_out => reg_A );B : tempregPORT MAP (clk => clk,rst_n => rst_n,reg_in => data_2,reg_out => reg_B );inst_regfile : regfilePORT MAP (clk => clk,rst_n => rst_n,wen => RegWrite,writeport => write_data,adrwport => write_reg,adrport0 => instr_25_21,adrport1 => instr_20_16,readport0 => data_1,readport1 => data_2 );-- multiplexer for write registerwrite_reg <= instr_20_16 WHEN RegDst = '0' ELSEinstr_15_0(15 DOWNTO 11) WHEN RegDst = '1' ELSE(OTHERS => 'X');-- multiplexer for write datawrite_data <= alu_out WHEN MemtoReg = '0' ELSEreg_memdata WHEN MemtoReg = '1' ELSE(OTHERS => 'X');-- sign extension and shiftproc_sign_ext : PROCESS(instr_15_0)-- variables needed for reading result of sign extensionVARIABLE temp_instr_15_0_se : STD_ULOGIC_VECTOR(width-1 DOWNTO 0);VARIABLE temp_instr_15_0_se_sl : STD_ULOGIC_VECTOR(width-1 DOWNTO 0);BEGIN-- sign extend instr_15_0 to 32 bitstemp_instr_15_0_se := STD_ULOGIC_VECTOR(RESIZE(SIGNED(instr_15_0),instr_15_0_se'LENGTH));-- shift left 2temp_instr_15_0_se_sl := temp_instr_15_0_se(width-3 DOWNTO 0) & "00";instr_15_0_se <= temp_instr_15_0_se;instr_15_0_se_sl <= temp_instr_15_0_se_sl;END PROCESS;END behave;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -