Continue to Site

Welcome to EDAboard.com

Welcome to our site! EDAboard.com is an international Electronics Discussion Forum focused on EDA software, circuits, schematics, books, theory, papers, asic, pld, 8051, DSP, Network, RF, Analog Design, PCB, Service Manuals... and a whole lot more! To participate you need to register. Registration is free. Click here to register now.

VHDL code exercise. Please help!!

Status
Not open for further replies.

robertocastiglioni

Newbie level 2
Joined
Mar 13, 2017
Messages
2
Helped
0
Reputation
0
Reaction score
0
Trophy points
1
Activity points
26
Hi, I'm a engineering student and I would like to know if anyone could help me to solve this exercise. From already thank you very much


Show synthesizable VHDL code for a register unit that performs
operations shown below. The unit has a 3-bit mode (md) input, an
asynchronous reset (rs) input, a 1-bit output control (oc) input, and an
8-bit bi-directional io bus. The internal register drives the io bus
when oc is ‘1’ and md is not “111”. Use std_logic.
md=000: does nothing
md=001: right shift the register
md=010: left shift the register
md=011: up count, binary
md=100: down count, binary
md=101: complement register contents
md=110: swap right and left 4 bits
md=111: parallel load
 

Help you, yes. Do all your work you, no.

Dude, show at least a LITTLE effort.
 

sorry. The file was not uploaded, what I wanted to know is if it's okay

this is the datapth
Code:
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_signed.all;
use std.textio.all;

entity datapath is
port( io : inout std_logic_vector ( 7 downto 0);
		
		clock ,md1,md2,md3,reset,ic: in std_logic);
		
end entity;

architecture arquitectura of datapath is 
		
	
	--- componente enable 
	component Ena
	   port ( entrada :in  std_logic_vector(7 downto 0 );
		       salida  :out std_logic_vector(7 downto 0 );
		       cambio  :in  std_logic );
	end component;
	
	for all : Ena   use entity work.enable(arqui);
	----------------------------------------------------	
	component Ena1
	   port ( entrada :in  std_logic_vector(7 downto 0 );
		       salida  :out std_logic_vector(7 downto 0 );
		       cambio  :in  std_logic );
	end component;
	----------------------------------------------------	
	
	for all : Ena1   use entity work.enable1(arqui);
		
		
	signal a0,a1,a2,a3,a4,a5,a6,a7,a8,b,b1  : std_logic_vector (7 downto 0);
	signal ic1 : std_logic;
	
	
	begin 
		
		---------------------------------------------
		-- el carga selector 
		selector1 : ena port map (io , a0, ic);
		--selector2 : ena port map (b1 , io, ic1);
		---------------------------------------------
		
		---------------------------------------------
		u12 : Entity work.pnot(arqui) port map (ic,ic1);
		---------------------------------------------
		
		
		----------------------------------------------------------------------------------
		--el selector de operaciones 
		asigna : Entity work.mux(arqui) port map (a0,md1,md2,md3 ,b,a2,a3,a4,b,a6,a7,a8);
		----------------------------------------------------------------------------------
		
		
		----------------------------------------------------------------------------------
		------envio a sus funciones-------------------------------------------------------
		u2 : Entity work.desplazar_derecha(arqui) port map (a2,b,clock);
		u3 : Entity work.desplazar_izquierda(arqui) port map (a3,b,clock);
		u4 : Entity work.contadores(arqui) port map (a4,clock,md1,md2,md3,b);
		u6 : Entity work.cambiarLugar(arqui) port map (a6,b,clock);
		u7 : Entity work.CargaParalela(arqui) port map (a7,clock,ic,b);
		u8 : Entity work.Complemento(arqui) port map (a8,b,clock);
		----------------------------------------------------------------------------------
		
		
		----------------------------------------------------------------------------------
		------envio a sus funciones-------------------------------------------------------
		u10 : Entity work.todoCero(arqui) port map (b,b1,reset);
		----------------------------------------------------------------------------------
		
		

end architecture;


-- component derecha
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use ieee.std_logic_unsigned.all;
use std.textio.all;

entity desplazar_derecha is 
 port ( entrada :in  std_logic_vector(7 downto 0 );
		  salida  :out std_logic_vector(7 downto 0 );
		  clk :in std_logic );
		  
end entity;

architecture arqui of desplazar_derecha is
			begin 	
	
	process (clk)
			variable aux : std_logic_vector(7 downto 0);
			variable valor: std_logic;
			
		begin 	
			
				valor := entrada(0);
				aux := valor & entrada(7 downto 1 );
				salida <= aux;
			
	end process;
end architecture;
	



LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
USE ieee.std_logic_unsigned.ALL;

entity Mux is
port(            entrada : in  std_logic_vector (7 downto 0);
                       x1,x2,x3 : in  std_logic ; --- selector de md 000 , 001 , 010 etc....
							  
	 a1,a2,a3,a4,a5,a6,a7,a8 : out std_logic_vector (7 downto 0));
end entity;

	architecture arqui of Mux is
		begin 
			process(entrada, x1,x2,x3)
		begin 
				
				IF ( x1 = '0' and x2 = '0' and x3='0' ) THEN
						a1  <= entrada;
				END IF;
				
				IF ( x1 = '0' and x2 = '0' and x3='1' ) THEN
						a2  <= entrada;
				END IF;
				
				IF ( x1 = '0' and x2 = '1' and x3='0' ) THEN
						a3  <= entrada;
				END IF;
				
				IF ( x1 = '0' and x2 = '1' and x3='1' ) THEN
						a4  <= entrada;
				END IF;
				
				IF ( x1 = '1' and x2 = '0' and x3='0' ) THEN
						a5  <= entrada;
				END IF;
				
				IF ( x1 = '1' and x2 = '0' and x3='1' ) THEN
						a6  <= entrada;
				END IF;
				
				IF ( x1 = '1' and x2 = '1' and x3='0' ) THEN
						a7  <= entrada;
				END IF;
				
				IF ( x1 = '1' and x2 = '1' and x3 = '1' ) THEN
						a8  <= entrada;
				END IF;
			
--case A is
--when "000" => a1  <= entrada;
--when "001" => a2  <= entrada;
--when "010" => a3  <=entrada ;
--when "011" => a4  <= entrada;
--when "100" => a5  <= entrada;
--when "101" => a6  <=entrada ;
--when "110" => a7  <= entrada;
--when "111" => a8  <= entrada;

--when others =>a1 <= '0';

--end case;
end process;
end architecture;



--- contador ascendente y descendente


library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use ieee.std_logic_unsigned.all;
use std.textio.all;

entity contadores is 
 port (  entrada : in std_logic_vector(7 downto 0 );
			clk 	  : IN std_logic;
			x1,x2,x3	:in  std_logic;
		   salida  :out std_logic_vector(7 downto 0 ));
		  
end entity;

ARCHITECTURE arqui OF contadores IS
	
		BEGIN
			PROCESS (clk)
		 variable cont_aux1,cont_aux2 : std_logic_vector (7 DOWNTO 0);
		
		BEGIN
			 cont_aux1 :=  "00000000" ;
		    cont_aux2 :=  "11111111" ;
			IF (clk = '1' AND clk'EVENT) THEN
				
				IF ( x1 = '1' and x2= '0' and x3 = '0' ) THEN
			cont_aux1 := cont_aux1 + 1 ;
			salida <= cont_aux1;
				END IF;
				
				IF ( x1 = '1' and x2= '0' and x3= '1' ) THEN
			cont_aux2 := cont_aux2 - 1;
			salida <= cont_aux2;
				END IF;
				
			END IF;
	END PROCESS;

END ARCHITECTURE ;



-- component desplazar_izquierda


library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use ieee.std_logic_unsigned.all;
use std.textio.all;

entity desplazar_izquierda is 
 port ( entrada :in  std_logic_vector(7 downto 0 );
		  salida  :out std_logic_vector(7 downto 0 );
		  clk     :in std_logic ); 
end entity;

architecture arqui of desplazar_izquierda is
			begin 	
		
	process (clk)
			variable aux : std_logic_vector(7 downto 0);
			variable mover,valor: std_logic;
			
		begin 	
			
				valor := entrada(7);
				aux :=  entrada(6 downto 0 ) & valor ;
				salida <= aux;
			
	end process;
end architecture;
 

A few comments: At first glance (I'm too lazy to read the whole thing) ) my impression is that you've made this unnecessarily complicated with multiple components and architectures. Do a search on "VHDL counter" and you'll find much simpler code.

Std_logic_unsigned is outdated and not a "standard" library. You should use numeric_std instead.

- - - Updated - - -

One more thing. To determine whether it's working, you should simulate it! You can a learn a lot about how this all works from your simulation errors.
 
I find the use of variables unnecessary in this code. The assignments to valor and aux are just wasting time and memory (for simulation).

I don't get your multiplexer it is not multiplexing anything, what it is doing is demultiplexing (a decoder) entrada into one of eight different a# outputs.
 

On the entity of the Counters (entity "contadores") you have this:
x1,x2,x3 :in std_logic;
Which I believe is referred to the 3 bits mode inputs (md). To simplify the code, you can create this--> md: in std_logic_vector (2 downto 0); and then instead of doing like this:
IF ( x1 = '1' and x2= '0' and x3 = '0' ) THEN
You would do this: if md="100" then ... which I believe is easier and fancier.

And I do not understand why you have those counters like that because you are using an 8 bit counter to simply sum "1" to it...so you want to have binary counter but instead you have 8 bit counter... useless in my opinion.

In fact, all the counter is useless. Those auxiliary variables of the counter can be erased all of them and simply say:
if md="100" then
salida <= "00000001"; -- or whatever

if md="101" then
...

- - - Updated - - -

And furthermore, they will give you a LATCH warning, which is not good.
 
Last edited:

Status
Not open for further replies.

Similar threads

Part and Inventory Search

Welcome to EDABoard.com

Sponsor

Back
Top