Email: Password: Remember Me | Create Account (Free)

Back to Subject List

Old thread has been locked -- no new posts accepted in this thread
???
04/16/05 17:20
Read: times


 
#91730 - Here you go
Responding to: ???'s previous message
Yes steve was right:)I got all confused and friday-itis is my excuse.
Anyway here you go something which does what you want i think.You just write the multiplicand bytes to the lower and upper registers and then read the result from the three result regiters.I havent had much time to test it fully but it looks ok i would test it more but I am needed down the pub.




library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;


entity mult is

 port(

            clk         : in    std_logic;
            reset       : in    std_logic;
            addr_data   : inout std_logic_vector(7 downto 0);
            addr_high   : in   std_logic_vector(7 downto 0);
            ale         : in    std_logic;
            psen_n      : in    std_logic;
            rd_n        : in    std_logic;
            wr_n        : in    std_logic

           );

end mult;

architecture rtl of mult is


type UC_STATE_TYPE is (IDLE, ADDR_DECODE,ADDR_MATCH,END_CYCLE);
signal prs_state, next_state : UC_STATE_TYPE;
signal mult_low,mult_high,addr_data_int,reg_addr : std_logic_vector(7 downto 0);
signal result : signed(19 downto 0);
signal multiplier :signed(9 downto 0);
signal ale_i,psen_i,wr_i,rd_i,uc_data_oe :std_logic;


constant upper_addr :std_logic_vector:=X"FF";   ---register addresses
constant mult_low_addr   :std_logic_vector:=X"00";
constant mult_high_addr  :std_logic_vector:=X"01";
constant result_1_addr   :std_logic_vector:=X"02";
constant result_2_addr   :std_logic_vector:=X"03";
constant result_3_addr   :std_logic_vector:=X"04";

alias result_byte_1 :signed(7 downto 0) is result(7 downto 0);
alias result_byte_2 :signed(7 downto 0) is result(15 downto 8);
alias result_byte_3 :signed(3 downto 0) is result(19 downto 16);


begin


multiplier <=signed(mult_high(1 downto 0) & mult_low);
result<= multiplier*multiplier;
addr_data<=addr_data_int when (uc_data_oe='1') else (others=>'Z');


sync:process(clk)
begin
        if rising_edge(clk) then
                ale_i<=ale;
                psen_i<=psen_n;
                rd_i<=rd_n;
                wr_i<=wr_n;

        end if;
end process;



UC_REGS: process (clk)
begin

        if rising_edge(clk) then
                if reset = '1' then
                    prs_state <= IDLE;
                else
                    prs_state <= next_state;
                end if;

        end if;

end process;


Uc_decode: process (ale_i,wr_i,rd_i)

begin
uc_data_oe<='0';
        case prs_state is
        when IDLE =>

                if ale_i='1' and psen_i = '1' then
                next_state <= ADDR_DECODE;
                end if;

        when ADDR_DECODE =>
                if ale_i='0' then
                        if (addr_high=upper_addr) then
                                if (addr_data=mult_low_addr or addr_data=mult_high_addr or addr_data=result_1_addr or addr_data=result_2_addr or addr_data=result_3_addr) then
                                                reg_addr<=addr_data;
                                                next_state<=addr_match;
                                else next_state <=idle;
                                end if;
                        end if;
                end if;

        when ADDR_MATCH =>

                if wr_i='0' then
                        case reg_addr is
                        when mult_low_addr=>mult_low<=addr_data;
                        when mult_high_addr=>mult_high<=addr_data;
                        when others =>null;
                        end case;


                elsif rd_i='0' then
                        uc_data_oe<='1';

                                case reg_addr is
                                when result_1_addr=>addr_data_int<=std_logic_vector(result_byte_1);
                                when result_2_addr=>addr_data_int<=std_logic_vector(result_byte_2);
                                when result_3_addr=>addr_data_int<=std_logic_vector("0000" & result_byte_3);
                                when others =>null;
                                end case;
                elsif rd_i = '1' and wr_i = '1' then
                                next_state <= END_CYCLE;

                end if;

        when END_CYCLE =>

        if ale_i = '0' then
        next_state <= IDLE;
        end if;


        end case;

end process;

    end rtl;















































</body>
</html>


List of 66 messages in thread
TopicAuthorDate
Fast Square.            01/01/70 00:00      
   Square dancing            01/01/70 00:00      
      table lookup???            01/01/70 00:00      
   code & algorithm            01/01/70 00:00      
      16*16 bit is slower than what I want.            01/01/70 00:00      
         How fast?            01/01/70 00:00      
            Re: How Fast            01/01/70 00:00      
               ... probably impossible in 15 cycles            01/01/70 00:00      
                  why cycles ?            01/01/70 00:00      
                     Re: Microseconds            01/01/70 00:00      
                  table lookup            01/01/70 00:00      
   Natsemi appnote or CORDIC            01/01/70 00:00      
      Natsemi link to appnote            01/01/70 00:00      
   (a+b)^2=a^2+2*a*b+b^2            01/01/70 00:00      
      Thats Slow.            01/01/70 00:00      
         faster need hardware            01/01/70 00:00      
         How fast do you need?            01/01/70 00:00      
            Re: How Fast.            01/01/70 00:00      
               Just?            01/01/70 00:00      
                  Incorrect            01/01/70 00:00      
                     Correct?            01/01/70 00:00      
                        Whooooopa... Sorry.            01/01/70 00:00      
                           Thanks            01/01/70 00:00      
                        I tried...            01/01/70 00:00      
                  optimum? table driven            01/01/70 00:00      
      Jan metod            01/01/70 00:00      
   Hardware?            01/01/70 00:00      
      CPLD?            01/01/70 00:00      
   SILabs f12x does it in hardware            01/01/70 00:00      
      Re: SiLabs F12x            01/01/70 00:00      
   Price            01/01/70 00:00      
      F12x price            01/01/70 00:00      
         F12x MAC            01/01/70 00:00      
            provided in the datasheet            01/01/70 00:00      
   Just out of interest            01/01/70 00:00      
      clarification            01/01/70 00:00      
      CPLD?            01/01/70 00:00      
         too expensive            01/01/70 00:00      
            Absolute rubbish Oleg            01/01/70 00:00      
               explain            01/01/70 00:00      
               your right            01/01/70 00:00      
            especially for those...            01/01/70 00:00      
               I need to say this....            01/01/70 00:00      
               By the way.....            01/01/70 00:00      
   just a demo            01/01/70 00:00      
      Hang on.            01/01/70 00:00      
   Oh bollocks            01/01/70 00:00      
   Well oleg            01/01/70 00:00      
      Please check my answer.            01/01/70 00:00      
         Here you go            01/01/70 00:00      
            You're having me on.            01/01/70 00:00      
               Pascal?            01/01/70 00:00      
               Pascal?            01/01/70 00:00      
            Why ?            01/01/70 00:00      
               It was changed because,,,            01/01/70 00:00      
               Its because            01/01/70 00:00      
   For Jez            01/01/70 00:00      
      For Michael            01/01/70 00:00      
   simulation            01/01/70 00:00      
   Re: Fast Square            01/01/70 00:00      
   Prahlad, waithing for a conclusion            01/01/70 00:00      
      just an exercise...            01/01/70 00:00      
      Tricky            01/01/70 00:00      
         Jez asked his cat, I asked my sheep            01/01/70 00:00      
      Conclusion.            01/01/70 00:00      
      SPI EEPROM            01/01/70 00:00      

Back to Subject List