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

entity modMCounter is
    generic (
            M : integer := 5; -- count from 0 to M-1
            N : integer := 3   -- N bits required to count upto M i.e. 2**N >= M
    );
    
    port(
            clk, reset : in std_logic;
            complete_tick : out std_logic;
            count : out std_logic_vector(N-1 downto 0)
    );
end modMCounter;
architecture arch of modMCounter is
    signal count_reg, count_next : unsigned(N-1 downto 0);
begin
    process(clk, reset)
    begin
        if reset = '1' then 
            count_reg <= (others=>'0');
        elsif   clk'event and clk='1' then
            count_reg <= count_next;
        else  -- note that else block is not required
            count_reg <= count_reg;
        end if;
    end process;
    
    -- set count_next to 0 when maximum count is reached i.e. (M-1)
    -- otherwise increase the count
    count_next <= (others=>'0') when count_reg=(M-1) else (count_reg+1);
    
    -- Generate 'tick' on each maximum count
    complete_tick <= '1' when count_reg = (M-1) else '0';
    
    count <= std_logic_vector(count_reg); -- assign value to output port
end arch;

이 코드는 모듈로 카운터를 구현한 코드입니다. 

이 모듈러 카운터는 특정 범위 내에서 지정한 간격으로 카운트를하는 카운터로, 카운트가 최댓값에 도달하면 다시 0부터 시작합니다. 이 코드는 0부터 M-1까지 카운트하며, N비트가 필요합니다.

이 도뮬은 총 4개의 포트로 구성이됩니다. clk와 reset은 각각 카운터를 증가시키는 클록 신호와 카운터를 초기화하는 리셋 신호입니다. 

compelete_tick은 카운트가 M-1에 도달할때마다 '1'신호가 출력되는 출력 포트입니다. count는 현재 카운트 값이 출력되는 포트로,N비트의 벡터로 구성이됩니다.

clk와 reset 신호에 대한 process가 정의되어 있으며, reset이 '1'일 경우 count_reg가 0으로 초기화됩니다. clk의 edge가 감지되면 count_next 신호가 count_reg로 할당됩니다. 그 외의 경우는 count_reg를 유지합니다.

count_next는 현재 카운트 값이 M-1에 도달하면 0으로 리셋됩니다. 그렇지 않은 경우에는 카운트 값을 1씩 증가시킵니다. complete_tick은 count_reg가 M-1일 때 '1'로 할당되며, 그렇지 않은 경우에는 '0'으로 유지됩니다.

count는 count_reg 값을 N 비트의 벡터로 변환하여 출력합니다.

 

다음은 이 모듈로 카운터의 테스트벤치 코드입니다.

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

entity modMCounter_tb is
end modMCounter_tb;


architecture arch of modMCounter_tb is
    constant M : integer := 3;  -- count upto 2 (i.e. 0 to 2)
    constant N : integer := 4;
    constant T : time := 100 ns; 

    signal clk, reset : std_logic;  -- input
    signal complete_tick : std_logic; -- output
    signal count : std_logic_vector(N-1 downto 0);  -- output

    -- total samples to store in file
    constant num_of_clocks : integer := 30; 
    signal i : integer := 0; -- loop variable
    begin

    modMCounter_unit : entity work.modMCounter
        generic map (M => M, N => N)
        port map (clk=>clk, reset=>reset, complete_tick=>complete_tick,
                    count=>count);

    -- reset = 1 for first clock cycle and then 0
    reset <= '1', '0' after T/2;

    -- continuous clock
    process 
    begin
        clk <= '0';
        wait for T/2;
        clk <= '1';
        wait for T/2;

        -- run 30 clocks
        if (i = num_of_clocks) then
           wait;
        else
            i <= i + 1;
        end if;
    end process;
end arch;

테스트벤치에서 사용되는 입력 신호는 clk와 reset입니다. clk는 일정한 주기로 반복되는 신호이며, reset은 모듈의 초기화를 수행하는데 사용됩니다.
테스트벤치에서 사용되는 출력 신호는 complete_tick과 count입니다. complete_tick은 모듈이 최대 카운트 값을 도달했을 때 생성되는 신호입니다. count는 현재 카운트 값을 나타내는 N비트 이진수 신호입니다.
테스트벤치는 시뮬레이션 시간을 T만큼 주기적으로 반복하면서, 모듈을 호출하고, 모듈이 제공하는 출력값을 파일에 저장합니다. 출력값은 이진수 형태로 저장됩니다.
테스트벤치는 초기에 reset 신호를 설정하고, 일정 주기마다 clk 신호를 생성하면서 모듈을 호출하고, 출력값을 저장하며, 시뮬레이션 시간이 끝날 때까지 반복됩니다.

'Computer_logic' 카테고리의 다른 글

Testbench  (0) 2023.04.06
Mealy & Moore VHDL code  (0) 2023.04.05
Mealy FSM & Moore FSM  (0) 2023.04.05
TCP Congestion control  (0) 2022.11.09
FLOW control  (0) 2022.11.09

이 테스트벤치는 디지털 회로를 시뮬레이션하고 검증하기 위한 코드입니다. 디지털 회로는 하드웨어 자체적으로 테스트하기 어려운 경우가 많아서, 테스트벤치를 작성하여 시뮬레이션을 수행하고 회로의 동작을 확인합니다.

또한 입력 신호를 생성하고, 이를 디지털 회로에 적용하여 출력 신호를 측정하고 검증합니다. 이를 위해 테스트벤치는 주어진 입력에 대한 예상 출력을 정의하고, 디지털 회로가 예상 출력과 동일한지를 확인합니다.

테스트벤치

library ieee;
use ieee.std_logic_1164.all;

entity half_adder is 
  port (a, b : in std_logic;
        sum, carry : out std_logic
    );
end half_adder;

architecture arch of half_adder is
begin
  sum <= a xor b;
  carry <= a and b;
end arch;

이코드는 하프에더의 vhdl code입니다. 두개의 입력(a,b)과 두개의 출력(sum,carry)을 가지고있습니다.

sum은 xor연산자를 이용하여 계산되며, carry는 and연산자를 이용하여 계산됩니다.

 

다음은 이 하프에더의 테스트 벤치 코드입니다.

library ieee;
use ieee.std_logic_1164.all;


entity half_adder_simple_tb is
end half_adder_simple_tb;

architecture tb of half_adder_simple_tb is
    signal a, b : std_logic;  -- inputs 
    signal sum, carry : std_logic;  -- outputs
	 
begin
    -- connecting testbench signals with half_adder.vhd
    UUT : entity work.half_adder port map (a => a, b => b, sum => sum, carry => carry); 
	 -- half_adder and the TB must be in the same directory
	 
   STIM: process 
      constant period: time := 50 ns;
    begin
         a <= '0';
         b <= '0';
         wait for period;
         assert ((sum = '0') and (carry = '0'))  -- expected output
         -- error will be reported if sum or carry is not 0
         report "test failed for input combination 00" severity error;
         a <= '0';
         b <= '1';
         wait for period;
         assert ((sum = '1') and (carry = '0'))
         report "test failed for input combination 01" severity error;

         a <= '1';
         b <= '0';
         wait for period;
         assert ((sum = '1') and (carry = '0'))
         report "test failed for input combination 10" severity error;

         a <= '1';
         b <= '1';
         wait for period;
         assert ((sum = '0') and (carry = '1'))
         report "test failed for input combination 11" severity error;

         -- Fail test
         a <= '0';
         b <= '1';
         wait for period;
         assert ((sum = '0') and (carry = '1'))
         report "test failed for input combination 01 (fail test)" severity error;

         wait; -- indefinitely suspend process
    end process;
end tb ;

이 테스트벤치코드는 half_adder.vhd 파일에서 정의된 half_adder라는 이름의 엔티티를 테스트합니다.

이 테스트 벤치에서는 입력신호 a,b와 출력신호 sum,carry를 정의합니다. 

UUT라는 이름으로 half_adder엔티티를 인스턴스화 하고, 이를 테스트벤치의 입력과 출력신호와 연결합니다.

이것을 통하여 입력신호를 half_adder로 전달하고, 출력 신호를 테스트벤치로 가져올 수 있습니다.

 

STIM프로세스는 테스트벤치의 핵심입니다. 이 프로세스는 입력신호 a,b에 값을 할당하고, 이를 half_adder에 전달하여 출력신호 sum,carry를 측정합니다. 이후 예상 출력값과 실제 출력값이 일치하는지 확인하기 위해 assert문을 사용합니다.

여기서는 입력신호 a,b가 00,01,10,11순서로 변화하며, 각각의 대해 예상 출력값을 assert문으로 검증합니다.

그리고 fail test를 실행하여 예상출력값과 다른 경우의 assert문도 확인합니다.

'Computer_logic' 카테고리의 다른 글

Modulo M counter  (0) 2023.04.06
Mealy & Moore VHDL code  (0) 2023.04.05
Mealy FSM & Moore FSM  (0) 2023.04.05
TCP Congestion control  (0) 2022.11.09
FLOW control  (0) 2022.11.09

무어머신입니다 헿

USE ieee.std_logic_1164.all ;

ENTITY simple IS
	PORT (	clock   : IN STD_LOGIC ;
                     resetn  : IN STD_LOGIC ;
                     w          : IN STD_LOGIC ;
			 z          : OUT STD_LOGIC ) ;
END simple ;

ARCHITECTURE Behavior OF simple IS
	TYPE State_type IS (A, B, C) ;
	SIGNAL y : State_type ;
BEGIN
	PROCESS ( resetn, clock )
	BEGIN
		IF resetn = '0' THEN
			y <= A ;
		ELSIF (Clock'EVENT AND Clock = '1') THEN
        CASE y IS
				WHEN A =>
					IF w = '0' THEN 
						y <= A ;
					ELSE 
						y <= B ;
					END IF ;
				WHEN B =>
					IF w = '0' THEN
						y <= A ;
					ELSE
						y <= C ;
					END IF ;
				WHEN C =>
					IF w = '0' THEN
						y <= A ;
					ELSE
						y <= C ;
					END IF ;
			END CASE ;
            END IF ;
	   END PROCESS ;
	
         z <= '1' WHEN y = C ELSE '0' ;

END Behavior ;

무어머신 VHDL code해석을 진행해보도록 하겠습니다......

우선 환경 설정을 해주고 clock과 reset을 선언해주고 w라는 인풋과 z라는 인풋을 선언해줍니다.

그리고 스테이트들을 선언을 해줍니다.

y는 현재 상태를 저장하는 신호로 초기상태 'A'로 설정됩니다.

PROCESS블록에서는 clock과 resetn의 신호를 감지하고이에따라 동작을 제어합니다.

만약 resetn의 신호가 0이면 y는 초기상태의 A로 설정됩니다.

만약 현재 스테이트가 A라면 인풋으로 0이 들어온다면 현재상태 A인 그대로 있으며 그게 아니라면 스테이트는 B로 설정이 됩니다. 만약 현재 상태가 B라면 인풋으로 0이 들어온다면 스테이트는 A로 바뀔것이며 그게 아니라면 스테이트는 C로 바뀔것입니다. 만약 현재 상태가 C라면 인풋으로0이 들어온다면 스테이트는 A로 바뀔것이며 그게아니라면 C로 바뀔것입니다.

아웃풋의 설정을 보면 현재 스테이트가 C일때만 아웃풋이 1이고 그게 아니라면 0을 출력하도록 되어있습니다.

 

이것은 밀리머신입니다.

LIBRARY ieee ;
USE ieee.std_logic_1164.all ;

ENTITY Mealy IS
	PORT ( 	clock     : IN 		STD_LOGIC ;
                     resetn   : IN 		STD_LOGIC ;
                     w 		: IN 		STD_LOGIC ;
			z      	: OUT 	STD_LOGIC ) ;
END Mealy ;

ARCHITECTURE Behavior OF Mealy IS
	TYPE State_type IS (A, B) ;
	SIGNAL y : State_type ;
BEGIN
	PROCESS ( resetn, clock )
	BEGIN
		IF resetn = '0' THEN
			y <= A ;
		ELSIF (clock'EVENT AND clock = '1') THEN
        CASE y IS
			       WHEN A =>
			              IF w = '0' THEN 
                                                  y <= A ;
				ELSE 
                                                  y <= B ;
				END IF ;
			        WHEN B =>
				IF w = '0' THEN 
                                                   y <= A ;
				ELSE 
                                                   y <= B ;
			        	END IF ;
			END CASE ;
            END IF ;
	END PROCESS ;

	WITH y SELECT
		z <= w WHEN B,
              z <= ‘0’  WHEN others;

END Behavior ;

이 밀리머신도 아까의 무어머신과 동일하게 설정과 스테이트 인풋과 아웃풋의 설정 그리고 특정 스테이트의 인풋값에 따라서 스테이트의 변화를 다 설정을 해줍니다. 그리고 마지막에 아웃풋을 결정하는 코드에서 만약 스테이트가 B라면 아웃풋으로 인풋값을 넣고 만약 아니라면 아웃풋값에 0을 넣어줍니다.

'Computer_logic' 카테고리의 다른 글

Modulo M counter  (0) 2023.04.06
Testbench  (0) 2023.04.06
Mealy FSM & Moore FSM  (0) 2023.04.05
TCP Congestion control  (0) 2022.11.09
FLOW control  (0) 2022.11.09

Finite State Machines(유한상태기계)는 주어진 입력에 따라 사전 정의된 동작을 수행하는 자동화된 기계입니다. FSM은 입력이 발생할 때 현재 상태에서 다음 상태로 전환하고, 출력을 생성합니다. FSM은 상태, 입력 및 출력에 대한 추상화된 모델을 사용하여 디지털 논리 회로 설계를 기술하는 데 자주 사용됩니다.

 

FSM은 두 가지 종류가 있습니다. Mealy 모델과 Moore 모델입니다. Mealy 모델에서는 상태 전이와 출력 값이 입력 및 현재 상태에 따라 결정됩니다. 반면에 Moore 모델에서는 상태 전이와 출력 값이 현재 상태에만 의존합니다. 각각의 모델은 특정 문제를 해결하기 위해 사용됩니다.

 

무어 모델은 상태 전이와 출력 값이 서로 독립적입니다. 즉, FSM의 현재 상태만으로 출력 값을 결정합니다. 따라서 무어 모델에서는 출력 값이 현재 상태에 대한 함수로 표현됩니다. 예를 들어, 현재 상태가 "정지"일 때 "정지" 라는 출력을 내보냅니다. 무어 모델은 출력 값이 안정적이며, 회로 구성이 단순하며 구현이 쉬워서 자주 사용됩니다.

 

밀리 모델은 상태 전이와 출력 값이 입력 값에 따라 결정됩니다. 따라서 밀리 모델에서는 출력 값이 입력 값과 현재 상태에 대한 함수로 표현됩니다. 예를 들어, 입력 값이 "1"이면 현재 상태에 따라 "1" 또는 "0"을 출력합니다. 밀리 모델은 출력 값이 동적이며, 상태 전이에 대한 피드백을 받아 반응성을 높일 수 있습니다. 하지만 회로 구성이 복잡하며, 디자인이 어렵습니다.

 

이 사진은 무어머신입니다.
이 사진은 밀리머신입니다.
이 타이밍 다이어그램은 입력받은 input에 따라 무어머신과 밀리머신의 스테이트와 출력값을 나타낸것입니다.

이 타이밍 다이어그램을 통하여 무어머신과 밀리머신의 state는 인풋에 따라서 즉각적으로 변하지만 출력값은 밀리머신은인풋값이 0으로 떨어짐과 동시에 바로 아웃풋으로 1이 출력되는것을 볼수있고 그에 반하여 무어머신은 클락에 동기화하여 스테이트가 변한 직후에 아웃풋이 변하는걸 관찰할 수 있습니다.

 

다음은 무어머신과 밀리머신의 쿼터스의 vhdl을 통한 코드작성입니다.

이것은 무어머신입니다.

TYPE state IS (S0, S1, S2);
SIGNAL Moore_state: state;

U_Moore: PROCESS (clock, reset)
BEGIN
	IF(reset = ‘1’) THEN
		Moore_state <= S0;
	ELSIF (clock = ‘1’ AND clock’event) THEN
		CASE Moore_state IS
			WHEN S0 =>
			  IF input = ‘1’ THEN
                    Moore_state <= S1; 
                ELSE
                   Moore_state <= S0;
                END IF;
            WHEN S1 =>
			  IF input = ‘0’ THEN 
                                     Moore_state <= S2; 
                              ELSE
                                     Moore_state <= S1; 
                              END IF;
	                  WHEN S2 =>
			  IF input = ‘0’ THEN
                                     Moore_state <= S0; 
			  ELSE 
                                     Moore_state <= S1; 
                              END IF;
		END CASE;
	END IF;
END PROCESS;

Output <= ‘1’ WHEN Moore_state = S2 ELSE ‘0’;

위 코드를 잘 보면 state의 상태들을 제시하고 clock과 reset을 동기화 해주었습니다.

만약 reset이 1이라면 초기 스테이트인 S0로 이동하도록 해주었으며, CLOCK이 1이면 무어머신의 현재 스테이트가 S0라면 인풋값으로 1이들어오면 스테이트는 S1로 설정이되게하고, 그게아니라면 S0으로 설정이되게 하였습니다. 

만약 현재 스테이트가 S1이라면 인풋값으로 0이 들어온다면 스테이트를 S2로 설정을 해주고 그게 아니라면 S1으로 설정을 하게 하였습니다.

만약 현재 스테이트가 S2라면 인풋값으로 0이 들어오면 스테이트를 S0로 옮겨지게 설정을 해주고 그게 아니라면 S1으로 설정을 해주게 하였으며 맨 밑 코드에 나와있는것처럼 아웃풋 설정은 무어머신의 현재 스테이트가 S2라면 1을 출력하고 그게 아니라면 0을 출력하게 설정이 된걸 볼 수 있습니다.

 

이것은 밀리머신입니다.

TYPE state IS (S0, S1);
SIGNAL Mealy_state: state;

U_Mealy: PROCESS(clock, reset)
BEGIN
	IF(reset = ‘1’) THEN
		Mealy_state <= S0;
	ELSIF (clock = ‘1’ AND clock’event) THEN
		CASE Mealy_state IS
		    WHEN S0 =>
	            IF input = ‘1’ THEN 
                     Mealy_state <= S1; 
                ELSE
                     Mealy_state <= S0;
                END IF;
            WHEN S1 =>
			  IF input = ‘0’ THEN
                                     Mealy_state <= S0; 
                               ELSE
                                     Mealy_state <= S1;
                               END IF;
		END CASE;
	END IF;
END PROCESS;

Output <= ‘1’ WHEN (Mealy_state = S1 AND input = ‘0’) ELSE ‘0’;

이 밀리머신을 구현한 VHDL코드를 보면 알겠듯이 아까 무어머신과는 동일하게 스테이트 설정을 해주고 스테이트 이동도 인풋에 따라서 비슷하게 구현이 되었습니다. 근데 여기에서 마지막에 아웃풋을 설정해주는 코드를 유심히보면 알겠지만

현재 스테이트의 값과 다음 인풋에 따라서 아웃풋이 결정된다는걸 알수있습니다. 

만약 현재의 밀리머신의 스테이트값이 S1이고 인풋이 0이라면 바로 아웃풋은 1이고 그게 아니라면 0이라고 해석이됩니다.

다음은 좀 더 자세하게 무어머신과 밀리머신의 VHDL코드에 대하여 알아보도록 하겠습니다.

'Computer_logic' 카테고리의 다른 글

Testbench  (0) 2023.04.06
Mealy & Moore VHDL code  (0) 2023.04.05
TCP Congestion control  (0) 2022.11.09
FLOW control  (0) 2022.11.09
TCP에러컨트롤  (0) 2022.11.09

Unix는 소프트웨어 개발하고 실행할수있는 편리한 플랫폼임 이건 쉽게 수정해서 컴퓨터에 적용할 수 있었음. 유닉스 기반으로 하는 다양한 운영체제 만들어짐.

c로 대부분 작성되어서 다른 컴퓨터에 적용 편했는데 이러한 유닉스 변형할수있는 언어인 c언어도 인기얻었음.

이러한 유닉스 수정해서 다른 컴에 적용하는 사례가 너무 많아져서 변형에 제한을 두는 POSIX라는 유닉스의 표준이 만들어짐.

그리고 얘네가 돈받아서 사람들이 화나서 GNU라는 운영체제 만들었는데 이때 커널이 완성이 안됐는데 리누스가 커널 하나 완성하게돼서 GNU가 이걸로 합쳐서 만들었는데 이걸 GNU/Linux라고부름 리눅스는 완전한 운영체제가 아니라 운영체제의 핵심부분인 커널에만 해당

Ubuntu, Red hat, CentOS, Debian이런 운영체제들이 다 Gnu/Linux를 변형해서 만들어진거임.

그냥 윈도우를 제외한 모든 운영체제는 유닉스에서 파생된거임.

이러한 유닉스 운영체제들은 유닉스커멘드를 사용하지만 윈도우는 윈도우 커멘드를 사용.

개발에서는 유닉스 커멘드 많이 사용 웹사이트 배포과정에서 사용

또한 ai서비스를 개발할때 성능이 좋아야해서 개인컴퓨터 말고 서버 컴퓨터 필요한데 서버 컴퓨터 사용할때도 유닉스 커멘드 사용됨. 

윈도우 에서 유닉스 커멘드를 배우려면 컴퓨터에 Ubuntu를 사용하면됨.

WSL를 사용하기

가상머신 사용하기

두가지로 할수있음.

POWERSHELL의 관리자 모드를 사용하여 WSL을 사용가능.

역시 바로 에러발생 ㅋㅋㅋ

휴 다행히 2시간만에 에러 해결...

클라이언트 서버 모델: 

클라이언트는 필요할때 요청을 하는것이고 서버는 응답을 하는것

서버하나에 여러 클라이언트가 연결 시도

서버는 클라이언트에 대하여 아무런 정보 없어도됨 단 항상 켜져있어야함 클라이언트는 서버에 대하여 알고있어야됨

ip주소는 위치 기반배정이라 클라이언트는 서버의 ip를 알고있어야함

1. 클라이언트가 먼저 요청을 서버로 보냄 요청을 보내기 위하여 위치알아야함 ip주소와 포트넘버 알아야함

(ip주소와 포트넘버를 합쳐서 소켓 address라고 함)

2. 서버는 리소스를 바탕으로 요청을 핸들함

3.서버가 클라이언트에게 응답을줌

4.서버는 응답을 핸들함

 

프로세스는 러닝 프로그램

서버는 최초에 컴퓨터가 켜질때 생성이됨 부팅을 하면서 자동으로 서버 프로그램이 생성이됨 컴꺼질때 까지 계속 돌아감

이런프로세스가 많음(daemons라고함)

 

socket은 무엇인가

api라고보면됨 우리가 만든 어플리케이션 프로그램이 돌아가면서 네트워크 기능이 필요할때 os에 데이터를 보내라 요구를 하게 되는데 요구를 하는 어떤 창구

os에 요청을할때 인터페이스의 역할을 하는것

소켓에는

stream socket tcp같은 커넥션 오리엔티드 프랜스포트레이어 프로토콜을 위한 소켓임

SOCK_STREAM이라고 씀

datagram socket UDP를 위한 소켓

SOCK_DGRAM이라씀 

raw가 있음

이 소캣은 여러개일수가 있는데 그에 반하여 os의 transport layer은 하나임 어플리케이션의 pocess별로 소캣이 하나씩 할당이됨.

 

 

transport layer은 p1과 p2가 만들어낸 데이터가 transport layer로 전달이 되면 걔네들을 묶어서 아래로 내려보내는 역할을함.

다만 구분하기위해 주소는 다르게 배정함 포트넘버 같은거 그걸 멀티플렉싱이라고함

또한 받아서 올라온 데이터들을 transport layer에서 p1과 p2에 알맞은 소켓에 전달해줘야함(이때 포트넘버를 사용하여 구분)

 

connectionless demultiplexing

connectionless socket은 하나의 소켓당 하나의 process가 할당됨

udp 경우 똑같은 destination포트번호로 보내진 udp패킷중에 다른 소켓 어드레스를 가진 애들은 하나의 소켓으로 보내져서 어플리케이션이 이걸 구분해줘야함

os가  어플리케이션으로 소스 소켓 어드레스정보를 같이 올려줘서 이걸로 구분을함

반면에 connection oriented socket은 하나의 소켓당 여러개의 process가 할당됨

tcp소켓은 4개의 정보를 가지고 소켓을 식별함

이걸 4-tuple이라고함

source ip address, source port number, dest ip address, dest port number

문지기는 리스닝 소켓이고 실제는 커넥션 소켓이함

tcp는 처음에 서버가 먼저 소켓을 생성함 그다음 바인딩(소켓에 어드레스를 할당)함 그다음 리슨을함 클라이언트로부터 요청이 오는지 듣고있음 다음 클라이언트는 소켓을 만들고 이때 클라이언트 주소는 커넥트할때 할당받음 포트넘버는 랜덤하게 결정됨 다음 커넥트로 서버와의 커넥트 시도 리슨하고있던 서버가 커넥션 요청이오면 3핸드쉐이크를하고 성공적이면 커넥팅소켓 만들어서 센드 리시브하면서 데이터 주고받고 끝날땐 클로즈로 닫음

tcp는 이런식의 함수를 사용

udp는 똑같이 클라이언트 서버 모두 소켓 생성하고 주소할당후에 커넥션과정없이 센드투 리시브 프롬으로 데이터 주고받음근데 이 샌드투와 리시브 프롬은 항상 소켓 어드레스를 명시해줘야함

udp는 이런식의 함수를 사용

 

윈도우에서 handle의 의미

운영체제 리소스를 안전하게 관리하기 위해 주소 대신 이와 연결된 핸들값을 알려주어 접근하게 한다 정수값을 가짐

소켓은 윈도우에서는 핸들로 취급함

텍스트 마이닝 & 워드클라우드

현재까지 숫자 형태의 데이터를 다루는 방법을 학습

데이터 분석 대상 중에는 숫자 뿐만 아니라 문자 형태의 데이터도 있음 ex)이메일 카톡 댓글등

텍스트 마이닝은 문자형 데이터를 분석하는 대표적 방법

명사들의 출현 빈도수를 계산하여 시각화함 -> 이를 단어들이 모여 만들어진 구름처럼 시각화한 것이 워드 클라우드

 

워드클라우드를 활용한 텍스트 마이닝 순서

1.워드클라우드 그래픽 실현을 위한 jre설치 rtools설치

2.텍스트 데이터 생성 및 저장

3.koNlp패키지 설치

4.워드 클라우드 생성

 

텍스트 데이터 생성하기

워드클라우드를 작성할 대상 문서는 일반적으로 텍스트 파일 형태(.txt)로 준비

텍스트 파일의 마지막 문장이 끝나면 반드시 줄바꿈 엔터키를 한후에 저장

파일 저장할땐 인코딩 UTF-8로저장

파일 저장할땐 영어로 이름 설정

 

KONLP자연어 처리 패키지: 자연어처리란 컴퓨터가 사람의 언어를 이해할 수 있도록 처리하는 과정이며, 텍스트 마이닝에서 필수적인 과정

한국어를 자연어 처리로 분석할수 있도록 돕는 패키지임

wordcloud(names(wordcount), 
freq=wordcount, 
scale=c(7,1), 
rot.per=0.25,
단어 빈도수를 바탕으로 개별 단어의 크기를 정하고 
전체 워드클라우드의 크기를 정하고 
90도 돌아간 단어들의 비중(0~1) 
min.freq=1, 워드클라우드에 포함되는 단어의 최소 빈도수 
random.order=F, 
random.color=T,
무작위 배치 유무
단어들의 무작위 색상 지정 유무 
colors=palete) 색상 설정

워드클라우드 생성하기

워드클라우드 2로 더 예쁜 워드클라우드 만들기

library(wordcloud2) 
wordcloud2(wordcount, 
shape = “star”)

 

인터넷 검색어 분석하기

인터넷 검색어를 중심으로 사용자들의 관심사를 분석할 수 있도록 지원해주는 많은 사이트들이 있음 ex)네이버 데이터랩,구글 트렌드

 

공공빅데이터

공공데이터 포털은 가장 풍부한 공공데이터를 제공하는 사이트임

 

요약정리


 JRE 설치 / RTools설치
 텍스트 데이터 생성 및 저장
– 텍스트 파일 형태(.txt)로 준비
– 반드시 줄 바꿈(Enter 키)을 한 후에 저장
– “다른 이름으로 저장”을 선택하고, 인코딩을 UTF-8로 저장 
– 파일명은 영어로 저장 
 KoNLP패키지 설치 
– Sys.setenv()
– install.packages("KoNLP")

워드클라우드생성
– library(KoNLP) 
– library(wordcloud) 
– library(RColorBrewer)
– 변수 <- readLines("위치“) 
– 변수 <- toString(변수) 
– buildDictionary(ext_dic= “woorimalsam”) 
– noun <- extractNoun(변수) 
– wordcount<-table(noun)
- palete<- brewer.pal(색의수, “빨레트 이름”)
- wordcloud(names(wordcount))
-library(wordcloud2)
- wordcloud2(wordcount, shape = “star”)

 

'빅데이터' 카테고리의 다른 글

데이터 시각화  (0) 2022.12.04
회귀분석  (0) 2022.12.04
다중변수 자료  (0) 2022.12.04
데이터 구조파악  (0) 2022.12.03

데이터 시각화는 데이터 분석 결과를 쉽게 이해할수 있도록 시각적으로 표현하는 과정임

데이터를 요약하고, 한눈에 살펴볼수있도록 돕는 시각화가 필수임

 

필수요소

정보 이해를 돕는 데이터 구조 파악

적절한 데이터 표현 기법 사용

효과적인 시각화 디자인

 

실무에서 가장 많이 사용되는 시각화 도구 
treemap(트리맵 생성) 

사각 타일의 형태로 구성 데이터에 존재하는 계층구조 표현가능

treemap() 함수 
treemap(data, 
index=c(“계층구조1”, “계층구조2”), 
vSize = “크기 기준변수”)

install.packages("treemap") #패키지 설치 
library(treemap) #패키지 불러오기 
data("GNI2014") #데이터 불러오기 
head(GNI2014) #데이터 확인하기
treemap(GNI2014, 
index = c("continent", "iso3"), #계층구조 설정 
vSize = "population", #타일 크기 
vColor = "GNI", #타일 색상 
type = "value", #타일 컬러링 방법 
bg.labels = "yellow", #레이블 배경색 
title = "세계 GNI") #트리맵 제목


symbols(버블차트 생성) 

산점도 위에 버블의 크기로 정보를 표시하는 시각화 방법

별도의 패키지 설치 안해도됌

symbols() 함수 
symbols(x축 변수, y축 변수, 
circles = 원 기준 변수)

state <- data.frame(state.x77) #매트릭스 -> 데이터프레임 변환 
symbols(state$Illiteracy, state$Murder, #원의 x, y 좌표의 열 
circles = state$Population, #원의 반지름 열 
inches = 0.3, #원의 크기 조절 값 
fg = "white", #원의 테두리 색 
bg = "lightgray", #원의 바탕색 
lwd = 1.5, #원의 테두리 두께 
xlab = "문맹률", #x축 범례 
ylab = "살인율", #y축 범례 
main = "문맹률과 살인율 버블차트") #버블차트 제목

text(state$Illiteracy, state$Murder, #텍스트가 출력될 x, y 좌표 
rownames(state), #출력할 텍스트 
cex = 0.6, #폰트 크기 
col = "brown") #폰트 컬러


mosaicplot(모자이크 플롯 생성) 

다중변수 범주형 데이터에 대해 각 변수의 그룹별 비율을 면적으로 표시하여 정보를 전달

mosaicplot() 함수 
mosaicplot(~ x축변수+ y축변수, 
data = 데이터프레임)

data(mtcars)
mosaicplot(~gear+vs, 
data = mtcars, 
color = TRUE, 
main = "Gear & Vs")

 


ggplot(데이터 시각화 통합 도구)

기본함수를 사용해 그래프를 그릴수있지만, 더욱 심미적인 그래프 작업을 위해 ggplot패키지를 주로 사용

install.packages("ggplot2") 
library(ggplot2)

기본구조

ggplot(data = 데이터프레임, aes(x=x축 변수, y=y축 변수)) # 그래프 틀
+ <geom_FUNCTION>(stat=“identity”, width =수치, fill ="컬러") # 그래프 형태

 

막대 그래프

범주형 변수에 대한 값의 빈도 개수를 표시하는 그래프

library(ggplot2) #ggplot 패키기 가져오기 
month <- c(1, 2, 3, 4, 5, 6) #월 벡터 
weight <- c(40, 48, 47, 45, 43, 39) #몸무게 벡터 
df <- data.frame(month, weight) #월 & 몸무게 데이터프레임
ggplot(data=df, aes(x = month, y = weight)) #x, y축 지정 
+ geom_bar(stat = "identity", width = 0.8, fill = "steelblue") 
#막대 높이, 막대 폭, 막대 색상 지정하여 그래프 생성

선그래프

무언가가 지속적으로 변화하는것을 기록할때 유용

library(ggplot2) 
head(Orange)
ggplot(data= Orange, 
aes(x = age, y = circumference)) # 그래프 작성 대상 지정 
+ geom_line(aes(color = Tree)) # 선그래프 생성

 

산점도

변수간의 상관관계를 표현하기 위해 사용

평균에서 벗어난 이상치 값 파악할때 유용

data(mtcars) 
library(ggplot2)
ggplot(data=mtcars, aes(x = hp, y = mpg)) 
+ geom_point()

 

상자 그래프

연속형 변수에 대한 데이터 분포를 표시

최소 최대값을 표시하며 분포와 이상치를 찾는데 특화됨

library(ggplot2) 
ggplot(data=mtcars, aes(y = hp)) + geom_boxplot()

 

차원축소란 고차원 데이터를 2-3차원으로 축소하는 기법

차원축소 이유 : 2~3차원으로 축소된 데이터로 산점도를 작성하여 데이터 분포 확인을 위해 
차원축소 방법 : 3차원 상의 물체를 빛에 비추면 그림자가 생기는 것과 비슷한 방법 활용

 

Rtsne() 함수 사용

library(Rtsne) 
library(ggplot2) 
library(survival) 
cancer <- gbsg[, c("age", "size", "grade", "nodes")]  #gbsg 데이터셋 중 필요한 열만 추출 
grade <- cancer$grade #grade 열 추출
#4차원 데이터를 2차원으로 축소하기
tsne <- Rtsne(cancer, dim = 2, perplexity = 10, check_duplicates = FALSE)
#차원축소 결과 시각화
tsneDF <- data.frame(tsne$Y) 
ggplot(data=tsneDF, aes(x=X1, y=X2, color = grade)) + geom_point(size = 2)

 

요약정리

 

데이터 시각화
– 트리맵 treemap() 함수
treemap(data, index=c(“계층구조1”, “계층구조2”), vSize=“크기 기준변수”) 
– 버블차트 symbols() 함수
symbols(x축 변수, y축 변수, circles = 원 기준 변수) 
– 모자이크 플롯 mosaicplot() 함수
mosaicplot(~ x축 변수 + y축 변수, data = 데이터프레임)

 

ggplot
ggplot(data = 데이터프레임, aes(x=x축 변수, y=y축 변수)) # 그래프 틀 
+ <geom_FUNCTION>(stat=“identity”, width =수치, fill ="컬러") # 그래프 형태 
– geom_FUNCTION

geom_bar: 막대 그래프 
geom_line: 선 그래프 
gom_point: 산점도 
geom_boxplot: 상자 그래프

 

차원 축소
– Rtsne(데이터프레임, dim = 차원 수, perplexity = 10, check_duplicate= F)

'빅데이터' 카테고리의 다른 글

R텍스트 마이닝  (0) 2022.12.05
회귀분석  (0) 2022.12.04
다중변수 자료  (0) 2022.12.04
데이터 구조파악  (0) 2022.12.03

+ Recent posts