neo430
neo430 copied to clipboard
Starter had some Q for the imem and dmem .
In the neo430 Xmen .vhd , we knows 1x16bit splite to 2x8bit , but why the WEbit is 2bit ? I see the RTL, Xmem's R/W_ADDR was connect to addr_i [9:1] , I donot understand it .....
RTL/ Xmem.vhd : acc_en <= '1' when (addr_i >= imem_base_c) and (addr_i < std_ulogic_vector(unsigned(imem_base_c) + IMEM_SIZE)) else '0'; addr <= to_integer(unsigned(addr_i(index_size_f(IMEM_SIZE/2) downto 1))); -- word aligned
i want to use 2pcs 8bit eeprom and 2pcs 8bit sram replace the imem and dmem , when i use 2x8bit memory , i splite the data[15:0] to data[15:8] and data[7:0] , only 1 WEbit , can it works ? i found the ice40up Xmem.vhd :
spram_we <= '1' when ((acc_en and (wren_i(0) or wren_i(1))) = '1') else '0'; -- global write enable spram_be(1 downto 0) <= "11" when (wren_i(0) = '1') else "00"; -- low byte write enable spram_be(3 downto 2) <= "11" when (wren_i(1) = '1') else "00"; -- high byte write enable
does it means every clk only to do 1 mission : only read / write low byte / write high byte / write a word ? so ........for mychip( clk, addr, dout, din , we ) ---> it need to writing like these ? mymem_clk <= std_logic(clk_i); mymem_addr <= std_logic_vector(addr_i(13+1 downto 0+1)); -- addr /2 mymem_din <= std_logic_vector(data_i(15 downto 0)); rdata <= std_ulogic_vector(mymem_dout ); mymem_we_low <=std_logic( wren_i(0) ); mymem_we_high <=std_logic( wren_i(0) );
acc_en is not need now ? how about the 16bit flash and 16bit sdram interface ?
mymem_clk <= std_logic(clk_i); mymem_addr <= std_logic_vector(addr_i(13+1 downto 0+1)); -- addr /2 mymem_din <= std_logic_vector(data_i(15 downto 0)); rdata <= std_ulogic_vector(mymem_dout ); mymem_we <=std_logic( wren_i(0) or wren_i(1) );
sorry for my VHDL , i just learn it yesterday ........
In the neo430 Xmen .vhd , we knows 1x16bit splite to 2x8bit , but why the WEbit is 2bit ? I see the RTL, Xmem's R/W_ADDR was connect to addr_i [9:1] , I donot understand it .....
The memories are based on 16-bit words, which are byte-adressable. The adress signal selects a "complete 16-bit word" and the two write-enable bits select which byte/bytes to write (the upper or/and the lower one).
i want to use 2pcs 8bit eeprom and 2pcs 8bit sram replace the imem and dmem , when i use 2x8bit memory , i splite the data[15:0] to data[15:8] and data[7:0] , only 1 WEbit , can it works ? i found the ice40up Xmem.vhd :
You can do that but. You need to provide the same address to both memories and you will need the two byte-enable signals to select which memory to write to.
does it means every clk only to do 1 mission : only read / write low byte / write high byte / write a word ? so ........for mychip( clk, addr, dout, din , we ) ---> it need to writing like these ? mymem_clk <= std_logic(clk_i); mymem_addr <= std_logic_vector(addr_i(13+1 downto 0+1)); -- addr /2 mymem_din <= std_logic_vector(data_i(15 downto 0)); rdata <= std_ulogic_vector(mymem_dout ); mymem_we_low <=std_logic( wren_i(0) ); mymem_we_high <=std_logic( wren_i(0) );
Looks fine BUT you need wren_i(1) to write to high-memory.
mymem_we_low <=std_logic( wren_i(0) );
mymem_we_high <=std_logic( wren_i(1) );
acc_en is not need now ?
The acc_en signal is required to check if the memory is accessed at all. This signal is set by an address-range comparison.
how about the 16bit flash and 16bit sdram interface ?
The NEO430 memory interface cannot be used to access SDRAM directly. You will need an SDRAM controller (like Xilinx mig) that is responsible for memory management (for example for memory refresh).