---------------------------------------------------------------------------------- -- Company: -- Engineer: Jens Weiss -- -- Create Date: 14:20:28 05/19/2024 -- Design Name: -- Module Name: Opcode_Rom - Behavioral -- Project Name: -- Target Devices: -- Tool versions: ISE 14.7 (P20121013) -- Description: -- -- Dependencies: -- -- Revision: -- Revision 0.01 - File Created -- Additional Comments: -- all rights reserved ---------------------------------------------------------------------------------- library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.NUMERIC_STD.ALL; entity Opcode_Rom is Generic( PC_WIDTH : natural := 8; --memory depth = 2^PC_WIDTH DATAWIDTH : natural := 35); Port ( clk : in std_logic; A : in std_logic_vector(PC_WIDTH-1 downto 0); Dout : out std_logic_vector(DATAWIDTH-1 downto 0) ); end Opcode_Rom; architecture Behavioral of Opcode_Rom is signal RomAddr : integer range 0 to (2**PC_WIDTH)-1; type Rom is array (0 to (2**PC_WIDTH)-1) of std_logic_vector(DATAWIDTH-1 downto 0); -- Op_A_sel(3) | Op_B_sel(3) | Op_Load_sel(3) | Operation(5) | MAC Shift(3) | Ram Adr_A(6) | Ram Adr_B(6) | Ram Adr Write(6) constant Parameter_Rom : Rom := ( --load and store parameter "11011011000010000000000000000000000", -- 0: calculate start Adress for Parameter "00000000001101000000000000000000000", -- 1: load Parameter from extMem "01111011000010000000000000000000001", -- 2: store Parameter Current_Scale "10011011000010000000000000000000010", -- 3: store Parameter Voltage_Scale "11000000001011000000000000000000000", -- 4: increment extMem Adress "00000000001101000000000000000000000", -- 5: load Parameter from extMem "01111011000010000000000000000000011", -- 6: store CurrentD_KP_Gain "10011011000010000000000000000000100", -- 7: store CurrentD_KI_Gain "11000000001011000000000000000000000", -- 8: increment extMem Adress "00000000001101000000000000000000000", -- 9: load Parameter from extMem "01111011000010000000000000000000101", -- 10: store CurrentQ_KP_Gain "10011011000010000000000000000000110", -- 11: store CurrentQ_KI_Gain "11000000001011000000000000000000000", -- 12: increment extMem Adress "00000000001101000000000000000000000", -- 13: load Parameter from extMem "01111011000010000000000000000000111", -- 14: store MAX_PWM "10011011000010000000000000000001000", -- 15: store PWM_Frequency "11000000001011000000000000000000000", -- 16: increment extMem Adress "00000000001101000000000000000000000", -- 17: load Parameter from extMem "01111011000010000000000000000001001", -- 18: store ADCA_Offset "10011011000010000000000000000001010", -- 19: store ADCB_Offset "11000000001011000000000000000000000", -- 20: increment extMem Adress "00000000001101000000000000000000000", -- 21: load Parameter from extMem "01111011000010000000000000000001011", -- 22: store ADC_I_Offset_L1 "10011011000010000000000000000001100", -- 23: store ADC_I_Offset_L3 "11000000001011000000000000000000000", -- 24: increment extMem Adress "00000000001101000000000000000000000", -- 25: load Parameter from extMem "01111011000010000000000000000001101", -- 26: store ADC_Filter_A "10011011000010000000000000000001110", -- 27: store ADC_Filter_B --store ADC values to Ram "11111011000010000001000000000000000", -- 28: calculate start Adress for ADC Data "00000000001101000000000000000000000", -- 29: load Parameter from extMem "01111011000010000000000000000001111", -- 30: store Current Phase A "10011011000010000000000000000010001", -- 31: store Udc_Link "11000000001011000000000000000000000", -- 32: increment extMem Adress "00000000001101000000000000000000000", -- 33: load Parameter from extMem "01111011000010000000000000000010000", -- 34: store Current Phase B "10011011000010000000000000000010010", -- 35: store ADC Temp "11000000001011000000000000000000000", -- 36: increment extMem Adress "00000000001101000000000000000000000", -- 37: load Parameter from extMem "01111011000010000000000000000010011", -- 38: store SetpointQ "10011011000010000000000000000010100", -- 39: store SetpointD "11000000001011000000000000000000000", -- 40: increment extMem Adress "00000000001101000000000000000000000", -- 41: load Parameter from extMem "01111011000010000000000000000010101", -- 42: store Theta --calculate currents and voltages from ADC adn filter UDC-Link "00000111000001000001111001011001111", -- 43: Current_Phase_A = Current_Phase_A - Current_L1_Offset "00000111000010101001111000001001111", -- 44: Current_Phase_A = Current_Phase_A * Current_Scale/1024 "00000111000001000010000001100010000", -- 45: Current_Phase_B = Current_Phase_B - Current_L3_Offset "00000100100010101010000000001010000", -- 46: Current_Phase_B = Current_Phase_B * Current_Scale/1024 "00010100101111000010000001111010000", -- 47: Current_Phase_B = (-1 * Current_Phase_B) - Current_Phase_A "00000111000001000010001001001010001", -- 48: Udc_Link = Udc_Link - ADCA_Offset "00000111000010101010001000010010001", -- 49: Udc_Link = Udc_Link * Voltage_Scale/1024 "00000111000001000010010001010010010", -- 50: ADC_Temp = ADC_Temp - ADCB_Offset "00000111000010111010001001101011001", -- 51: Temp1 = (Udc_Link * ADC_Filter_A/4096) "00000111000010111010110001101011010", -- 52: Temp2 = (Udc_old * ADC_Filter_A/4096) "00000111000010111011000001110011011", -- 53: Temp3 = (Udc_filtered_old * ADC_Filter_B/4096) "00000111000000000011001011010010111", -- 54: Udc-filtered = Temp1 + Temp2 "00000111000000000010111011011010111", -- 55: Udc-filtered = Udc_filtered + Temp3 "00011011000010000010001011011010110", -- 56: Udc-old = 1 * Udc_Link "00011011000010000010111011011011000", -- 57: Udc_filtered_old = 1 * Udc_filtered others => "00000000000000000000000000000000000" ); begin --BROM process begin wait until rising_edge(clk); RomAddr <= to_integer(unsigned(A)); -- clocked address --> BRAM end process; Dout <= std_logic_vector(Parameter_Rom(RomAddr)); end Behavioral;