Blog | Tag | Local | Guest | Login | Write |  RSS
분류 전체보기에 해당되는 글 110건
2008.12.23 :: Slide Image Menu 4622
2008.12.18 :: ADC 강좌
2008.12.17 :: 공지사항입니다. 1
2008.12.16 :: Flip Image Banner
Slide Image Menu

오늘은 Slide형태의 메뉴를 구현 해보도록 하겠습니다. 예전에 옥션이였나 G마켓이였나에서 본적이 있는 메뉴인데 생각이 나서 만들어 보았습니다. 아래는 시연동영상입니다.



1~6번까지 메뉴가 있으며 해당 번호를 클릭하면 슬라이드 되면세 해당 위치로 이동하게됩니다. 메뉴하나하나에 광고를 넣어서 광고용으로 사용해도 될것같습니다.  XAML을 사용해서 기본적인 내용을 구성했으며 C#에서는 이벤트에 따른 Animation호출 부분을 구현했습니다. 먼저 아래는 XAML 소스코드입니다.

  1. <WINDOW title="Image Slide View - WPF KOREA(Http://whatisthat.co.kr)" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" Height="275" Width="605" x:Class="ImageView.Window1" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" ResizeMode="NoResize">  
  2.     <WINDOW.RESOURCES>  
  3.         <DOUBLEANIMATION x:Key="MoveAnimation" Storyboard.TargetName="Panels" Storyboard.TargetProperty="(Canvas.Left)" SpeedRatio="2" />  
  4.     </WINDOW.RESOURCES>  
  5.     <GRID>  
  6.         <CANVAS Height="250" Width="600" ClipToBounds="True">  
  7.             <STACKPANEL Height="250" x:Name="Panels" Orientation="Horizontal" Canvas.Left="0">  
  8.                 <IMG height=250 width=600 Source="1.jpg">  
  9.                 <IMG height=250 width=600 Source="2.jpg">  
  10.                 <IMG height=250 width=600 Source="3.jpg">  
  11.                 <IMG height=250 width=600 Source="4.jpg">  
  12.                 <IMG height=250 width=600 Source="5.jpg">  
  13.                 <IMG height=250 width=600 Source="6.jpg">  
  14.             </STACKPANEL>  
  15.         </CANVAS>  
  16.            
  17.         <STACKPANEL Height="30" VerticalAlignment="Bottom" HorizontalAlignment="Right" Margin="5" Orientation="Horizontal">  
  18.             <STACKPANEL.RESOURCES>  
  19.                 <STYLE TargetType="TextBlock">  
  20.                     <Setter Property="FontSize" Value="30"/>  
  21.                     <Setter Property="Width" Value="25"/>  
  22.                     <Setter Property="Foreground" Value="White"/>  
  23.                     <Setter Property="FontFamily" Value="Verdata"/>  
  24.                     <Setter Property="FontStyle" Value="Italic"/>  
  25.                     <Setter Property="FontWeight" Value="Bold"/>  
  26.                     <Setter Property="Cursor" Value="Hand"/>  
  27.                     <Setter Property="Opacity" Value="0.5"/>  
  28.                     <Style.Triggers>  
  29.                         <Trigger Property="IsMouseOver" Value="True">  
  30.                             <Setter Property="Opacity" Value="1"/>  
  31.                         </Trigger>  
  32.                     </Style.Triggers>  
  33.                 </STYLE>  
  34.             </STACKPANEL.RESOURCES>  
  35.             <TEXTBLOCK Text="1" MouseDown="Button_Click" />  
  36.             <TEXTBLOCK Text="2" MouseDown="Button_Click" />  
  37.             <TEXTBLOCK Text="3" MouseDown="Button_Click" />  
  38.             <TEXTBLOCK Text="4" MouseDown="Button_Click" />  
  39.             <TEXTBLOCK Text="5" MouseDown="Button_Click" />  
  40.             <TEXTBLOCK Text="6" MouseDown="Button_Click" />  
  41.         </STACKPANEL>  
  42.   
  43.     </GRID>  
  44. </WINDOW>  



다음은 C# 코드입니다.

  1. private void Button_Click(object sender, RoutedEventArgs e)   
  2. {   
  3.   
  4.     DoubleAnimation MoveAnimation = Resources["MoveAnimation"as DoubleAnimation;   
  5.     TextBlock SelectedTextBlock = sender as TextBlock;   
  6.     MoveAnimation.To = -(int.Parse(SelectedTextBlock.Text) - 1) * 600;   
  7.   
  8.     Panels.BeginAnimation(Canvas.LeftProperty, MoveAnimation,HandoffBehavior.Compose);   
  9. }  



크기가 일정한 내용의 메뉴 페이지를 StackPanel을 사용해 순차적으로 쌓아놓고 버튼을 클릭하면 버튼에 많는 만큼 StackPanel을 이동하는 방법을 이용해 구현 했습니다. 간단하죠? 기타 질문은 리플이나 메일로 주시면 답변해드리겠습니다 ^^


ADC 강좌

요즘에는 시험공부 모드로 과제가 살짝 중단이 되어있어서
하드웨어에 입문하게 되면
가장 기초 중에 기초이면서도 난관인 ADC(Analog to Digital Converter)를 소개해봅니다.


우선 이론적인 내용을 긁어왔습니다. (만들기도 뭣한데 긁을만한 자료가 없어서 ,, 좀 오래된 느낌의 페이지를 갖고 왔습니다.)

세상은 모두 아날로그로 되어 있고, 이걸 디지털화시키면서, 디지털이라는 것이 생긴 겁니다 .따라서 모든! 기계나 제어장치에는
아날로그 디지털 컨버터가 들어갑니다.
하지만 요 개념이 처음에는 잘 와닫지 않습니다.
사실 직접 알려드리는 것이 훨 나을 듯 하지만,,,,
우선 블로그부터,,^^;

내용의 질이 좋지 못하군요^^
직접 만들기엔 양이 방대해서,,, 우선 좀 여기저기 있는 것 좀 정리했습니다.^^

다음 기회에 좀 더 보강해 보도록 하죠!!!
저는 DSP(Digital Signal Processing)시험이 있어서...ㅎㅎㅎ 요것도 아날로그를 디지털화 시킨다음 연산을 하는 이론입니다.^^



아날로그신호를 디지탈신호로 변환하는 여러 가지 방법이 있으나 그 주가 되는 3가지 방법에 관해서 회로구성, 동작원리, 특징 등을 설명한다. AD변환에는 입력 아날로그신호에 포함된 최고주파수의 2배 이상으로 샘플링하여야만 원신호를 재현할 수 있다는 사실이 알려져 있다(Nyquist 정리). 따라서 고주파신호일수록 고속 ADC를 요구한다. 또 ADC의 출력 2진수의 비트수가 많을수록 ADC의 분해능(resolution)이 높다고 말하며 입력 아날로그신호의 레벨이 더 세분화되어 디지탈신호로 표현된다.

병렬비교 ADC


이것은 병렬 비교형 ADC로써 flash형이라고도 불리우며 가장 속도가 빠른 ADC이다. 그림 17-1은 그 구조를 나타내며 아날로그 입력 전압

V_1

 
이 병렬 비교기들에 의해서 그 레벨이 비교되어 3비트의 2진수로 동시에 부호화되어 나온다. 이 형태에서 n비트 출력을 위해서는

2^n

 
개의 동일저항과

2^n -1

 
개의 비교기가 필요하다(예컨대 8비트 ADC에서는 256개의 R과 255개의 비교기가 필요하다).

V_1

 
의 레벨에 따라 그보다 더 높은 "+"단자 전압이 걸리는 하위 비교기들은 출력이 모두 HIGH가 되고, 나머지 상위 비교기들의 출력은 모두 LOW가 된다. 예컨대

(3/8)V_R < V_1 < (4/8)V_R

 
일때 W1∼W3는 모두 HIGH, W4∼W7은 모두 LOW가 된다. 이 상태에서 ADC 출력은

Y_2 Y_1 Y_0 = 011(=3)

 
이 된다. 그림 17-2는 엔코더의 입·출력간의 관계를 나타낸다. 변환 도중에 아날로그 입력전압이 변하면 안되므로 Sample/Holder회로를 ADC 앞에 연결한다.

변환속도는 비교기 및 엔코더의 지연의 합에 의해서 결정되며, 현재 20ns이하의 ADC도 사용되고 있다. 4∼8비트(16∼256레벨)가 상용화되고 있으며 비트 수가 이 이상되면 구조가 너무 커진다. 1초에 변환할 수 있는 수를 변환율(conversion rate)이라 하고 변환속도의 역수와 같다.

이중적분형(dual slope) ADC


이것은 비교적 서서히 변하는 아날로그 신호를 정밀하게 디지탈신호로 변환하는 데 적합한 것으로써 그림 17-3에 표시한 바와 같이 적분기, 비교기, 카운터로 구성된다. 원리적으로 아날로그 전압에 비례하는 시간동안 클럭펄스를 카운트하여 그 카운트 수를 디지탈신호로 출력한다. 아날로그 입력전압에 비례하는 시간을 얻는 데 적분기를 쓴다. 그림에서 기준전압

V_R < 0

 
, 아날로그 입력전압

V_i > 0

 
이라고 가정하자. 처음에는 스위치 S2가 닫혀있다가(적분기의 출력전압

V_o = o

 
) t=0에서 S1이 1로 스위칭됨과 동시에 S2가 열린다. 그러면

V_o

 
는 직선적으로 감소하며

T_1

 
후에는

V_o = -(V_i / RC) T_1 ~ propto ~ V_i

 
,

t =T_1

 
에서 S1을 2로 옮기면

V_o

 

V_R / RC

 
의 증가율로 상승한다.

V_o = 0

 
이 될 때까지의 시간을

T_2

 
라 하면 다음과 같이 계산될 수 있다.

 

V_i over RC T_1 = V_R over RC T_2 , ~~~T_2 = T_1 over V_R V_i ~propto ~V_i

 

이 회로는 RC에 무관하므로 R, C의 값이 정밀할 필요가 없다.

T_2

 
동안만 카운터로 클럭펄스를 센다면 그 수는

V_i~

 
에 비례하고 결국 아날로그 입력에 비례하는 디지탈 신호를 얻을 수 있다.

이 ADC는 아날로그 입력전압과 기준전압을 2회 적분하기 때문에 이중적분형이라고 부른다. 동작원리로부터 이 회로는 고속 AD변환에는 부적당함을 알 수 있다. 그러나 회로가 간단하고, 잡음에 강하므로(잡음을 적분하면 0이 된다 ; 또 1/60초 마다 한번씩 적분하면 60Hz의 방해도 제거된다) 저속 고정밀도 ADC에 흔히 쓰인다. 예컨대 6자리(999999 = 106-1 221 ; 21비트) 디지탈 전압계등은 이런 ADC를 이용한다.

DA 피드백 형 ADC

이것은 ADC의 츨력 디지탈 부호를 다시 DA로 변환하여 입력신호와 비교한다. 다음 3가지가 있다.

(1) 계단형 ADC(staircase ADC)


그림 17-4(a)에서 S/H된 아날로그신호

V_i~

 
가 비교기의 "+"단자에 입력된다. t=0에서 2진 UP 카운터는 0으로 세트된다. 따라서 비교기의 "-"단자에 입력되는 DAC의 출력전압은 0이다. 그림 17-4(a)에서

V_i > V_A

 
이면 카운터는 클럭에 따라 1씩 카운트 UP한다. 그러므로

V_A

 
는 그림 17-4(b)에 표시한 바와 같이 계단적으로 증가한다.

V_A

 

V_i~

 
를 넘으면 비교기 출력의 부호가 바뀌어지고 카운터를 정지시킨다. 이때의 결과가 디지탈출력이 된다. 제어회로가 카운터를 0으로 다시 리셋시키고 위의 과정을 반복하여 새로운 입력신호의 레벨을 변환한다. 이 방법은 구조가 간단하지만 출력을 얻는 데 시간이 걸린다(최악의 경우

2^n -1

 
개의 클럭이 필요하다 ; n은 ADC의 비트 수).

(2) 추적형 ADC(tracking ADC)


그림 17-5(a)는 그림 17-4(a)의 UP카운터를 UP/DOWN 카운터로 대치한 것으로써 이 그림에서 알 수 있듯이 작은 변화를 추적해가는 데 유용하다. 먼저와 같이 t=0에서 카운터는 0으로 세트된다. 따라서 DAC 출력전압

V_A

 
는 "0"이다.

V_i > V_A

 
일 때 먼저와 마찬가지로 카운터는 클럭에 따라 1씩 카운트 UP한다. <그림 17-5(b) 참고>.

V_A

 

V_i~

 
를 넘으면 비교기 출력의 부호가 바뀌어지고 이번에는 카운터가 1씩 카운트 DOWN 한다. 결과적으로 얻어지는 디지탈출력은 정확한 값에서 ±1LSB만큼 오차를 가진다. 그림에 표시한 대로

V_i1

 
에 대해서는 디지탈출력=1000,

V_i2

 
에 대해서는 1011,

V_i3

 
에 대해서는 1001이다. 이와 같이 입력 신호의 작은 변화를 계속 추적해 간다.

(3) 축차근사 ADC(successive approximation ADC)


이것은 카운터 대신 더 복잡한 디지탈회로를 포함한다. 처음에 모든 비트를 0으로 세트한다. MSB부터 시작하여 각 비트를 차례로 1로 세트한다. DAC의 출력은 비교기에서 입력신호

V_i~

 
와 비교된다. 만일

V_A

 

V_i~

 
를 넘지 않으면 대응하는 비트는 1로 그대로 두고 넘으면 대응하는 비트를 다시 0으로 세트한다. n비트 ADC에서는 이와 같은 스탭을 n번 거쳐서 완전한 출력 비트가 얻어진다. 좀더 구체적으로 그림 17-6을 통해 알아보자, 처음에 비교기는 입력

V_i~

 
를 DAC출력

V_R /2

 
과 비교한다.

V_i > (V_R /2)

 
이면 비교기 출력 +, MSB는 그대로 1로 두고

V_i < (V_R /2)

 
이면 비교기 출력은 0, MSB는 0으로 다시 세트한다. 이상에서 MSB가 1인가 0인가에 따라

(V_R /2) + (V_R /4)

 
또는

0 + V_R / 4

 
이 된다. 이제는 이것이

V_i~

 
와 비교되며, 그 대소에 따라서 (MSB-1)비트가 1또는 0으로 결정된다. 이와같은 과정을 n번 반복한다. 그림 17-6은

V_o

 

V_i~

 
에 점차적으로 접근해 가는 모양을 나타낸다. 여기서 T는 테스트 기간이고 P는 테스트되어 결정된 비트를 출력으로 내보내는 기간이다.

이 형의 ADC는 구조가 간단하고 비교적 정확하고 빠르기 때문에 많이 사용된다. 현재 8∼19비트의 AD변환 시간이 10μs되는 것들이 있다.

 

잘 이해가 되지 않으시리라 봅니다...ㅎㅎㅎㅎ
대충 이런 원리로 제작이 된다고 생각하시면 될 겁니다.

첨부파일로는 0809 ADC 컨버터 칩의 데이터 시트를 올려놓았습니다.

코딩은 이렇게 하는 겁니다...
--------------------------------------------------

ADC

  1. ADC0808
  2. ADC로는 축차비교형인 ADC0808/0809를 사용하여 본다.
                             --@-- +5V
                               |
                     ------------------
                    |         11       |
                    |         Vcc      |  MSB
          AI0 -->>--| 26            21 |-->>-- D7
          AI1 -->>--| 27            20 |-->>-- D6
          AI2 -->>--| 28            19 |-->>-- D5
          AI3 -->>--|  1            18 |-->>-- D4
          AI4 -->>--|  2             8 |-->>-- D3
          AI5 -->>--|  3            15 |-->>-- D2
          AI6 -->>--|  4            14 |-->>-- D1
          AI7 -->>--|  5            17 |-->>-- D0
                    |                  |
       Adr A0 -->>--| 25             6 |--<<-- Start
       Adr A1 -->>--| 24             9 |--<<-- Output Enable
       Adr A2 -->>--| 23             7 |-->>-- End of Conversion
                    |                  |
          Adr -->>--| 22            10 |--<<-- Clock
         Enable     |               12 |--<<-- Ref+
                    |     GND       16 |--<<-- Ref-
                    |      13          |
                     ------------------
                           |
                           @
     

  3. 사용 방법
    1. Clock은 외부에서 TTL 신호(최대 8 kHz)를 연결한다. Ref+ = 5 V. Ref- = 0을 연결한다.
    2. Adr Enable, Output Enable, Start를 0으로 한다.
    3. Adr A0, A1, A2는 8 개의 입력 channel을 선택하기 위한 것이다. 선택한 AIx에 analog 신호 (0 ~ 5 V)를 연결한다.
    4. Adr Enable울 1로 하고, Start를 1 로 하였다가 0으로 바꾼다.
    5. EoC가 1이 되면 Output Enable을 1로 한다.

    ADC0808를 가동시키기 위하여는 Adr A0, Adr A1, Adr A2, Adr Enable, Start 및 Output Enable의 5 출력이 필요하다. parallel port의 DATA (8 outputs)를 이용하면 된다.

    입력은 data 8 bits와 EoC으로 9 개가 필요하다. 따라서 STATUS 4~7을 data nibble로, CONTROL 3을 nibble select(출력)로 하고 STATUS 3을 EoC으로 연결하면 된다.

              Adr A0 |----<---------------------- D0
              Adr A1 |----<---------------------- D1
              Adr A2 |----<---------------------- D2
          Adr Enable |----<---------------------- D4
               Start |----<---------------------- D5
       Output Enable |----<---------------------- D6
                     |
                 EoC |------------------------>-- S3 (15)
                     |
                     |      ---------------
           LSB    D0 |-----| I1d         S |--<-- /C3 (17)
                  D1 |-----| I1c           |
                  D2 |-----| I1b           |
                  D3 |-----| I1a        Qd |-->-- S4 (13)
                  D4 |-----| I0d        Qc |-->-- S5 (12)
                  D5 |-----| I0c        Qb |-->-- S6 (10)
                  D6 |-----| I0b        Qa |-->-- /S7 (11)
           MSB    D7 |-----| I0a           |
          -----------       ---------------
             ADC0808           74LS157            Parallel port
    

  4. program 예제
  5.    PDATA% = &H378: REM &H278 or &H3BC
       PSTATUS% = PDATA% + 1
       PCONTROL% = PDATA% + 2
       AdrEn% = &H10
       Start% = &H20
       OutEn% = &H40
    
       ADCCh% = 0          : 'ADC channel selection
       DBYTE% = 0 + ADCCh%
       OUT(PDATA%, DByte%) : 'Adr Enable, Output Enable, Start를 0으로 한다.
       DBYTE% = AdrEn% + Start% + ADCCh%
       OUT(PDATA%, DByte%) : 'Adr Enable, Start를 1 로 한다.
       DBYTE% = AdrEn% + Start% + ADCCh%
       OUT(PDATA%, DByte%) : 'Start를 0으로 한다.
       EoC% = 0
       WHILE (EoC% = 0)    : 'EoC = 1이 되기를 기다린다. 
         DBYTE% = INP(PSTATUS%)
         DBYTE% = DBYTE% AND &H08
         EoC% = DBYTE% \ 8
       WEND
       DBYTE% = AdrEn% + OutEn% + ADCCh%
       OUT(PDATA%, DBYTE%)   : 'EoC가 1이 되면 Output Enable을 1로 한다.
       OUT (PCONTROL%, &H08) : 'data의 low nibble 선택
       LD% = INP (PSTATUS%)  : 'low nibble을 읽는다.
       LD% = (LD% XOR &H80) \ 16
       OUT (PCONTROL%, &H00) : 'data의 high nibble 선택
       MD% = INP (PSTATUS%)  : 'high nibble을 읽는다.
       MD% = (MD% XOR &H80) \ 16
       DD% = MD% * 16 + LD% : 'byte로 바꾼다.
    

 

 


Verilog HDL 3. 데이터형(1)
 이번부터는 실제로 QUARTUS II를 이용해서 로직을 설계하고 시뮬레이션을 해보려고 도서관에서 책을 대여 하였습니다.
 "Verilog HDL의 기초와 디지털 논리회로설계"와 "디지털 논리회로와 집적회로설계" 같은 저자분께서 책을 쓰셨네요.
 살펴보니 두 책이 비슷한데 QUARTUS를 이용하는 방법과 로직설계의 방법의 설명이 잘 되어 있습니다.
 일단 Verilog HDL을 컴파일하고 시뮬레이션 하려면 QUARTUS 라는 프로그램이 필요한데 www.altera.com 에 가서 Quartus II Web Edition을 온라인으로 다운 받아서 사용하시면 됩니다.
다운로드 방법은 다음에 올리도록 하지요.( 얼마전까지 라이센스를 받아서 설치 한걸로 기억하는데 지금은 Quartus® II Web Edition Software v8.1를 다운 받을 수 있고 라이센스가 필요없다고 하네요ㅋ다운받고 있습니다. 받아서 설치해봐야 겠어요. )
 암튼 책을 보고 있는데 문법은 살펴 보았고 데이터형을 공부해 보면서 정리 할 필요가 있더군요.
 
Verilog HDL 데이터형
1) 논리값 집합
 Verilog HDL은 하드웨어 기능을 모델로 한 4개의 논리값과 8개의 신호 강도를 지원한다.

논리값 레벨

하드웨어 회로에서의 상태

0

논리적 0, 거짓 상태

1

논리적 1, 참 상태

x

알 수 없는 논리값

z

하이 임피던스, 플로팅 상태


 논리적인 값과 더불어 신호 강도를 갖는 신호들의 충돌을 해결하는데 종종 쓰인다.

신호 강도

정도

supply

흐름(driving)

가장 강도가 높음

strong

흐름(driving)

pull

흐름(driving)

large

저장(storage)

weak

흐름(driving)

medium

저장(storage)

small

저장(storage)

highz

하이임피던스

가장 강도가 낮음


 만약 다른 강도의 두 신호가 동일한 wire에 흐르면 더 강한 강도의 신호가 우세하다. 같은 강도가 만나면 어떠한 신호가 나올지 모른다.(x 이다.) trireg 넷만이 large,medium, small의 강도를 저장할 수 있다.

 2) 넷(Nets)
 넷은 하드웨어 요소 사이에 연결을 나타낸다. wire와 net은 종종 서로 같은 뜻으로 사용된다. net의 기본값은 z이다. (trireg net은 기본값이 x이다.)

사용자 삽입 이미지
net Y가 and GATE G1 출력으로 연결 되어 있다.
net은 키워드가 아니라 wire, wand, wor, tri, triand, trior, trireg 등의 집합을 나타낸다. 대부분 wire로 선언

wire Y;
wire A, B;
wire C=1'b0 // C는 논리값 0으로 선언

 - 넷의 데이터형
wire : 논리적인 행동이나 기능 없이 단지 연결하는데 사용한다.(디폴트)
tri :wire 와 같으며 하이임피던스 상태가 더 있다.
supply1 : 넷을 전원에 연결한다.
supply0 : 넷을 그라운드에 연결한다.
tri1 : 넷을 풀업(pull up) 시킨다.
tri() : 넷을 풀다운(pull down) 시킨다.
wor : 여러 디바이스 출력을 선으로 연결(wired)하여 "or"기능을 하는 넷
trior : wired-or와 같으나, 하이임피던스 상태가 더 있다.
wand : 여러 디바이스 출력을 선으로 연결(wired)하여 "and"기능을 하는 넷
triand : wired-and와 같은나 하이임피던스 상태가 더 있다.
trireg : 하이 임피던스 상태가 있는 저장형인 넷(신호강도)

 3) 레지스터
 레지스터는 데이터를 저장할 수 있다. 하드웨어에서 레지스터와 다르다. 즉 Verilog에서 레지스터는 단지 값을 저장할 수 있는 변수를 의미한다. 하드웨어에서 레지스터는 클럭이 필요하지만 Verilog에서는 그렇지 않다.
 레지스터 데이터형은 키워드 reg에 의해 정의 된다. 기본 논리값은 x 이다.

reg RESET;
initial // 초기화 선언
begin
RESET = 1'b1; // RESET를 1로 초기화
#100 RESET = 1'b0; // 100 단위 시간이 지난 뒤 RESET값을 바꾼다.
end

 책을 보면서 정리를 하는데 내용이 많네요.스크롤의 압박?
 논리값을 어떻게 나타내는지, net의 의미와 사용법, wire로 사용 한다는 것을 알았고 레지스터는 데이터를 저장하는 변수 역할을 하고 reg로 사용 한다는 것을 알게 되었습니다.
 다음에는 못다한 내용을 이어 가도록 하지요~~

공지사항입니다.

 안녕하세요.
 시그가 막바지에 접어들고 있습니다 ^^*
 크리스마스를 기점으로 시그가 종시그 가 되는데요.. 그동안 포스팅을 열심히 해주셨던 분들 감사드립니다 ~

 네가지만 알려드릴께요.

 1. 이번주,다음주는 블로깅 포스팅에대한 벌금이 없습니다. 


    그렇다고 모든분들이 포스팅을 안하셔두 된다는 말은 아닙니다.

    시그 종강이 다가온 만큼, 
    활동량이 적으신 회원들은 크리스마스 25일이 되는 그날까지 블로깅을 완료해주셨으면 합니다.

  뭔가 어렵게 설명한것 같지만 다음과 같습니다.
  우리 시그를 무사히 빠져나가시기 위해서는 6개 이상의 포스팅을 하셔야 합니다. 
  (총 10주짜리 시그였는데 그중 2주가 빠지고 2번정도는 애교로 봐서~~)
 
 즉. 현재 6개 이상의 포스팅을 하신 분들은
 이번주 다음주는 시험기간이고 하니 쉬셔두 되지만

  6개 이상의 포스팅이 되지 않으신 분은
 열심히 포스팅을 해서 6개를 채워주시기 바랍니다 ^^


  (25일까지 포스팅을 완료해주셔야 하는 분들 )
   박은병, 박상용, 박윤성, 정정아, 정성문, 이호성 입니다. 

   6개의 포스팅을 완료하지 못하시면 추가 벌금이 나갈지도..ㄷㄷㄷ.. 문의를 주세요^^*
 

 2. 
   
   벌금을 내는 방법. 
   1) 자신의 벌금이 얼마인지 확인을 한다.
   2) 계좌입금 혹은 김지혜에게 직접 벌금을 전달한다.
        (계좌입금을 하셨으면 바로 김지혜 010-2947-2346)으로 성함과 문자를 알려주세요.
   3) 혹 벌금이 이상하게 매겨져있다 싶으면 바로 막 김지혜에게 따진다.



 걷은 벌금은 회식때 요긴하게 사용되도록 하겠습니다. 

 계좌 : 국민은행 399101 04 013631 김지혜
 기한은 12월 26일까지
  ( 26일까지 안내시는 분은 추가벌금 또 받도록 하겠습니다. ^^* )
 

 3. 벌금 공지입니다.

 
 이슬희  0원 박진영   10000원 서상원   20000원  //
 차주민  30000원 최동혁   15000원 김대욱   5000원
 이호성  25000원 박상용  35000원 전한경  15000원
 조일용  0원 정성문  15000원 정정아  30000원
 박은병  25000원 박윤성   25000원 유광현  15000원
 김지혜  10000원        
 심형남  5000원  채은석   15000원  합계 :  295000원

 지각한것은 살짝 눈감아주는 센스를 발휘하였기 때문에-0-..
 자신이 생각했던것 보다 벌금의 양이 작게 느껴질 수도 있습니다. 
 그냥 작게 느껴진다 싶으시면 후딱내고 조용히 있으셔두 되고요
 만약 생각했던것 보다 많은데?? 싶으시면 저에게 말씀해주세요. 적당히 딜 해봅시다. ^^*
 
 계좌 : 국민은행 399101 04 013631 김지혜
 기한은 12월 26일까지
  ( 26일까지 안내시는 분은 추가벌금 또 받도록 하겠습니다. ^^* )


 4. 회식은 27일이나 28일 이 어떤가 합니다. ㅋ
    회식에 관한 공지는 자유게시판을 통하여 따로 하도록 하겠습니다. ^^



 감사합니다.
 마지막으로 

 계좌 : 국민은행 399101 04 013631 김지혜
 기한은 12월 26일까지
  ( 26일까지 안내시는 분은 추가벌금 또 받도록 하겠습니다. ^^* )

 계좌 : 국민은행 399101 04 013631 김지혜

 기한은 12월 26일까지
  ( 26일까지 안내시는 분은 추가벌금 또 받도록 하겠습니다. ^^* )

 계좌 : 국민은행 399101 04 013631 김지혜
 기한은 12월 26일까지
  ( 26일까지 안내시는 분은 추가벌금 또 받도록 하겠습니다. ^^* )

 계좌 : 국민은행 399101 04 013631 김지혜

 기한은 12월 26일까지
  ( 26일까지 안내시는 분은 추가벌금 또 받도록 하겠습니다. ^^* )

 계좌 : 국민은행 399101 04 013631 김지혜
 기한은 12월 26일까지
  ( 26일까지 안내시는 분은 추가벌금 또 받도록 하겠습니다. ^^* )

 계좌 : 국민은행 399101 04 013631 김지혜

 기한은 12월 26일까지
  ( 26일까지 안내시는 분은 추가벌금 또 받도록 하겠습니다. ^^* )

 계좌 : 국민은행 399101 04 013631 김지혜
 기한은 12월 26일까지
  ( 26일까지 안내시는 분은 추가벌금 또 받도록 하겠습니다. ^^* )

 계좌 : 국민은행 399101 04 013631 김지혜

 기한은 12월 26일까지
  ( 26일까지 안내시는 분은 추가벌금 또 받도록 하겠습니다. ^^* )

 계좌 : 국민은행 399101 04 013631 김지혜
 기한은 12월 26일까지
  ( 26일까지 안내시는 분은 추가벌금 또 받도록 하겠습니다. ^^* )

 계좌 : 국민은행 399101 04 013631 김지혜

 기한은 12월 26일까지
  ( 26일까지 안내시는 분은 추가벌금 또 받도록 하겠습니다. ^^* )

 계좌 : 국민은행 399101 04 013631 김지혜
 기한은 12월 26일까지
  ( 26일까지 안내시는 분은 추가벌금 또 받도록 하겠습니다. ^^* )

 계좌 : 국민은행 399101 04 013631 김지혜

 기한은 12월 26일까지
  ( 26일까지 안내시는 분은 추가벌금 또 받도록 하겠습니다. ^^* )

 계좌 : 국민은행 399101 04 013631 김지혜
 기한은 12월 26일까지
  ( 26일까지 안내시는 분은 추가벌금 또 받도록 하겠습니다. ^^* )

 계좌 : 국민은행 399101 04 013631 김지혜

 기한은 12월 26일까지
  ( 26일까지 안내시는 분은 추가벌금 또 받도록 하겠습니다. ^^* )

 계좌 : 국민은행 399101 04 013631 김지혜
 기한은 12월 26일까지
  ( 26일까지 안내시는 분은 추가벌금 또 받도록 하겠습니다. ^^* )

 계좌 : 국민은행 399101 04 013631 김지혜

 기한은 12월 26일까지
  ( 26일까지 안내시는 분은 추가벌금 또 받도록 하겠습니다. ^^* )

 계좌 : 국민은행 399101 04 013631 김지혜
 기한은 12월 26일까지
  ( 26일까지 안내시는 분은 추가벌금 또 받도록 하겠습니다. ^^* )

 계좌 : 국민은행 399101 04 013631 김지혜

 기한은 12월 26일까지
  ( 26일까지 안내시는 분은 추가벌금 또 받도록 하겠습니다. ^^* )

 계좌 : 국민은행 399101 04 013631 김지혜
 기한은 12월 26일까지
  ( 26일까지 안내시는 분은 추가벌금 또 받도록 하겠습니다. ^^* )

 계좌 : 국민은행 399101 04 013631 김지혜

 기한은 12월 26일까지
  ( 26일까지 안내시는 분은 추가벌금 또 받도록 하겠습니다. ^^* )

 계좌 : 국민은행 399101 04 013631 김지혜
 기한은 12월 26일까지
  ( 26일까지 안내시는 분은 추가벌금 또 받도록 하겠습니다. ^^* )

 계좌 : 국민은행 399101 04 013631 김지혜

 기한은 12월 26일까지
  ( 26일까지 안내시는 분은 추가벌금 또 받도록 하겠습니다. ^^* )

 계좌 : 국민은행 399101 04 013631 김지혜
 기한은 12월 26일까지
  ( 26일까지 안내시는 분은 추가벌금 또 받도록 하겠습니다. ^^* )

 계좌 : 국민은행 399101 04 013631 김지혜

 기한은 12월 26일까지
  ( 26일까지 안내시는 분은 추가벌금 또 받도록 하겠습니다. ^^* )


Flip Image Banner

안녕하세요. 이번시간에는 현재 옥션에서 사용중인 Image Banner를 구현해보도록 하겠습니다. 여러개의 배너(혹은 광고물)이 책장이 넘어가듯이 넘어가는 효과로 이벤트 광고나 베너용으로 활용하면 좋을것 같습니다. 아래는 시연 동영상 입니다.



XAML을 사용해서 기본적인 내용을 구성했으며 C#에서는 이벤트에 따른 Animation호출 부분을 구현했습니다. 먼저 아래는 XAML 소스코드입니다.

  1. <WINDOW title="Flip Image Banner - WPF KOREA(http://whatisthat.co.kr)" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" Background="Red" Height="275" Width="605" x:Class="FlipImage.Window1" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">  
  2.        
  3.     <WINDOW.RESOURCES>  
  4.                    
  5.         <STORYBOARD FillBehavior="Stop" x:Key="TopAnimation" Storyboard.TargetName="TargetTop">  
  6.             <DOUBLEANIMATION Storyboard.TargetName="TopSkew" From="0" Duration="0:0:0.1" To="-10" Storyboard.TargetProperty="(SkewTransform.AngleX)" />  
  7.             <DOUBLEANIMATION Storyboard.TargetName="TopScale" From="1" Duration="0:0:0.25" To="0" Storyboard.TargetProperty="(ScaleTransform.ScaleY)" />  
  8.         </STORYBOARD>  
  9.            
  10.         <STORYBOARD FillBehavior="Stop" x:Key="BottomAnimation" Storyboard.TargetName="TargetTop">  
  11.             <DOUBLEANIMATION Storyboard.TargetName="BottomSkew" From="10" Duration="0:0:0.25" To="0" Storyboard.TargetProperty="(SkewTransform.AngleX)" BeginTime="0:0:0.25" />  
  12.             <DOUBLEANIMATION Storyboard.TargetName="BottomScale" From="0" Duration="0:0:0.25" To="1" Storyboard.TargetProperty="(ScaleTransform.ScaleY)" BeginTime="0:0:0.25" />  
  13.             <DOUBLEANIMATION Storyboard.TargetName="BottomSkew" From="0" Duration="0:0:0.1" To="5" Storyboard.TargetProperty="(SkewTransform.AngleX)" BeginTime="0:0:0.5" AutoReverse="True" />  
  14.             <DOUBLEANIMATION Storyboard.TargetName="BottomScale" From="1" Duration="0:0:0.1" To="0.9" Storyboard.TargetProperty="(ScaleTransform.ScaleY)" BeginTime="0:0:0.5" AutoReverse="True" />  
  15.         </STORYBOARD>  
  16.            
  17.         <IMAGEBRUSH x:Key="TopBrush" Viewbox="0,0,1,0.5" />  
  18.         <IMAGEBRUSH x:Key="BottomBrush" Viewbox="0,0.5,1,0.5" />  
  19.   
  20.     </WINDOW.RESOURCES>  
  21.        
  22.     <GRID Background="Black" Height="250" Width="600">  
  23.            
  24.         <RECTANGLE Height="125" Fill="{StaticResource TopBrush}" VerticalAlignment="Top" x:Name="OriginalTop" />  
  25.            
  26.         <RECTANGLE Height="125" Fill="{StaticResource BottomBrush}" VerticalAlignment="Bottom" x:Name="OriginalBottom" />  
  27.            
  28.         <RECTANGLE Height="125" Fill="{StaticResource TopBrush}" VerticalAlignment="Top" x:Name="TargetTop" RenderTransformOrigin="0.5,1">  
  29.             <RECTANGLE.RENDERTRANSFORM>  
  30.                 <TRANSFORMGROUP>  
  31.                     <SKEWTRANSFORM x:Name="TopSkew" AngleX="0" />  
  32.                     <SCALETRANSFORM x:Name="TopScale" ScaleY="1" />  
  33.                 </TRANSFORMGROUP>  
  34.             </RECTANGLE.RENDERTRANSFORM>  
  35.         </RECTANGLE>  
  36.            
  37.         <RECTANGLE Height="125" Fill="{StaticResource BottomBrush}" VerticalAlignment="Bottom" x:Name="TargetBottom" RenderTransformOrigin="0,0">  
  38.             <RECTANGLE.RENDERTRANSFORM>  
  39.                 <TRANSFORMGROUP>  
  40.                     <SKEWTRANSFORM x:Name="BottomSkew" AngleX="0" />  
  41.                     <SCALETRANSFORM x:Name="BottomScale" ScaleY="1" />  
  42.                 </TRANSFORMGROUP>  
  43.             </RECTANGLE.RENDERTRANSFORM>  
  44.         </RECTANGLE>  
  45.         <STACKPANEL Height="30" VerticalAlignment="Bottom" HorizontalAlignment="Right" Margin="20" Orientation="Horizontal">  
  46.             <STACKPANEL.RESOURCES>  
  47.                 <STYLE TargetType="TextBlock">  
  48.                     <Setter Property="FontSize" Value="30"/>  
  49.                     <Setter Property="Width" Value="25"/>  
  50.                     <Setter Property="Foreground" Value="White"/>  
  51.                     <Setter Property="FontFamily" Value="Verdata"/>  
  52.                     <Setter Property="FontStyle" Value="Italic"/>  
  53.                     <Setter Property="FontWeight" Value="Bold"/>  
  54.                     <Setter Property="Cursor" Value="Hand"/>  
  55.                     <Setter Property="Opacity" Value="0.5"/>  
  56.                     <Style.Triggers>  
  57.                         <Trigger Property="IsMouseOver" Value="True">  
  58.                             <Setter Property="Opacity" Value="1"/>  
  59.                         </Trigger>  
  60.                     </Style.Triggers>  
  61.                 </STYLE>  
  62.             </STACKPANEL.RESOURCES>  
  63.             <TEXTBLOCK Text="1" MouseDown="Button_Click" />  
  64.             <TEXTBLOCK Text="2" MouseDown="Button_Click" />  
  65.             <TEXTBLOCK Text="3" MouseDown="Button_Click" />  
  66.             <TEXTBLOCK Text="4" MouseDown="Button_Click" />  
  67.             <TEXTBLOCK Text="5" MouseDown="Button_Click" />  
  68.             <TEXTBLOCK Text="6" MouseDown="Button_Click" />  
  69.         </STACKPANEL>  
  70.   
  71.   
  72.     </GRID>  
  73.        
  74. </WINDOW>  



다음은 C# 코드입니다.

  1. public partial class Window1 : Window   
  2. {   
  3.   
  4.     public Window1()   
  5.     {   
  6.         InitializeComponent();   
  7.   
  8.         OriginalTop.Fill = (Resources["TopBrush"as ImageBrush).Clone();   
  9.         OriginalBottom.Fill = (Resources["BottomBrush"as ImageBrush).Clone();   
  10.         TargetTop.Fill = (Resources["TopBrush"as ImageBrush).Clone();   
  11.         TargetBottom.Fill = (Resources["BottomBrush"as ImageBrush).Clone();   
  12.            
  13.         (Resources["BottomAnimation"as Storyboard).Completed += new EventHandler(BottomAnimation_Completed);   
  14.         (Resources["TopAnimation"as Storyboard).Completed += new EventHandler(TopAnimation_Completed);   
  15.   
  16.     }   
  17.   
  18.     private void Button_Click(object sender, RoutedEventArgs e)   
  19.     {   
  20.         TextBlock SelectedTextBlock = sender as TextBlock;   
  21.         ChangeTarget("pack://Application:,,,/" + SelectedTextBlock.Text + ".jpg");   
  22.     }   
  23.   
  24.     private void ChangeTarget(String Source)   
  25.     {   
  26.         ImageSource OrigianlSource = (TargetTop.Fill as ImageBrush).ImageSource as ImageSource;   
  27.         ImageSource TargetSource = new BitmapImage(new Uri(Source));   
  28.   
  29.         BottomScale.ScaleY = 0;   
  30.   
  31.         (OriginalTop.Fill as ImageBrush).ImageSource = TargetSource;   
  32.         (TargetTop.Fill as ImageBrush).ImageSource = OrigianlSource;   
  33.         (TargetBottom.Fill as ImageBrush).ImageSource = TargetSource;   
  34.   
  35.         (Resources["TopAnimation"as Storyboard).Begin(this);   
  36.         (Resources["BottomAnimation"as Storyboard).Begin(this);   
  37.     }   
  38.     void TopAnimation_Completed(object sender, EventArgs e)   
  39.     {   
  40.         (TargetTop.Fill as ImageBrush).ImageSource = (TargetBottom.Fill as ImageBrush).ImageSource as ImageSource;   
  41.     }   
  42.   
  43.     void BottomAnimation_Completed(object sender, EventArgs e)   
  44.     {   
  45.         (OriginalBottom.Fill as ImageBrush).ImageSource = (TargetBottom.Fill as ImageBrush).ImageSource as ImageSource;   
  46.     }   
  47. }  


Skew Transform과 ScaleTransform을 사용해서 간단하게 책장을 넘어가는 효과를 구현했습니다. 그리고 현재 페이지(위쪽,아래쪽) 다음페이지(위쪽 아래쪽)을 표현하기 위해서 4개의 객체로 분리해서 사용했으며 ChangeTarget 함수를 이용합니다. 시간관계상 설명은 여기까지로 하고, 기타 질문은 리플이나 메일로 보내주시기 바랍니다.



안녕하세요.^ ^
오늘은 저번시간에 배운 menu Widget을 이용하여 menu를 만들어보도록 하겠습니다.


/* menu.c */

#include <gtk/gtk.h>

static gint button_press (GtkWidget *, GdkEvent *);
static void menuitem_response (GtkWidget *, gchar *);

int main (int argc, char *argv[])
{

    GtkWidget *window;
    GtkWidget *menu;
    GtkWidget *menu_bar;
    GtkWidget *root_menu;
    GtkWidget *menu_items;
    GtkWidget *vbox;
    GtkWidget *button;
    char buf[128];
    int i;

    gtk_init (&argc, &argv);

    window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    gtk_widget_set_usize( GTK_WIDGET (window), 200, 100);
    gtk_window_set_title(GTK_WINDOW (window), "GTK Menu Test");
    gtk_signal_connect(GTK_OBJECT (window), "delete_event",
                       (GtkSignalFunc) gtk_main_quit, NULL);

    /* menu-widget을 시작합니다.  여기서 메뉴 widget들에 대해
     * gtk_show_widget()을 쓰면 안됩니다.
     * 이것은 메뉴 아이템을 가지고 있는 메뉴고, 우리가 어플에서 "Root Menu"를 클릭했을 때 팝업될 것입니다. */
    menu = gtk_menu_new();

    /* 다음으로 우리는 세 메뉴엔트리를 만들기 위해 작은 루프를 구현합니다. 
        보통이라면, 우리는 각 메뉴 아이템들에 대해"clicked" 시그널을 잡아낼 것이고, 그것을 위해 callback을 세팅할 것입니다. */

    for(i = 0; i < 3; i++)
        {
            /* buf로 메뉴 이름을 복사합니다. */
            sprintf(buf, "Test-undermenu - %d", i);

            /* 이름을 가진 새 메뉴 아이템을 만듭니다. */
            menu_items = gtk_menu_item_new_with_label(buf);

            /* 이것을 메뉴에 첨가합니다. */
            gtk_menu_append(GTK_MENU (menu), menu_items);

            /* 메뉴 아이템이 선택되면 뭔가 쓸만한 동작을 시킵니다. */
            gtk_signal_connect (GTK_OBJECT(menu_items), "activate",
                GTK_SIGNAL_FUNC(menuitem_response), (gpointer)
                g_strdup(buf));

            /* widget을 보입니다. */
            gtk_widget_show(menu_items);
        }

    /* 이것은 root 메뉴며, 메뉴바에 나타날 메뉴의 이름 즉 라벨이
     * 될 것입니다.  이것은 단지 눌러졌을 때 메뉴의 나머지 부분이
     * 팝업되기만 할 것이므로 특별히 시그널 핸들러가 결합되어
     * 있을 필요는 없습니다. */
    root_menu = gtk_menu_item_new_with_label("Root Menu");

    gtk_widget_show(root_menu);
    gtk_menu_item_set_submenu(GTK_MENU_ITEM (root_menu), menu);

      /* 메뉴와 버튼을 들여놓을 vbox */
      vbox = gtk_vbox_new(FALSE, 0);
      gtk_container_add(GTK_CONTAINER(window), vbox);
      gtk_widget_show(vbox);

      /* 메뉴를 담고 있을 menu-bar를 만들고 그것을 우리의 main 윈도에 추가합니다. */
      menu_bar = gtk_menu_bar_new();
      gtk_box_pack_start(GTK_BOX(vbox), menu_bar, FALSE, FALSE, 2);
      gtk_widget_show(menu_bar);

      /* 메뉴를 팝업시키도록 연결될 한 버튼을 만듭니다. */
      button = gtk_button_new_with_label("press me");
      gtk_signal_connect_object(GTK_OBJECT(button), "event",
          GTK_SIGNAL_FUNC (button_press), GTK_OBJECT(menu));
      gtk_box_pack_end(GTK_BOX(vbox), button, TRUE, TRUE, 2);
      gtk_widget_show(button);

      /* 끝으로 menu-item을 menu-bar에 이어줍니다. */
      gtk_menu_bar_append(GTK_MENU_BAR (menu_bar), root_menu);

      /* 언제나 전체 윈도를 마지막에 보여줍니다. */
      gtk_widget_show(window);

      gtk_main ();

    return 0;
}

/* "widget"으로 넘겨받은 메뉴를 보임으로써 button-press에 응답합니다.
인자 "widget"은 눌려진 버튼이 아니라 보여질 메뉴라는 걸 기억해야합니다. */

static gint button_press (GtkWidget *widget, GdkEvent *event)
{

      if (event->type == GDK_BUTTON_PRESS) {
          GdkEventButton *bevent = (GdkEventButton *) event;
          gtk_menu_popup (GTK_MENU(widget), NULL, NULL, NULL, NULL,
                          bevent->button, bevent->time);
                    return TRUE;
      }

         return FALSE;
}

/* 메뉴 아이템이 선택되었을 때 문자열을 프린트합니다. */

static void menuitem_response (GtkWidget *widget, gchar *string)
{
    printf("%s\n", string);
}


우리는 또한 메뉴 아이템을 반응을 보이지 않게도 만들 수 있고, 표를 참조 해서 메뉴 함수들에 키보드 바인딩을 해줄 수도 있습니다.

저번시간에 설명은 정말 많았던것 같습니다. 그에 비해 오늘의 예제는 정말 간단하죠?
다음시간에는 menu factory를 이용한 설명 및 예제에 대해 다루어 보려고 합니다.

 


 


안녕하세요 시그원 여러분..시험들은 잘보셨는지요 저는 이번 시험을 잘 못봐서 절망모드입니다..시험이 끝나도 마음이 편치않네요 거기다가 저희과만 학기 텀프로젝트를 발표하는데 제가 팀장이라서(교수님의 기대와...)18일까지는 학교에 매일가서 작업하고 후배들 가르쳐주고 ㅠ_ㅠ 너무 힘이 든답니다. 하지만 블로그를 올려야 한다는 사명감으로(사실 무서운 시그장님과 벌금 압박이 ㄷㄷㄷ) 이렇게 작성합니다. ㅋㅋ 지난번에는 명령어 싸이클까지 알아봤는데요 이번에는 메모리 참조 명령어를 알아보도록 하겠습니다.

위의 표는 레지스터 전송문을 이용하여 7개의 메모리 참조 명령어를 자세하게 기술해 놓은 것 입니다. 각 명령은 명령어 코드 디코더의 출력 D에 의해 구별되고, 피연산자에 대한 유효 주소는 T2(I=0일 때)나 T3(I=1일 때) 시간에 AR레지스터로 전송됩니다. 그리고 명령의 수행은 타이밍 신호 T4에서 시작되고요 이 경우에 메모리에 저장되어 있는 데이타는 직접 처리될 수 없기 때문에 여러 개의 마이크로 연산을 통해서 명령어가 수행이 됩니다. 암튼 각 명령어를 수행하는 데 필요한 제어 함수와 마이크로 연산에 대한 동작, 그리고 마지막에 흐름도를 이용하여 전체 명령어를 살표 보겠습니다.

AND 명령어
 이 명령어는 AC와 유효 주소로 지정된 메모리 워드의 각 비트쌍에 대하여 AND 논리 연산을 수행하고, 결과를 AC에 전송합니다. 이 명령어를 수행하기 위해 필요한 마이크로 연산은
 
D0T4 : DRM[AR]
D0T5 : AC←AC^DR, SC←0

AND명령어에 대한 제어 함수는 명령어 디코더의 출력 D0를 사용하는데, 시간 T4에서는 메모리의 피연산자를 DR레지스터에 전송하고 T5에서는 AC와 DR사이의 AND연산 결과를 AC에 저장하고, 동시에 SC를 클리어하여 새로운 명령어 사이클이 시작되도록 합니다.

ADD명령어 
 이 명령어는 유효 주소로 지정된 메모리 워드의 내용을 AC에 더한 다음, 그 합은 AC에 저장하고 출력 캐리(Cout)는 e플립플롭에 전송합니다. ADD명령어를 수행하기 위해 필요한 마이크로 연산은

D1T4 : DR←M[AR]
D1T5 : AC←AC+DR, E←Cout, SC←0

여기서는 명령어 디코더의 출력 D1과 함께 T4와 T5타이밍 신호를 사용합니다. 위와 같이 어떤 명령어가 메모리에서 FFETCH되고 디코딩된 다음에는 오직 하나의 디코드 추력만 활성화 되고 이것이 해당 명령어를 수행하는 데 필요한 마이크로 연산 순서를 결정합니다.

LDA명령어
 이 명령어는 유효 주소로 지정된 메모리 워드의 내용을  AC에 전송하고 베스에서 AC로의 직접 연결 경로가 없으므로 메모리 내용을 우선 DR로 읽어옵니다. 이후 가산/논리 회로를 거쳐 AC로 전송이 됩니다.

D2T4 : DR←M[AR]
D2T5 : AC←DR, SC←0

STA명령어
 이 명령어는 AC내용을 유효 주소로 지정된 메모리 워드로 전송하고 AC출력은 버스를 통해 메모리 입력과 연결되어 있습니다.

D3T4 : M[AR]←AC, SC←0

BUN명령어
 이 명령어는 프로그램의 수행을 유효 주소로 지정된 명령어로 옮기는 일을 합니다. 즉 순차적으로 증가하는 PC의 값을 다음 실행될 명령어의 주소로 무조건 JUMP를 시키는 거죠 AR의 유효 주소를 PC에 전송하고 SC를 0으로 클리어 하여 새로 지정된 다음 명령어를 FETCH 시킵니다.

D4T4 : PC←AR, SC←0

BSA명령어
 이 명령어는 Subroutine라고 하는 프로그램의 일부분으로 분기하는데 유용하게 사용이 됩니다. 현 PC에 저장된 다음 명령어의 주소가 유효 주소로 지정된 메모리에 저장을 합니다. 뭐 일반적으로는 스텍이나 프로세스 레지스터에 저장이 되지요 암튼 유효 주소보다 1 큰 값이 PC로 전송되어 서브루틴의 첫 명령어를 가리킵니다.

D5T4 : M[AR]←PC, AR←AR+1
D5T5 : PC←AR, SC←0

밑의 그림은 BSA명령어의 실행 예 입니다.

ISZ명령어
 이 명령어는 유효 주소로 지정된 워드 값을 하나 증가 시켜서 증가된 값이 0이면 PC도 하나 증가시켜 다음 명령어를 수행하고 메모리 워드를 직접 증가 할 수 없으므로 값을 DR로 읽어 온 후 증가 시킨 다음 다시 메모리에 저장을 합니다. 지금 우리가 알아보고 있는 명령어중에 가장 깁니다. (7개의 타이밍신호 : T0~T6 3비트 순차 카운터)

D6T4 : DR←M[AR]
D6T5 : DR←DR+1
D6T6 : M[AR]←DR, IF (DR=0) THEN (PC←PC+1), SC←0

제어 흐름도
 밑의 그림은 흐름도로 7가지 메모리 참조 명령어를 수행하는 데 필요한 모든 마이크로 연산을 보여주고 있습니다. 각 네모상자 위에 제어 함수가 표시되어 있고 T4, T5, T6에서 수행되는 마이크로 연산들은 각 명령어의 연산 코드에 따라 6가지 다른 경로를 형성합니다. 각 경로의 마지막 타이밍 신호에서는 순차 카운터가 0으로 클리어되어 다음 명령어 사이클을 위한 타이밍 신호 T0로 제어가 이동이 됩닏. 그리고 가장 긴 명령어(ISZ)를 수행하는 데에도 7개의 타이밍 신호로 충분하므로, 이 컴퓨터는 3비트 순차 카운터로 설계될 수 있습니다.

그럼 다음 블로그에는 입출려과 인터럽트에 대해서 알아보겠습니다.




1. if
 
- if-else statement 에서 else, else if 부분은 독립적인 줄에 기술한다. 

- 정상적인 경우를 먼저 처리한다.

- 판단문은 단순화 한다

- if-else statement 와 function macro 가 함께 사용될 경우 

# if-else 안이 한문장이더라도 brace를 해준다.

if (x == 3)
{
m_SP3();
}
else
{
m_BORK();
}

# macro 내에서 brace를 한다.

#define m_STMT(stuff)    { do {stuff} while(0) }
#define m_SP3()             m_STMT ( if (b) {int x; ab = f(&x); bv += x; } )

if (x == 3)
m_SP3();
else
m_BORK();

 
2. switch

- case는 switch와 같은 indent 를 가지며, 독립적인 줄에 기술한다.

- default를 제외한 모든 case에는 break statement를 사용한다. 

   만약, 이를 의도적으로 사용하지 않을 경우 comment 를 붙여준다.

- default 문은 에러를 찾는 목적으로 사용한다.


switch (expr)
{
case ABC:
case DEF:
statement
break;
case UVW:
statement
/* FALL THROUGH */
case XYZ:
statement
break;
}


3. for /
while

- null body를 가지는 경우 null statement 를 독립된 줄에 기술하고 comment 를 작성한다.

- do-while 문의 경우 항상 {}를 사용한다.

while (*dest++ = src++)
; /* NULL */



안녕하세요. 17-2기 조일룡입니다.

기말고사 시험기간인데 다들 공부 잘 하고 계신지 모르겠네요.
저는 이번 기말고사 션하게 말아먹을 것 같습니다. ㅠ

기말고사 시즌인 관계로 이번 블로그는 머리를 식힐겸 퍼즐을 하나 준비했습니다.

이건 18-2기 여러분들 들어오셨을 때 집중세미나 시간에 했던거 재탕인데요.. 뭐 뒷북이지만 괜찮겠지여 ㅋㅋ


지뢰찾기 퍼즐

지뢰찾기는 다 해보셨으리라 생각되므로 자세한 설명은 생략하겠습니다.


위의 지뢰판에서 숫자는 자기과 양옆의 칸에 있는 지뢰의 수를 알려줍니다. 한 칸에는 최대 하나의 지뢰만이 있을 수 있습니다.

그렇다면 위의 그림에는 몇 개의 지뢰가 있을까요?


지뢰찾기 고수분들은 그림 대충 보고 지뢰가 어디에 있는지 금방 찾으실거라 생각되는데여 사실 지뢰찾기 한 번도 해보지 않은 사람이라도 이 문제의 해법은 상당이 간단합니다.

답부터 말하자면 지뢰의 수는 2 + 1 + 1 + 2 = 6 입니다.



위 그림을 보면 어째서 2 + 1 + 1+ 2 가 답인지 눈치를 채실 수 있으리라 생각합니다.

붉은 색으로 표시된 칸에 적힌 숫자는 그 칸을 포함하여 양옆까지 총 3개의 칸에 존재하는 지뢰의 수를 알려줍니다. 즉 연속한 3칸을 한 단위로 보면 그 중 가운데 칸이 그 한 단위에 있는 지리의 수를 알려주는겁니다. 그렇다면 우리는 단순히 지뢰밭을 3개를 한단위로 나누어 그 각 단위별로 지뢰수를 모두 더하면 전채 지뢰밭에 있는 지뢰 수를 알게 되는 거지요.

그런데 여기에는 문제가 있습니다. 바로 이 방법은 3의 배수일때만 가능하다는 겁니다. 아래의 경우를 봅시다.


위와 같이 3개를 한단위로 쪼개보겠습니다.


그림을 보면 처음 9개의 칸에는 모두 5개의 지뢰가 있는 것을 알 수 있지만 마지막 칸에 지뢰가 있는지 없는지 확신을 가질수가 없습니다. 결국 지뢰찾기를 다 해봐야 전체 지뢰의 갯수를 알 수가 있게 됩니다. 하지만 여기에 간단한 해결책이 있습니다.


어떤가요? 전체 지뢰 갯수가 1 + 1 + 2 + 1 = 5 라는 것을 한 눈에 알 수 있습니다.


이제 우리는 아래 지뢰판에 지뢰가 몇 개인지도 쉽게 알 수 있습니다.


10 * 10 크기의 지뢰판인데여.. 지뢰가 어디있는지 찾으려면 힘들지만 지뢰가 몇개인지 아는 것은 이제 문제가 안됩니다.

가로세로 모두 크기가 10 (3n+1의 형태) 이므로 양쪽끝 단위의 길이는 2, 가운데는 3이 되도록 나눈뒤 가운데 칸의 수만 다 더하면 됩니다.


총 지뢰수는 1 + 2 + 1 + 2 + 2 + 2 + 1 + 2 + 1 + 3 + 2 + 2 + 2 + 1 + 2 + 4 = 30 이네요..

아래의 지뢰 지도를 보면 지뢰가 30개 맞다는 것을 알 수 있습니다.
(처음 지뢰판을 보고 정답표를 맞추기는 쉽지 않을것 같습니다;;)



오늘 포스팅은 여기서 마치겠습니다.

당장 보기에 어려워 보이는 문제라도 살짝 다른 시각에서 보면 간단한 해법이 존재할 수 있다는 것을 생각하시기 바랍니다.


안녕하세요. ^_^ 다들 너무 오랜만이죠? ㅎㅎ
너무 오랫동안 포스팅을 안해서 벌금이.. 후덜덜덜
그래서 오늘은 멤버십 컴퓨터에 MSSQL 2008을 설치해서 DB 생성과 삭제에 관한 것들에 짧게나마 알아보고자 합니다.

우선 MSSQL 2008의 Microsoft SQL Server Management Studio를 켭니다.
서버에 접속을 하시구요.


접속을 해서 보시면 왼쪽편에 데이터베이스, 보안, 서버계열.. 등등등 여러가지가 보이실텐데요.
이제 데이터베이스를 생성해보도록 하겠습니다.


데이터베이스가 생성이 되었습니다.
생성된 데이터베이스에 데이터들을 입력하기 전에 CREATE문에 대해 잠시 살펴보도록 하겠습니다.

 


 



이렇게 3가지 예제를 보셨는데요.
DB를 생성하는 것은 그다지 어렵지 않죠??
그러면 이번에는 데이터베이스 사이즈 늘리기를 중심으로 관리하는 방법을 살펴보겠습니다.

  1. 데이터베이스 관리란?
    • 데이터 증가에 따른 파일 사이즈 변경
    • 트랜잭션 로그 모니터링
    • 필요에 따른 데이터베이스 사이즈 줄이기
    • 데이터베이스 삭제
    대부분의 작업들은 SQL Server가 자동으로 해주기 때문에 별다른 관여가 필요없지만 수작업이 필요한 경우가 있습니다.

  2. 데이터베이스 사이즈 늘리기
    데이터베이스 사이즈를 늘리는 방법은 다음의 세가지가 있습니다.
    • 자동으로 증가하도록 데이터베이스 옵션 설정
    • 데이터 파일의 사이즈 확장
    • 데이터 파일 추가

    1) 데이터베이스 지동 증가 옵션 설정
    CREATE DATABSE문 사용시 사이즈 증가에 대한 SIZE, MAXSIZE FILEGROWTH옵션을 사용하면 됩니다.

    데이터베이스를 만들 때 이 옵션들을 이용해서 필요한 경우 사이즈가 자동으로 증가하게 해 주는 것이 좋습니다. 또한 중요한 것은 데이터베이스가 꽉 차는 사태가 없어야하는 것입니다. 아무리 사이즈 자동 증가가 되게 했다 하더라도 하드디스크가 여유공간이 없어지면 데이터베이스 사이즈 증가가 더이상 불가능하게 됩니다.

    2) 데이터 파일의 사이즈 확장
    ALTER DATABASE MyDB
    MODIFY FILE (NAME = MyDB_Data, SIZE = 30MB)
    GO

     MODIFY FILE을 이용하여 MyDB_Data 파이르이 사이즈를 30MB로 바꾸었습니다.

    3) 데이터 파일 추가

    ALTER DATABASE MyDB
    ADD FILE (NAME = MyDB_Data2,
    FILENAME = 'D:\Data\MyDB2.ndf',
    SIZE = 10MB,
    MAXSIZE = 50MB,
    FILEGROWTH = 5MB)

    GO



    ADD FILE을 사용하여 사이트가 10MB인 파일을 추가함으로써 데이터베이스 사이즈를 늘렸습니다.