Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > VHDL > Simple ALU Implementation

Reply
Thread Tools

Simple ALU Implementation

 
 
andrezz
Guest
Posts: n/a
 
      11-13-2008
Hi guys,
I have to implement a simple ALU of a 32bit mips..I have already
implemented many submodules (adder,multipliers,shifter...) ,that I
have to instantiate in the top level module "ALU_TOP". This module
receives as input 2 op. (a , b) and a 6bit signal OPCODE on which
basis the differents modules are instantiates.

My problem is checking the signal OPCODE directly in the architecture
(not in a process , and after begin of arch.). I used that solution
because using a process returned me errors reusing the components (and
portamaps...)
But now I cannot even check the OPCODE ("If not allowed..")..(I double
checked parenthesis or typos..)...

what should I do? Do I have to use a process? But how to use different
modules within a process?

I paste the simple part of the code .. and this not work..
Code:


library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity alu_top is


Generic (N:integer:=32);

Port ( A : in STD_LOGIC_VECTOR(N-1 downto 0);
B : in STD_LOGIC_VECTOR(N-1 downto 0);
OPCODE : in STD_LOGIC_VECTOR(5 downto 0);
FUNCT : in STD_LOGIC_VECTOR(5 downto 0);
COND : out STD_LOGIC;
ALUOut : out STD_LOGIC_VECTOR(N-1 downto 0)
);
end alu_top;

architecture Behavioral of alu_top is

component multiplier_s_u is

generic(N:integer:=16);

Port ( A : in STD_LOGIC_VECTOR(N-1 downto 0);
B : in STD_LOGIC_VECTOR(N-1 downto 0);
SIGN : in STD_LOGIC;--signed/unsigned selector
M : out STD_LOGIC_VECTOR((2*N)-1 downto 0));--output da 32
bit
end component multiplier_s_u;


begin

if OPCODE="000000" then
cond<='0';

end if;

end Behavioral;

---
ERROR:HDLParsers:164 - "F:/Poli/SDSS/MyProjects/MIPS/alu_top.vhd" Line
50. parse error, unexpected IF

Thanks in advance
 
Reply With Quote
 
 
 
 
Dave
Guest
Posts: n/a
 
      11-13-2008
On Nov 13, 3:50*pm, andrezz <(E-Mail Removed)> wrote:
> Hi guys,
> I have to implement a simple ALU of a 32bit mips..I have already
> implemented many submodules (adder,multipliers,shifter...) ,that I
> have to instantiate in the top level module "ALU_TOP". This module
> receives as input 2 op. (a , b) and a 6bit signal OPCODE on which
> basis the differents modules are instantiates.
>
> My problem is checking the signal OPCODE directly in the architecture
> (not in a process , and after begin of arch.). I used that solution
> because using a process returned me errors reusing the components (and
> portamaps...)
> But now I cannot even check the OPCODE ("If not allowed..")..(I double
> checked parenthesis or typos..)...
>
> what should I do? Do I have to use a process? But how to use different
> modules within a process?
>
> I paste the simple part of the code .. and this not work..
> Code:
>
> library IEEE;
> use IEEE.STD_LOGIC_1164.ALL;
> use IEEE.STD_LOGIC_ARITH.ALL;
> use IEEE.STD_LOGIC_UNSIGNED.ALL;
>
> entity alu_top is
>
> * * * * Generic (N:integer:=32);
>
> * * Port ( A : in *STD_LOGIC_VECTOR(N-1 downto 0);
> * * * * * *B : in *STD_LOGIC_VECTOR(N-1 downto 0);
> * * * * * *OPCODE : in *STD_LOGIC_VECTOR(5 downto 0);
> * * * * * *FUNCT : in *STD_LOGIC_VECTOR(5 downto 0);
> * * * * * *COND : out *STD_LOGIC;
> * * * * * *ALUOut : out *STD_LOGIC_VECTOR(N-1 downto 0)
> * * * * * * * * * * * * * );
> end alu_top;
>
> architecture Behavioral of alu_top is
>
> component multiplier_s_u is
>
> * * * * *generic(N:integer:=16);
>
> * * Port ( A : in *STD_LOGIC_VECTOR(N-1 downto 0);
> * * * * * *B : in *STD_LOGIC_VECTOR(N-1 downto 0);
> * * * * * *SIGN : in *STD_LOGIC;--signed/unsigned selector
> * * * * * *M : out *STD_LOGIC_VECTOR((2*N)-1 downto 0));--output da 32
> bit
> end component multiplier_s_u;
>
> begin
>
> if OPCODE="000000" *then
> cond<='0';
>
> end if;
>
> end Behavioral;
>
> ---
> ERROR:HDLParsers:164 - "F:/Poli/SDSS/MyProjects/MIPS/alu_top.vhd" Line
> 50. parse error, unexpected IF
>
> Thanks in advance


The if-then-else structure must be used inside of a process. It may
not be used in the concurrent section of the architecture.

Dave
 
Reply With Quote
 
 
 
 
kennheinrich@sympatico.ca
Guest
Posts: n/a
 
      11-13-2008
On Nov 13, 4:30*pm, Dave <(E-Mail Removed)> wrote:
> On Nov 13, 3:50*pm, andrezz <(E-Mail Removed)> wrote:
>
>
>
> > Hi guys,
> > I have to implement a simple ALU of a 32bit mips..I have already
> > implemented many submodules (adder,multipliers,shifter...) ,that I
> > have to instantiate in the top level module "ALU_TOP". This module
> > receives as input 2 op. (a , b) and a 6bit signal OPCODE on which
> > basis the differents modules are instantiates.

>
> > My problem is checking the signal OPCODE directly in the architecture
> > (not in a process , and after begin of arch.). I used that solution
> > because using a process returned me errors reusing the components (and
> > portamaps...)
> > But now I cannot even check the OPCODE ("If not allowed..")..(I double
> > checked parenthesis or typos..)...

>
> > what should I do? Do I have to use a process? But how to use different
> > modules within a process?

>
> > I paste the simple part of the code .. and this not work..
> > Code:

>
> > library IEEE;
> > use IEEE.STD_LOGIC_1164.ALL;
> > use IEEE.STD_LOGIC_ARITH.ALL;
> > use IEEE.STD_LOGIC_UNSIGNED.ALL;

>
> > entity alu_top is

>
> > * * * * Generic (N:integer:=32);

>
> > * * Port ( A : in *STD_LOGIC_VECTOR(N-1 downto 0);
> > * * * * * *B : in *STD_LOGIC_VECTOR(N-1 downto 0);
> > * * * * * *OPCODE : in *STD_LOGIC_VECTOR(5 downto 0);
> > * * * * * *FUNCT : in *STD_LOGIC_VECTOR(5 downto 0);
> > * * * * * *COND : out *STD_LOGIC;
> > * * * * * *ALUOut : out *STD_LOGIC_VECTOR(N-1 downto 0)
> > * * * * * * * * * * * * * );
> > end alu_top;

>
> > architecture Behavioral of alu_top is

>
> > component multiplier_s_u is

>
> > * * * * *generic(N:integer:=16);

>
> > * * Port ( A : in *STD_LOGIC_VECTOR(N-1 downto 0);
> > * * * * * *B : in *STD_LOGIC_VECTOR(N-1 downto 0);
> > * * * * * *SIGN : in *STD_LOGIC;--signed/unsigned selector
> > * * * * * *M : out *STD_LOGIC_VECTOR((2*N)-1 downto 0));--output da 32
> > bit
> > end component multiplier_s_u;

>
> > begin

>
> > if OPCODE="000000" *then
> > cond<='0';

>
> > end if;

>
> > end Behavioral;

>
> > ---
> > ERROR:HDLParsers:164 - "F:/Poli/SDSS/MyProjects/MIPS/alu_top.vhd" Line
> > 50. parse error, unexpected IF

>
> > Thanks in advance

>
> The if-then-else structure must be used inside of a process. It may
> not be used in the concurrent section of the architecture.
>
> Dave


If you want to do something like this outside a process, use a
concurrent signal assignment structured as a selected signal
assignment or conditional signal assignment(Google these terms). This
only lets you assign to one signal, though.

Example:

cond <=
'0' when OPCODE = "000000" else
'1' when OPCODE = "111111" else
'X';

or the other form is

with OPCODE select cond <=
'0' when "000000" ,
'1' when "11111",
'X' when others;

These are merely shorthands for writing the equivalent sequential if-
statement or case-statement inside a new process. (In VHDL, everything
you find in an architecture body is just a shorthand for either a
process or a block.)

But more fundamentally, step back a minute and get clear on the
difference between parallel and sequential descriptions VHDL. Reread
your reference book and try to see how the examples are constructed,
and where the right place is to implement the various bits. Put the
components ("old" logic) in the architecture body, and connect them
with signals. When you need to do something other than just using a
signal as a dumb connection between a few ports, use a process to
describe the "new" logic you want (like a state machine). Or for very
simple logic, just use a signal assignment. For example: chip_select
<= (addr = "0000") and ((read = '0') or (write = '0'));

- Kenn
 
Reply With Quote
 
andrew_ross andrew_ross is offline
Junior Member
Join Date: Nov 2008
Posts: 6
 
      11-14-2008
thanks everybody and sorry..I have not studied so much in effect..

My answer is : how should I implement the design of the alu..
the ipotetic if-then-elsif--.. are due to 2 inputsignals at the same time..OPCODE(6BIT) , FUNCT(6 BIT). (on which base I should call components..)

but - I cannot use processes to generate components
but - at the same time - I should use processes to check input signals

thanks..
 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
DESIGN AND IMPLEMENTATION OF A 4 BIT ALU coldplay112 VHDL 12 04-16-2009 06:25 PM
Simple ALU Implementation andrew_ross VHDL 0 11-13-2008 08:46 PM
millions combinations of test vectors for ALU Lily VHDL 16 05-10-2004 07:22 PM
need help with ALU 8 BIT Lily VHDL 0 04-06-2004 01:08 AM
alu implementation Manuel VHDL 3 02-06-2004 05:47 PM



Advertisments