Sei sulla pagina 1di 11

Universidade Federal de Santa Maria Departamento de Eletrnica e Computao ELC1033 Projeto de Sistemas Digitais

Exemplo de Um Sistema RTL


(Verso 01)

2011/2

Exemplo: Desenhe o grafo de execuo, o diagrama de bloco do subsistema de dados e o diagrama de estados do subsistema de controle de um sistema RTL que realiza a mdia entre dois nmeros inteiros sem sinal de 32 bits. Para a operao de mdia, use o seguinte algoritmo: Sejam x e y dois nmeros inteiros de 32 bits, sem sinal. (1) Se x no menor que y, troque os valores de x e y. (2) Se x no maior que y, faa a mdia igual a z. Pare o algoritmo. (3) Se x maior que y, decremente x e incremente y. Volte ao passo (2). Descreva em VHDL o subsistema de dados, o subsistema de controle, o sistema RTL e uma entidade para o teste deste sistema RTL.

A seguir, na figura 1, apresentamos um diagrama de bloco do sistema RTL que ser implementado. O sistema RTL possui duas entradas xin e yin. A media dos valores de entrada aparece na sada zout. O sistema RTL tem uma entrada start para solicitar o incio de uma nova computao da mdia de xin e yin. A sada done, se ativa em 1, indica que o sistema est livre para realizar uma nova computao.

xin 32

yin 32

Sistema RTL start Mdia entre xin e yin clk 32 zout


Figura 1 Diagrama de bloco de um sistema RTL que realiza a mdia entre dois nmeros inteiros de 32 bits, sem sinal. O grafo de execuo construdo a partir do algoritmo apresentado neste exemplo. O grafo de execuo mostrado na figura 2.

done

Incio

X = xin Y = yin

X>Y 1 OR X = dec(X) Y = inc(Y)

X=Y Y=X

X>Y 0

Z=X

Fim
Figura 2 Grafo de execuo para um sistema RTL que realiza a mdia entre dois nmeros inteiros de 32 bits, sem sinal, xin e yin. Do grafo de execuo, construmos o diagrama de blocos do subsistema de dados. Este apresentado na figura 3. Neste subsistema, os dados de entrada so armazenados nos registradores X e Y. A cada ciclo de relgio, enquanto o valor de X maior que o valor de Y (sinalizado por 1 pelo sinal cmp_xy), o valor do registrador X decrementado e o valor do registrador Y incrementado. Se o sinal cmp_xy igual a 0, indicando que X no maior que Y, o valor de X igual a mdia de x_in e y_in e armazenado no registrador Z. A sada do registrador Z ligado a sada z_out do sistema RTL.

x_in

y_in

sel_x chg_xy

0 1

sel_y

0 1

ld_x CLK

ld_y CLK

DEC

X>Y

INC

cmp_xy ld_z CLK Z

z_out Figura 3 Diagrama de bloco do subsistema de dados de um sistema RTL que realiza a mdia entre dois nmeros inteiros de 32 bits, sem sinal, xin e yin.

Do grafo de execuo, construmos o diagrama de estado da mquina de estado para este sistema RTL. Escolhemos uma mquina de Moore (poderia ter sido escolhida uma mquina de Mealy). O Diagrama de estado apresentado na figura 4. No estado S0, o sistema RTL aguarda o sinal start ser igual a 1, sinalizando um pedido de uma nova computao de uma mdia entre x_in e y_in. No estado S1, os valores de entrada do sistema RTL so armazenados nos registradores X e Y. No estado S2, verifica-se se X maior que Y. Se esta condio verdadeira, a mquina vai entre os estados S3 e S5. No estado S3, decrementamos o valor de X e incrementamos o valor de Y. No estado S5, comparamos se X maior que Y. Se no estado S2, o sinal cmp_xy igual a 0, indicando que o valor de X menor ou igual ao valor de Y, a mquina vai ao estado S4. Neste estado intercambiamos os valores de X e Y. Se X menor ou igual a Y no estado S5, a mquina vai ao estado S6, guardando o valor de X em Z. Este valor a mdia entre os dados de entrada x_in e y_in. Em seguida, volta-se ao estado S0, aguardando uma nova solicitao da computao da mdia, com o sinal start. No estado S0, o sinal done igual a 1, indicando que o sistema pode realizar uma nova computao. Nos outros estados, o sinal done 0, indicando que uma computao est em andamento.

start

S0

done

start S1 ldx ldy selx=0 sely=0

S2 cmpxy ldx ldy selx=1 sely=1 cmpxy ldx ldy selx=2 sely=2

S3

S4

S5 cmpxy ldz S6

Figura 4 Diagrama de estado da mquina de Moore do subsistema de controle. A seguir apresentamos uma descrio em VHDL do subsistema de dados.
library ieee; --! A biblioteca ieee contm o pacote std_logic_1164 use ieee.std_logic_1164.all; --! Usamos deste pacote o tipo --! std_logic e std_logic_vector use ieee.numeric_std.all; --! Este pacote includo para a realizao --! de operaes lgicas e aritmticas --! --! O subsistema de dados -----------------------entity data_subsystem is -----------------------generic(width: natural:=32); --! A largura do barramento de dados port ( xin : in std_logic_vector(width-1 downto 0); --! Operando X yin : in std_logic_vector(width-1 downto 0); --! Operando Y zout : out std_logic_vector(width-1 downto 0); --! Resultado mdia(x,y) selx : in std_logic_vector(1 downto 0); --! Seleciona entrada de MUXX sely : in std_logic_vector(1 downto 0); --! Seleciona entrada de MUXY

ldx : ldy : ldz : cmpxy: clk : ); end entity

in std_logic; --! Permite a escrita do in std_logic; --! Permite a escrita do in std_logic; --! Permite a escrita do out std_logic; --! 1 se o valor de X in std_logic --! O sinal de relgio data_subsystem;

registrador X registrador Y registrador Z maior que Y

--------------------------------------------architecture data_simple of data_subsystem is ----------------------------------------------! Cada um dos registradores do subsistema de dados --! definido como um sinal signal x,y,z: std_logic_vector(width-1 downto 0); begin --! Criamos um processo que depende do sinal de relgio process(clk) --! Variveis so criadas para as sadas dos mdulos funcionais --! muxx (sada do multiplexador MUXX), muxy (sada do multiplexador MUXY) --! decx (sada do decrementador: x=x-1), incy (sada do incrementador: y=y+1) --! cmpxy (sada do comparador, 1 se x maior que y) variable muxx, muxy, decx, incy: std_logic_vector(width-1 downto 0); --variable cmpxy: std_logic; begin --! comparador de x e y. 1 se x maior que y if(unsigned(x)>unsigned(y)) then cmpxy<='1'; else cmpxy<='0'; end if; decx:= std_logic_vector(unsigned(x)-1); --! decrementa x incy:= std_logic_vector(unsigned(y)+1); --! incrementa y --! multiplexador muxx case selx is when "00"=> muxx := xin; when "01"=> muxx := decx; when "10"=> muxx := y; when others => end case; --! multiplexador muxy case sely is when "00"=> muxy := yin; when "01"=> muxy := incy; when "10"=> muxy := x; when others => end case; --! Verificamos se ocorreu uma borda de subida do sinal de relgio if clk'event and clk='1' then --! Os registradores so atualizados se possuem permisso de escrita if ldx='1' then x <= muxx; end if; if ldy='1' then y <= muxy; end if; if ldz='1' then z <= x; end if; end if; end process;

--! A sada atualizada zout <= z; end architecture data_simple;

A descrio do subsistema de controle apresentada seguir.


library ieee; --! A biblioteca ieee possui o pacote std_logic_1164 use ieee.std_logic_1164.all; --! O pacote std_logic_1164 define --! os tipos std_logic e std_logic_vector ----------------------------! O subsistema de controle --------------------------entity control_subsystem is --------------------------generic(width: natural:=32); --! A largura do barramento de dados port ( start: in std_logic; --! Solicita uma nova computao cmpxy: in std_logic; --! 1 se o valor de x maior que y done : out std_logic; --! 1 indica que o sistema est livre ldx : out std_logic; --! Permisso de escrita no registrador X ldy : out std_logic; --! Permisso de escrita no registrador Y ldz : out std_logic; --! Permissso de escrita no registrador Z selx : out std_logic_vector(1 downto 0); --! Seleciona a entrada de MUXX sely : out std_logic_vector(1 downto 0); --! Seleciona a entrada de MUXY reset: in std_logic; --! Inicializa o subsistema de controle clk : in std_logic --! O sinal de relgio ); end entity control_subsystem; --------------------------------------------------architecture control_simple of control_subsystem is ----------------------------------------------------! Definimos os estados da mquina de estados. --! Nesta descrio deixamos explcito os valores --! para cada um dos estados. Poderiamos ter declarado --! os estados como stateT is (S0, S1, S2, S3, S4, S5, S6) subtype stateT is std_logic_vector(2 downto 0); constant S0: stateT:="000"; --! estado S0 constant S1: stateT:="001"; --! estado S1 constant S2: stateT:="010"; --! estado S2 constant S3: stateT:="011"; --! estado S3 constant S4: stateT:="100"; --! estado S4 constant S5: stateT:="101"; --! estado S5 constant S6: stateT:="110"; --! estado S6 --! Sinais para o estado atual e prximo estado so criados signal actual_state: stateT; --! O estado atual da mquina signal next_state : stateT; --! O prximo estado da mquina begin --! Descrevemos o circuito combinatrio que gera o prximo estado --! dentro de um processo com os sinais do estado atual e entradas --! da mquina de estado. next_state_block:process(actual_state, start, cmpxy) begin --! Com a estrutura case verificamos o estado atual da mquina de estado case actual_state is --! Para cada estado atribumos os prximos estados da mquina when S0=> if start='1' then next_state <= S1; else next_state <= S0;

end if; when S1=> next_state <= S2; when S2=> if cmpxy='1' then next_state <= S3; else next_state <= S4; end if; when S3=> next_state <= S5; when S4=> next_state <= S5; when S5=> if cmpxy='1' then next_state <= S3; else next_state <=S6; end if; when S6=> next_state <= S0; when others=> end case; end process next_state_block; --! A descrio do circuito registrador do estado atual --! Esta descrio realizada em um processo com os --! sinais do relgio e de reset, para a inicializao --! da mquina de estado em um estado conhecido state_memory_block:process(clk, reset) begin if reset='1' then actual_state <= S0; elsif clk'event and clk='1' then actual_state <= next_state; end if; end process state_memory_block; --! --! --! --! --! --! --! --! --! Descrio do circuito combinatrio que gera os sinais de sada Este circuito pode ser descrito em um processo com o estado atual na lista de sensibilidade se a mquina de Moore ou o estado atual e as entradas se temos uma mquina de Mealy. Para uma mquina de Moore output_block: process(actual_state) ... end process output_block; Aqui apresentada uma forma alternativa com sentenas concorrentes

done <='1' when actual_state=S0 else '0'; ldx <= '1' when actual_state=S1 or actual_state=S3 or actual_state=S4 else '0'; ldy <= '1' when actual_state=S1 or actual_state=S3 or actual_state=S4 else '0'; ldz <= '1' when actual_state=S6 else '0'; selx<= "00" when actual_state=S0 else "01" when actual_state=S3 else "10" when actual_state=S4 else "00"; sely<= "00" when actual_state=S0 else "01" when actual_state=S3 else "10" when actual_state=S4 else "00"; end architecture control_simple;

A descrio do sistema RTL mostrada seguir.


library ieee; --! A biblioteca ieee. Contm o pacote std_logic_1164 use ieee.std_logic_1164.all; --! O pacote std_logic_1164. Usamos o tipo --! std_logic e std_logic_vector

-------------------entity rtl_system is -------------------generic (width: natural := 32); --! A largura do barramento de dados port ( xin : in std_logic_vector(width-1 downto 0); --! operando x yin : in std_logic_vector(width-1 downto 0); --! operando y zout : out std_logic_vector(width-1 downto 0); --! resultado z=media(x,y) start: in std_logic; --!Sinaliza o incio de uma computao done : out std_logic; --! Sinaliza a espera de uma computao reset: in std_logic; --! Inicializa o sistema RTL clk : in std_logic --! O sinal de relgio ); end entity rtl_system; ---------------------------------------architecture rtl_simple of rtl_system is -----------------------------------------! Definimos os componentes do sistema RTL --! O componente subistema de dados component data_subsystem is generic (width: natural:=32); --! A largura do barramento de dados port ( xin : in std_logic_vector(width-1 downto 0); --! O operando x yin : in std_logic_vector(width-1 downto 0); --! O operando y zout : out std_logic_vector(width-1 downto 0); --! O resultado mdia(x,y) selx : in std_logic_vector(1 downto 0); --!Seleo da entrada do MUXX sely : in std_logic_vector(1 downto 0); --!Seleo da entrada do MUXY ldx : in std_logic; --! Permisso de escrita do registrador X ldy : in std_logic; --! Permisso de escrita do registrador Y ldz : in std_logic; --! Permisso de escrita do registrador Z cmpxy: out std_logic; --! 1 se o valor de X e maior que Y clk : in std_logic --! O sinal de relgio ); end component data_subsystem; --! O componente subsistema de controle, implementado como uma --! mquina de estado (mquina de Moore). component control_subsystem is generic(width: natural:=32); --! A largura do barramento de dados port ( start: in std_logic; --! Sinaliza o incio de uma nova computao cmpxy: in std_logic; --! 1 se o valor de X maior que Y done : out std_logic; --! 1 se sistema est disponvel para nova computao ldx : out std_logic; --! Permisso de escrita no registrador X ldy : out std_logic; --! Permisso de escrita no registrador Y ldz : out std_logic; --! Permisso de escrita no registrador Z selx : out std_logic_vector(1 downto 0); --! Seleciona entrada de MUXX sely : out std_logic_vector(1 downto 0); --! Seleciona entrada de MUXY reset: in std_logic; --! Inicializa o subsistema de controle clk : in std_logic --! O sinal de relgio ); end component control_subsystem; --! Sinais usados para conectar o subsistema de dados --! e o subsistema de controle signal ldx, ldy, ldz: std_logic; signal selx, sely: std_logic_vector(1 downto 0); signal cmpxy: std_logic; begin

--! Instanciamos os componentes do sistema RTL UUT_data: data_subsystem generic map(width=>32) port map(xin=>xin, yin=>yin, zout=>zout,selx=>selx, sely=>sely, ldx=> ldx, ldy=>ldy, ldz=>ldz, cmpxy=>cmpxy, clk=>clk); UUT_control: control_subsystem generic map(width=>32) port map(start=>start, cmpxy=>cmpxy, done=>done, ldx=>ldx, ldy=>ldy, ldz=>ldz, selx=>selx, sely=>sely, reset=>reset,clk=>clk); end architecture rtl_simple;

Um sistema de testes do sistema RTL mostrado em seguida.


library ieee; numeric_std --! Usamos da biblioteca ieee o pacote std_logic_1164 e

use ieee.std_logic_1164.all; --! Pacote com a definio dos tipos --! std_logic e std_logic_vector use ieee.numeric_std.all; --! Pacote para as operaes lgicas e artitmticas --! com os tipos std_logic e std_logic_vector ------------------------entity test_rtl_system is ------------------------generic(widthtest: natural :=32); --! Largura do barramento de dados end entity test_rtl_system; -------------------------------------------------architecture test_RTL_simple of test_rtl_system is ---------------------------------------------------! declaramos o componente que ser testado component rtl_system is generic(width: natural := 32); port( xin: in std_logic_vector(width-1 downto 0); --! O operando x yin: in std_logic_vector(width-1 downto 0); --! O Operando y zout: out std_logic_vector(width-1 downto 0); --! O resultado da mdia de x e y start: in std_logic; --! Sinal solicitando uma nova computao da mdia done: out std_logic; --! Sinaliza que o sistema est livre para uma nova computao reset: in std_logic; --! Inicializa o sistema clk: in std_logic --! O sinal de relgio ); end component; --! Estes sinais so conectados s entradas e sadas da unidade sobre teste signal start: std_logic; --! Solicita que uma nova computao seja realizada signal done : std_logic; --! Sinaliza que o sistema est livre para nova computao signal xin : std_logic_vector(widthtest-1 downto 0); --! Operando X signal yin : std_logic_vector(widthtest-1 downto 0); --! Operando Y signal zout : std_logic_vector(widthtest-1 downto 0); --! Resultado, mdia de x e y signal reset: std_logic; --! Inicializa o sistema signal clk : std_logic; --! O sinal de relgio begin --! Instanciamos a unidade que ser testad UUT: rtl_system generic map(width=>widthtest) port map(xin=>xin, yin=>yin, zout=>zout, start=>start, done=>done, reset=>reset, clk=>clk);

--! Este processo gera o sinal de relgio do sistema clock_signal:process begin clk <= '0'; wait for 31 ns; loop clk <= '1'; wait for 5 ns; clk <= '0'; wait for 5 ns; end loop; end process clock_signal; --! --! --! --! --! Realizamos alguns testes com o sistema RTL, dentro de um processo Basicamente colocamos sinais de teste, vetores de teste e esperamos um certo tempo (usando wait) entre cada um destes vetores. A sada do sistema verificada para cada um destes vetores de teste por meio de uma tabela com os sinais ou o diagrama de tempo do sistema

--! Processo para o teste da unidade test_system: process begin start <= '0'; reset <= '0'; wait for 50 ns; -- Inicializamos o sistema reset <= '1'; wait for 50 ns; reset <= '0'; -- Vetores de teste so apresentado unidade sobre teste xin <= std_logic_vector(to_unsigned(200,widthtest)); yin <= std_logic_vector(to_unsigned(100,widthtest)); -- Solicimos a computao da mdia de xin e yin wait until clk'event and clk='1'; start <= '1'; wait until clk'event and clk='1'; start <= '0'; wait; -- Fim do teste end process test_system; end architecture test_RTL_simple;

Potrebbero piacerti anche