반응형
 

(4) DE2 보드 UART_RX 동작 내용

(4) DE2보드 UART_TX보드 동작내용

 

 

 

(4) UART ECHO BACK



 입력 data값을 uart_rx의 입력으로 넣어주고, uart_rx의 출력된 data값을 tx를 통해 전송한다,  send를 하자마자 받는값이 출력이 되는 과정이 나오는 것이다.

반응형
반응형

1. UART 비동기 통신 이란

 

 UART(Universal Asynchronous Receiver and Transmitter)란 비동기 전이중 1:1통신 방식이다.

 동기통신 PS/2와는 다른 점은 비동기 통신은 최대 입력 전압이 ±15V, 최대 출력 전압이 ±25V로 비교적 높은 전압이다. 그래서 동기통신보다 통신거리가 길고, 최대 통신거리는 15m이다.

 통신속도는 Baud-rate(bau-rate)라 하고, 가변적인 특성을 갖는다.

 UART default 1의 값을 갖으며, START bit(1 bit),Data(8 bit), PARITY(1 bit), STOP(1 bit)  11비트로 전송되고, DATA는 최대 8비트가 기본 단위이다.

 RS-232(가장 많이 쓰임) Tranceiver을 사용하여 TTL(5V)  UART(12V) level로 변환해준다.

 9600bps ~ 921600bps의 속도에서 일반적으로 9600bps,15200bps를 많이 사용하고, 이번 실습에서는 115200bps를 사용한다

 115200bps 한 펄스의 주기는 868055us

 

 

2. UART_TX (Transmitter) VHDL 코드 & 분석 (library 생략)

 

 

entity UART_TX is

port(

nRst : in std_logic;

clk : in std_logic;

start_sig : in std_logic;

data : in std_logic_vector(7 downto 0);

tx : out std_logic;

busy : out std_logic

);

end UART_TX;

 

architecture beh of UART_TX is 

type state_type is (IDLE, START, SEND, PARITY, STOP);

signal state : state_type;

signal cnt : std_logic_vector(8 downto 0);

signal pclk : std_logic;

signal start_d : std_logic;

signal flag : std_logic;

signal temp_data : std_logic_vector(7 downto 0);

signal tx_data : std_logic_vector(7 downto 0);

signal bit_cnt : std_logic_vector(3 downto 0);

 

begin

process(nRst,clk)

begin

if(nRst = '0') then

start_d <= '0';

flag <= '0';

temp_data <= (others => '0');

elsif rising_edge(clk) then

start_d <= start_sig;

if (start_d = '0') and (start_sig = '1') then

flag <= '1';

temp_data <= data;

 elsif (state = START) then

flag <= '0';

end if;

end if;

end process;

 

 process(nRst,clk)

begin

if(nRst = '0') then

cnt <= (others => '0');

pclk <= '0';

 

elsif rising_edge(clk) then

if(cnt = 433) then

cnt <= (others => '0');

pclk <= not pclk;

else

cnt <= cnt + 1;

end if;

end if;

end process;

 

process(nRst,pclk)

begin

if(nRst = '0') then

state <= IDLE;

bit_cnt <= (others =>'0');

tx_data <= (others =>'0') ;

busy <= '1';

elsif rising_edge(pclk) then

case state is

when IDLE =>

if(flag = '1') then

state <= START;

else

state <= IDLE;

end if;

bit_cnt <= (others =>'0');

tx_data <= (others =>'0');

busy <= '1';

when START =>

state <= SEND;

tx_data <= temp_data;

busy <= '0';

when SEND =>

if(bit_cnt = 7) then

bit_cnt <= (others =>'0');

state <= PARITY;

 

else

bit_cnt <= bit_cnt + 1;

tx_data <= '0' & tx_data(7 downto 1);

end if;

when PARITY =>

state <= STOP;

when STOP =>

state <= IDLE;

busy <= '1';

when others =>

end case;

end if;

end process;

 

tx <= tx_data(0) when state = SEND else

'0' when state = START or state = PARITY else

'1';

end beh;

 

3.UART_TX 결과 및 시뮬레이션

 



 

 

 

 

(1) data값에 A7이 입력되면서 start_sig값과 이값으로부터 전달 받은 start_d에 의해 시작신호가 형성되면서 flag값에 1의 값이 나오면서 START상태로 넘어간다.

START상태에선 tx_data값에 data값이 전달되어 임시저장된 temp_data의 값을 전달해주고 SEND상태로 넘어가면서 busy값에 0을 전달해준다

(2) SNEND상태에서 입력받은 A7(1010 0111) 0비트 값 1 tx로 전달되고 다음에 bit_cnt(비트카운트)의 수는 1이된다.

tx_data값에 0비트가 tx로 전달되어 비어있으므로 8비트에 0을 채워놓고 기존 tx_data 7~1비트의 수를 6~0비트로 우측 씩 shfit하여 이 값을 tx_data로 전달 해준다.

 

(3) ~ (8) bit_cnt, 즉 비트수가 7이 될 때 까지, (2)번의 과정을 전달하여 우측부터 A7(1010 0111)의 우측부터 좌측으로 차례차례 tx로 전달하여 준다.

 

(9) bit_cnt의 값이 7 (8비트전달) 이 되었을 때, bit_cnt의 값을 0으로 초기화 해주고 다음 상태인 PARITY상태로 넘어가고 STOP으로 넘어가 초기상태인 IDLE상태로 만들어준다.

 

 

2. UART_RX (RECEIVER) VHDL 코드 & 분석 (library 생략)

 

 

entity UART_RX is

port(

nRst : in std_logic;

clk : in std_logic;

serialin : in std_logic;

rx_data : out std_logic_vector(7 downto 0);

valid : out std_logic

);

end UART_RX;

 

architecture beh of UART_RX is

 

type state_type is ( IDLE, START, RECEIVE, PARITY, STOP);

signal state : state_type;

signal cnt : std_logic_vector(5 downto 0);

signal pclk : std_logic;

signal pcnt : std_logic_vector(2 downto 0);

signal bit_cnt : std_logic_vector (2 downto 0);

signal serialin_d : std_logic;

signal flag : std_logic;

signal xmtdata : std_logic_vector(7 downto 0);

 

begin

 

process(nRst,clk)

begin

if(nRst = '0') then

cnt <= (others =>'0');

pclk<='0';

elsif rising_edge(clk) then

if(cnt=53) then

cnt<=(others => '0');

pclk<=not pclk;

else

cnt<=cnt+1;

end if;

end if;

end process;

 

process(nRst,clk)

begin

if(nRst='0') then

serialin_d<='0';

flag<='0';

elsif rising_edge(clk) then

serialin_d <= serialin;

if state = IDLE then

if(serialin_d = '1') and (serialin='0') then

flag <= '1';

end if;

 

elsif state = START then

flag <= '0' ;

end if;

end if;

end process;

 

process(nRst,pclk)

begin

if(nRst = '0') then

state <= IDLE;

pcnt<= (others => '0');

bit_cnt<= (others => '0');

xmtdata<= (others => '0');

rx_data<= (others => '0');

 elsif rising_edge(pclk) then

case state is

when IDLE=>

if(flag='1') then

state <= START;

else

state <= IDLE;

end if;

pcnt<= (others => '0');

bit_cnt<= (others => '0');

xmtdata<= (others => '0');

rx_data <= (others => '0');

when START =>

if(pcnt = 3 ) then

pcnt <= (others => '0');

state <= RECEIVE;

else

pcnt <= pcnt + 1;

state <= START ;

end if;

when RECEIVE =>

if(pcnt = 7) then

pcnt <=(others =>'0');

xmtdata <= serialin&xmtdata(7 downto 1);

if(bit_cnt = 7 ) then

bit_cnt <= (others => '0');

state <=PARITY;

else

bit_cnt <= bit_cnt + 1;

state <= RECEIVE;

end if;

else

pcnt <= pcnt + 1;

end if;

 

when PARITY =>

if(pcnt=7) then

pcnt<=(others =>'0');

state <= STOP;

else

pcnt<=pcnt+1;

state<=PARITY;

end if;

 

 

when STOP =>

if(pcnt=7) then

pcnt <= (others => '0');

state <= IDLE;

else

pcnt <= pcnt + 1;

state <= STOP;

end if;

rx_data<=xmtdata;

 

when others =>

state<=IDLE;

end case;

end if;

end process;

 

valid <= '1' when (state = STOP and pcnt=7)else '0';

end beh;

 

3.UART_RX 결과 및 시뮬레이션

 



 

(1) serialin serialin_d에 의해 flag값이 1로 결정되고 상태가 START로 넘어간다.

 

(2) START상태에서 flag값을 다시 0으로 만들어주고 RECEIVE로 넘어간다

 

(3) RECEIVE상태에서 serialin에서 1이 들어 왔는데 바로 xmtdata에 전달이 안되고, pcnt 7의값(들어온 data의 중간시기)를 읽으므로 (2)번에서 serialin 1의 값이 (3)번 시점 에서 읽힌다, 처음1이 들어와 1 & xmtdata(7 downto 0)가 되고, xmtdata 0000 0000이므로 1000 0000 (16진수로 80) xmtdata로 전달됨, 1개를 전달받았으니 bit_cnt의 수는 0이다.

 

(4) bit_cnt의 수는7이 아니므로 RECEIVE상태에서 데이터 8비트를 다 안받은상태이다. serialin에서 1이 또 들어왔기 때문에 xmtdata 1 & xmtdata(7 downto 1) => 1 & 100 0000 이 되므로 1100 0000(16진수로 C0) xmtdata에 전달된다. 그리고 bit_cnt의 수는 1이 된다 (비트수2)

 

(5) ~ (9) 3,4번의 과정을 bit_cnt의 수가 7,즉 비트수가 8개가 될 때 까지 반복한다.

 

(10) PARITY상태에서 STOP상태로 넘어가고,

STOP상태에서 최종 xmtdata값은 A7(16진수)가 되고 이값은 rx_data값으로 전달된다. 이 후 다시 모든 값을 0으로 초기화하고 기본상태인 IDLE상태로 된다.

 

 

 

 

반응형
반응형

첨부파일 2개 : https://blog.naver.com/aanrt/221515723183

 

1차 : SIMPLE_U_PROCESSOR

2차 : SIMPLE_U_PROCESSOR REGISTER사용 및 저장 활용

반응형
반응형

첨부파일 : https://blog.naver.com/aanrt/221515682160

 

2-3 ps2 data pack 검사 및 parsing vhdl

entity ps2_parsing is

port(

nRst : in std_logic;

clk : in std_logic;

ps2_valid : in std_logic;

ps2_data : in std_logic_vector ( 7 downto 0) ;

valid : out std_logic;

data : out std_logic_vector(3 downto 0)

);

end ps2_parsing;

 

 

architecture beh of ps2_parsing is

 

function data_decode(in_data : std_logic_vector(7 downto 0) return

std_logic_vector is

variable return_data : std_logic_vector (3 downto 0);

begin

case in_data is

when x"45" => return_data := "0000";

when x"16" => return_data := "0001";

when x"1E" => return_data := "0010";

when x"26" => return_data := "0011";

when x"25" => return_data := "0100";

when x"2E" => return_data := "0101";

when x"36" => return_data := "0110";

when x"3D" => return_data := "0111";

when x"3E" => return_data := "1000";

when x"46" => return_data := "1001";

when x"1C" => return_data := "1010";

when x"32" => return_data := "1011";

when x"21" => return_data := "1100";

when x"23" => return_data := "1101";

when x"24" => return_data := "1110";

when x"2B" => return_data := "1111";

when others => return_data := "0000";

end case;

 

return(return_data);

end data_decode;

 

signal temp_data : std_logic_vector(7 downto 0);

signal data_0 : std_logic_vector(7 downto 0);

signal data_1 : std_logic_vector(7 downto 0);

 

signal ps2_valid_d : std_logic;

signal ps2_valid_det : std_logic;

 

begin

 

 

     process(nRst,clk)

begin

if(nRst = '0') then

   ps2_valid_d <= '0';

   ps2_valid_det <= '0';

 

elsif rising_edge(clk) then

   ps2_valid_d <= ps2_valid;

if(ps2_valid_d='0')and(ps2_valid = '1') then

                         ps2_valid_det <='1';

 else

    ps2_valid_det <= '0';

 end if;

end if;

end process;

 

 

process(nRst,clk)

     begin

if(nRst = '0') then

  temp_data <= (others =>'0');

   data_0 <= (others =>'0');

   data_1 <= (others =>'0');

   valid <= '0';

   data <= ( others => '0');

elsif rising_edge(clk) then

   temp_data <= ps2_data;

    if(ps2_valid_det = '1') then

      data_0 <= temp_data;

      data_1 <= data_0;

    end if;

     if(data_1 = x"F0") then

data <= data_decode(data_0);

valid <= ps2_valid_det;

end if;

end if;

end process;

end beh;

3-3 ps2_parsing 시뮬레이션 결과

 

 

 

(1) 키보드 입력에서 ps2_data 23(16진수)가 입력되고 이는 temp_data로 전달된다. 그리고 ps2_valid 1이 입력되어 ps2_valid_d에 전달되고

현재시점에서 ps2_valid의 값이 1, ps2_valid_d의 값은 ps2_valid 1의 값이 오기전의 값을 전달받으므로 0이므로 ps2_valid_det 1이 전달된다. (시작신호)

ps2_vadid_det의 값이 1로 되어, temp_data 값이 data_0 으로 전달되어 data_0의 값엔 23이 전달되고, data_0이 값이 data_1에 전달된다.

 

(2) 키에서 떨어질 때, F0 scan code data_1까지 전달되면 data_0엔 전에 입력받은 23 scan code값이 d이므로 data_decode(23) return 1101 data값에 d가 전달되어 출력된다.

 

 

 

반응형
반응형

첨부파일 : https://blog.naver.com/aanrt/221515655615

 

1. PS/2 동기화 통신

 

Personal System/2 인터페이스는 양방향 동기식 통신이 가능한 PC port 규격이다.

키보드는 CLOCK DATA라인의 값이 1 상태일 경우에 한하여 데이터를 송신할 수 있다. 클록신호는 유효데이터를 지시하기 위한 동기신호의 개념이다.

키보드에서 키가 눌려지면, 키보드 내부의 원칩 컨트롤러가 DATA(SCAN Code 전송)를 시스템에 보내게 된다.

-키를 누를 때는 11bit 하나의 key code (make code)가 발생하고,

-키가 떨어질 때는 두 개의 Scan code(break code)가 전송된다 (F0->Key code)

-키가 계속 눌려지면 해당 Key code 100ms마다 전송하고, 키가 떨어질 때도 출력하기 때문에 시스템 쪽에서는 키가 계속 눌려지는 것을 인식 할 수가 있다.

 

1. D가 눌렸을 때,

 

CLK(클락)신호가 falling edge일 때 유효데이터 값이고,

D 23 data값을 갖는데, 이는 16진수 값으로 00100011이다.

키가 눌렸을 때의 11bit key code의 구성은 STARTbit(1bit) + DATA(8bit) + PARITY(1bit) + STOP(1bit)로 구성된다.

Start Clk High, Data 1 -> 0 (falling edge) start된다.

Stop bit는 키보드를 안눌렀을 때, High로 되므로 누를시 low되면 다시 시작

Data는 가장 우측값이 LSB로 전송되고 가장 좌측 값이 MSB로 전달

 

 

2-1 ps/2 keyboard VHDL

entity ps2_keyboard is                                                                       

    port (

nRst : in std_logic;

clk : in std_logic;

start_sig : in std_logic;

data : in std_logic_vector( 7 downto 0);

ps2_clk : out std_logic;

ps2_data : out std_logic);

end ps2_keyboard;

 

architecture beh of ps2_keyboard is

type state_type is (IDLE, START, SEND, PARITY, STOP);

signal state : state_type;

signal cnt : std_logic_vector(9 downto 0);

signal pclk : std_logic;

signal pclk_cnt : std_logic_vector(1 downto 0);

signal bit_cnt : std_logic_vector(2 downto 0);

signal temp_data : std_logic_vector(7 downto 0);

signal tx_data : std_logic_vector(7 downto 0);

 

signal start_d : std_logic;

signal flag : std_logic;

 

begin

 

   

process(nRst,clk)

  begin

if(nRst = '0') then

cnt <= (others => '0');

pclk <= '0';

 

 

elsif rising_edge(clk) then

if(cnt=624) then

cnt <= (others => '0');

pclk <= not pclk;

 

else

cnt <= cnt + 1;

end if;

end if;

end process;

 

 

process(nRst,clk)

begin

if(nRst = '0') then

start_d <= '0';

flag <= '0';

 

temp_data <= (others => '0');

elsif rising_edge(clk) then

start_d <= start_sig ;

if(start_d='0') and (start_sig='1') then

flag <= '1';

temp_data <= data;

 

elsif(state = START) then

flag <= '0';

end if;

end if;

end process;

process(nRst,pclk)

   begin

    if(nRst = '0') then

state <= IDLE;

pclk_cnt <= (others => '0');

bit_cnt <= (others => '0');

tx_data <= (others => '0');

elsif rising_edge(pclk) then

case state is

when IDLE =>

     if(flag = '1') then

       state <= START;

               else

       state <= IDLE;

        end if;

        pclk_cnt <=(others=>'0');

        bit_cnt <=(others=>'0');

        tx_data <= (others =>'0');

 

 

when START =>

   if(pclk_cnt = 3) then

     pclk_cnt <= (others => '0');

     state <= SEND;

   else

    pclk_cnt <= pclk_cnt + 1;

    state <= START;

    end if;

  tx_data <= temp_data;

        when SEND =>

if(pclk_cnt =3) then

  pclk_cnt <=(others => '0');

   if(bit_cnt = 7) then

   bit_cnt<=(others=>'0');

   state <= PARITY;

 else

   tx_data<='0' & tx_data ( 7 downto 1);

   bit_cnt <= bit_cnt + 1;

   state <= SEND;

end if;

  else

   pclk_cnt <= pclk_cnt + 1;

   state <= SEND;

   end if;

 

when PARITY =>

  if(pclk_cnt =3)then

    pclk_cnt <= (others => '0');

    state<=STOP;

else

    pclk_cnt <= pclk_cnt + 1;

    state<=PARITY;

 end if;

   

 

when STOP =>

  if(pclk_cnt = 3 ) then

   pclk_cnt<=(others => '0');

   state <= IDLE;

else

   pclk_cnt <= pclk_cnt + 1;

   state <= STOP;

 end if;

when others => state <= STOP;

end case;

end if;

end process;

 

 

ps2_clk <= '0' when pclk_cnt >= 1 and pclk_cnt <=2 else '1';

 <span style="font-family: 함초롬바탕; font-size: 11pt;"> </p>

ps2_data <= tx_data(0) when state = SEND else

 

'0' when state = START or state = PARITY else '1';

 

//ps2_data

​//SEND 상태시 temp_data로부터 전달받은 tx_data값의 0비트를 전달,

//START PARITY상태에선 무조건 0값을 전달(start bit,parity bit 0으로 정함) 나머지 경우(STOP,IDLE) 는 모두 1

   

end beh;

 



 

(0) data값에 23(hex)이 입력되고나서 START 신호를 받기 전 상 태가 IDLE상태에서 START로 넘어감

(1) start_sig start_d에 의해 flag값이 1이되면서 START 시작, startbit,paritybit 0이므로 ps2_data값에 0전달 SNED상태로 넘어감

(2) data 23 2진수로 0010 0011이고,temp_data로 전달된후 tx_data = 0010 0011 로 전달된다.

tx_data(0)비트의 값이 ps2_data의 값에 출력되어 1의 값이 나오고

tx_data의 값은 0010 001x(전달된값 x) 가되는데, 0 & tx_data(7 downto 1)에서

하나씩 우측으로밀려 0001 0001이 되어 저장된다

(3) (2)번과 같은방법으로, ps2_data 값엔 tx_data (=0001 0001)에서 맨우측 비트 1이 전달되어 출력되고, tx_data (=0001 000x)에서 0 & tx_data(7 downto 1)이 되어 0000 1000 tx_data 값에 전달된다.

(4)~(9) (2)번과 같은방법으로 data scan code 8비트가 전달될 동안 총 8번의 과정이 반복된다. 처음 입력받은 scan code의 맨우측이 LSB로 전달되고 입력받은 scan_code의 맨좌측이 MSB로 전달되는 과정! 반복된 후 PARITY 상태로 넘어간다

(10) PARITY 상태에선 parity bit  0 ps2_data에 전달되어 출력되어 STOP으로 넘어감

(11) STOP상태에서 stop bit

ps2_data <= tx_data(0) when state = SEND

else '0'

when state = START or state = PARITY else '1';

코드에 의해 해당하는 1의 값이 출력된다.

 

 

 

반응형
반응형

2.소스코드 및 설명(Meerly) Mealy 는 현재상태와 현재입력에 의존한다

 

 





.

변수설정과 clk신호에 관한 process문으로

clk신호의 rising_edge일시 rst에 의해 결정되는 present_state값과

rst 0일 때 present_state next_state를 전달하는 상태 기술문이다.

 

 

34~42: present_state 에 무슨 입력이 들어오냐에 관한 case

초기상태 s0에서 coin_in 1의 입력이 들어오면 next_state s1을 전달해주고 그때의 state_out 값은 01, coin_in 0의 입력이 들어오면 next_state s0,state_out 값은 00을 전달해주어 출력한다.

 

44~51 : coin_in 1의 입력값에따라 next_state s1이 되어 present_state next_state s1이 전달되면, coffee_sel에 의하여 다음상태가 결정된다

coffee_sel 1일시 next_state s2가 전달되고 그때의 state_out 10이 전달되어 출력, 0일시 s1이 전달되고 state_out 01이 전달되어 출력,

53: s2에서 coffee_serve에 입력값에 의하여 다음상태를 결정해준다. coffee_serve 1일시 next_state s0,state_out 00을 전달한다.

0일시엔 next_state s2, state_out 10을 전달하여 출력한다.

61 : 나머지의 경우에 대해서 다시 초기값 s0으로 돌아가고 그때의 state_out 00을 출력한다.

 

3.시뮬레이션 결과 및 설명

 

 

 

처음 rst 1일시 초기상태는 s0이 전달되고 state_out 00으로 전달되어 출력된다.

 

그다음 돈을 넣었을시(coin_in = 1) 다음단계인 S1으로 가서 state_out 01이 전달되어 출력된다.

 

그리고 커피를 고르면 (coffee_sel = 1) 다음단계인 s2에서 커피가 나오면 (coffee_serve = 1) 다시 처음 자판기상태인 s0 ,state_out = 00으로 돌아간다.

 

만약 coin_in = 1이 입력되고 s1에서 커피를 고르지 않으면 그상태를 유지한다.

마찬가지로 coffee_sel = 1이 입력되고 커피가 나오지 않아서 다음상태로 안넘어가면 s1( state_out = 10)의 상태가 유지된다.

 

 

 

반응형

'VHDL' 카테고리의 다른 글

4-way Traffic controller VHDL  (0) 2021.06.09
Coffe Vending Machine VHDL (Moore설계)  (0) 2021.06.09
Sequence Detector(순차검출기)  (0) 2021.06.09
램메모리 VHDL RAM(Random Access Memory) VHDL  (0) 2021.06.09
ROM memory (Read Only Memory) VHDL  (0) 2021.06.09
반응형

1011이 입력되면 1이 출력.

 

RESET : S0 초기화

 

S0 : 초기상태로 1011중 하나도 안들어온 상태

S1 : S0상태에서 1이 들어온 상태 (S0상태에서 0입력시 S0유지)

S2 : S0상태에서 10이 들어온 상태 

S3 : S0상태에서 101이 들어온 상태

S4 : S0상태에서 1011이 들어온상태 

  

 

2.소스코드 및 설명

 

 





 

12 : state 타입은 s0,s1,s2,s3,s4로 이루어진 것을 선언

13 : state타입의 present_state,next_state signal형 선언

 

19 : clk pulse가 상승신호일시

20 : rst=1 이면 present_state  s0

23 : 아닐 경우 present_state next_state를 전달해준다

28 : present_state D_in에관하여 process

29,30 : next_state s0부터 시작한다.

 

32: present_state case문으로 present_state의 상태에따라 결정하는 조건문

 

33~62 :  s0,s1,s2,s3,s4의 상태에 대해서 입력값 D_iN 1일 때와 0일 때 next_state가 어떤 값으로 가는지 state타입으로 적어준다, 1 0에 따라 next_state가 변하므로 D_in에 대하여 하나의 입력신호에 대해서 if문을 사용하여 next_state를 정해주고 나머지 입력 신호에 대해선 else를 사용

63: 나머지의 경우에 대해선 next_state s0을 전달해준다,

67 : p2 단계에서 D_in의 입력 신호에따라 next_state present_state에 전달 해주 었다. p3단게에서는 present_state에 전달된 state type의 값을 기술해준다.

 

69~75 S0 0이고,S1 0,S2 0,S3 0,S4 1 이값을 D_out에 전달해준다.

 

 

3.시뮬레이션 결과 및 설명

 

 

 

 

1. RST=1이므로 초기값은 s0이 되었다. 이제 clk pulse의 상승신호에 맞춰 상태가 변한다. 처음에 S0에서 D_in 0이 되었으므로 S0을 유지하고 그다음 clk pulse에서 0이므로 S0을 유지한다.

 

2. S0에서 CLK_PULSE에 맞춰 D_in에 값에 따라 S0 -> S1 (D_in 1)

S1 -> S2 (D_in 0) , S2-> S3(D_in 1), S3 -> S4(D_in 1) 까지 상태가 변하므로 S4에서 1이 검출된다. 1011일시 1이 검출된 것이다.

 

 

반응형
반응형

1.RAM(Random Access Memory)

Memory에 저장된 값을 읽을 수 있고, ROM과 다른점은 필요한 data를 저장할 수 있다. 하지만 전원이 끊기면 저장된data가 날아간다(=휘발성 메모리)

 

 

8비트 데이터를 8개 저장하는 간단한 8비트의 RAM을 설계한다 보았을 때,

memclk rising_edge 신호에 맞춰 w_en의 신호가 High가 될 때의 address신호값에 data_in을 입력하여 저장시킨다.

 

2.소스코드 및 설명



 

 

7: ADDR_BITS 는 매개변수3으로 정의, DATA_BITS는 매개변수8로 정의 //회로의 개수나 입출력의 크기가 매개변수에 의해 결정되게 하는 generic

19: subtype형의 ram_word DATA_BITS-1=(8-1) 8비트의 로직벡터형 선언

20: ram_word type중 하나ram_memory는 배열형(0부터 2^3-1 ,7까지)

22: signal타입 ram선언 데이터 형식은 ram_memory이다. ram_memory ram_word(8비트의로직벡터)형 중의 ram_memory(0부터 7까지 배열)

그리고 값은 배열의 0번부터 7번까지 초기값을 적어줌

28 : write_addr의 변수는 0부터 2^3-1  7까지의 범위의 상수형 선언

 

30: memclk가 상승신호 일 경우,

31: w_en 신호가 1일 경우

32: write_addr addr의 로직벡터형을 정수로 치환하여 전달

33: ram(write_addr), write_addr index에 해당하는 ram의 배열값에 data_in의 입력값을 전달해준다 ( 메모리쓰기 부분)

 

39: read_addr의 변수선언 : 정수 0부터 2^3-1 (=7)의 범위의 값을 가진다.

 

41: read_addr addr 로직벡터값을 정수형으로 전환하여 넣어준다

42: data_out RAM(read_addr(정수형))에 해당하는 index를 전달하여 출력한다.

 

3.시뮬레이션 결과 및 설명

1. addr입력신호가 000이 되었을시, integer형으로 정수 0이되어 conv함수를통해 0부터7까지 정수형의 변수로 선언된 read_addr에 값이 전달된다.그리고 출력은 RAM(read_addr)=RAM(0) RAM 0 index에 해당하는 배열의 값이 data_out으로 전달되어 출력된다.

 

2. addr의 입력신호가 001이라 integer형으로 정수 1이되어 read_addr에 전달되어 RAM(1)의 해당하는 배열의 값이 나와야 하지만, write_enable(=w_en)신호가 1이고, memclk pulse rising_edge이므로 data_in data값이 RAM의 배열 1번주소에 써진다. 초기값위에 덮어쓰기가 되어 11111111이 저장되어 출력된다.

 

3. 다음 addr의 신호가 001이 되었을 때, 정수1로 변환하여 read_addr값으로 변환되어 RAM(1)에 해당하는 배열의 값이 전 w_en신호에 맞춰서 새로 저장된 data의 값으로 씌어져 출력에 저장된 data값으로 출력이 된다.

 

 

 

반응형
반응형

1. 4 BIT RING COUNTER

링 카운터는 전체적으로 데이터가 회전하는 시프트 레지스터를 말하며, 맨 마지막 플립플롭의 출력이 첫 번째 플립플롭의 입력에 연결되어 있다. 입력된 데이터는 클록의 펄스마다 한 칸씩 이동하게 된다.

 

 

 

2. 소스코드 및 설명

 

 

3.시뮬레이션 및 결과설명

 

 

 

(1) 초기값이 “0000”일 때, 0001 tmp에 전달해주어 이 값을 Y로 전달해 출력하였다.

 

(2) CLK의 신호가 상승신호일 때 왼쪽으로 1비트씩 이동하였기에 0010이 출력되었다.

 

(3) CLK의 신호가 상승신호일 때 왼쪽으로 1비트씩 이동하여 0100이 출력되엇다.

 

(4) CLK의 신호가 상승신호일 때 왼쪽으로 1비트씩 이동하여 1000이 되었다.

 

(5) CLK의 신호가 상승신호일 때 왼쪽으로 1비트씩 이동하여 3비트가 0비트로 가므로 0001이 되었다.

 

(6) RESET=1의 값으로 0000이 되고, 다시 0001로 값이 정해진다. 

 

반응형
반응형

디코더 

디코더(decoder) n비트의 2진 코드(code) 값을 입력으로 받아들여 최대 2^n개의 서로 다른 정보로 바꿔 주는 조합 회로를 말한다. 일반적으로 디코더는 n개의 입력선과 최대 2^n개의 출력선을 가지며, 입력 값에 따라 선택된 하나의 출력선이 나머지 출력선들과 반대값을 갖는다.

 

3x8디코더 : 3개의 입력선과 최대 2^3개의 출력선을 가지며 입력 값에 따라 선택된 하나의 출력선이 나머지 7개의 출력선들과 반대값을 갖는다.

 

 

 

 

 

2.소스코드 및 코드설명

library ieee;

use ieee.std_logic_1164.all;

 

entity Decoder_38 is -- Decoder_38에 대한 entity

port ( A : in std_logic_vector (2 downto 0);     --A 입력 로직벡터 (3부터0 내림차순), A2A1A0 3비트 선언

Y :out std_logic_vector (7 downto 0));   --Y 출력 로직벡터(7부터 0내림차순) , 8비트 선언

end Decoder_38;

 

architecture Behavioral of Decoder_38 is   --Decoder_38에 대한 동작적모델링

begin

process(A)                                             -- A의 입력신호 변화에의한 순차적 처리begin

case A is

when "000" => Y <= "00000001";

when "001" => Y <= "00000010";

when "010" => Y <= "00000100";

when "011" => Y <= "00001000";

when "100" => Y <= "00010000";

when "101" => Y <= "00100000";

when "110" => Y <= "01000000";

when "111" => Y <= "10000000";

end case; --CASE문 종료

end process; -- 순차처리문 종료

end Behavioral; --동작적모델링 종료

 

3.시뮬레이션 결과 및 설명

 

 

 

 

(1) 입력신호 A의 값이 001이 나올 경우 디코더의 출력 Y의 값은 00000010이 나왔다.

설계한 디코더의 진리표에서 A 001일시 Y의 출력은 Y(1), Y 1비트에 1을 선택하였으므로 나머지 비트의 출력은 Y 1비트의 출력값과 반대이다.

 

(2) 입력신호 A의 값이 000이 나올 경우 디코더의 출력 Y의 값은 00000001이 나왔다.

설계한 디코더의 진리표에서 A 000일시 Y의 출력은 Y(0), Y 0비트에 1을 선택하였으므로 나머지 비트의 출력은 Y 0비트의 출력값과 반대이다.

 

(3) 입력신호 A의 값이 111이 나올 경우 디코더의 출력 Y의 값은 10000000이 나왔다.

설계한 디코더의 진리표에서 A 1일시 Y의 출력은 Y(7), Y 7비트에 1을 선택하였으므로 나머지 비트의 출력은 Y 7비트의 출력값과 반대이다.

 

 

디코더의 진리표는 설계자에 의해 입출력이 달라 질 수있다.

 

 

반응형

'VHDL' 카테고리의 다른 글

FND DECODER ( DE2보드)  (0) 2021.06.08
8x3 Encoder , 8x3 엔코더 VHDL  (0) 2021.06.08
조합회로 - Multiplexer(Mux) 4x1,8x1  (0) 2021.06.08
ALU dataflow  (0) 2021.06.08
Demultiplexer(Demux) 1x4,1x8  (0) 2021.06.08

+ Recent posts