2013-12-10 1 views
1

내가우리가 사용할 수있는 "경우"로-선택 -VHDL

with current_display select 
char_output <= hours1 & '1' when "0111", 
      hours2 & '1' when "1011", 
     mins1 & '1' when "1101", 
     mins2 & '1' when "1110", 
     "00000" when others; 

다음과 같은 코드를 가지고 있지만 내가 7 세그먼트 디스플레이를 선택하는 두 개 이상의 옵션을 추가하고 싶습니다 전에. 내가이 사람들에게 또 다른 속성을 추가한다면, 그때는 복잡한 코드가 때문에 좀 "만약"문이 같은 코딩을 궁금 내가이 일을 하나의 옵션 만,

with set_alarm_switch & current_display select 
     char_output <= hours1 & '1' when "00111", 
       hours2 & '1' when "01011", 
       mins1 & '1' when "01101", 
       mins2 & '1' when "01110", 
       alarm_hours1 & '1' when "10111", 
       alarm_hours2 & '1' when "11011", 
       alarm_mins1 & '1' when "11101", 
       alarm_mins2 & '1' when "11110", 
       "00000" when others; 

추가.

+0

7 세그먼트 디스플레이를 모두 하나의 char_output 신호로 결합합니까? 나는 당신이 4 신호, 각 7 세그먼트 디스플레이 당 하나있을 것이라고 생각합니다. 그렇게했다면 코드를 단순화 할 것입니다. – Russell

+0

나는 7 세그먼트 디스플레이를위한 다른 vhdl 모듈을 가지고있다.이 모듈은 "when"다음에이 숫자들을 16 진수로 디스플레이에 할당한다. 그리고 저는 제 7 세그먼트 디스플레이를 모두 하나의 char_output 신호로 결합하고 있다고 생각합니다. 여기에있는 것은 처음에는 내가 작성한 첫 번째 코드가 있었지만 두 번째 코드의 마지막 4 줄에 몇 가지 다른 디스플레이를 보여줄 필요가있는 다른 스위치 할당을 생각해 냈습니다. 나에게 아이디어를 줄 수 있니? 아니면 그냥 두 번째 코드에서했던 것처럼 다른 속성을 추가하고 동일한 작업을 수행해야합니까 ??? Thx – Alkadian

+0

"if"를 "case"와 혼합하려면 프로세스에 넣어야합니다. 내가 VHDL - 2008, 선택한 과제 (위와 같이)는 프로세스에서 허용되지만, 이전에는 그렇지 않은 것으로 나타났습니다. 결과적으로 프로세스에 넣으면 동등한 case 문으로 변환해야 할 수도 있습니다. –

답변

1

나는 현재의 모든 대답이 다음과 같은 질문을 놓친다고 생각합니다. "[...]"if "문장 [...]으로 이와 동일한 코딩을하십시오."

현재 VHDL은 병렬 할당 문 (with-select)을 사용하여 원하는 회로를 설명합니다. 당신은 쉽게 병렬 프로세스 내에서 여러 개의 연속 문이 점을 변환 할 수 있습니다

assign_output_p : process (
    -- VHDL-2008: use "all" instead of each signal name 
    set_alarm_switch, 
    current_display, 
    hours1, 
    hours2, 
    mins1, 
    mins2, 
    alarm_hours1, 
    alarm_hours2, 
    alarm_mins1, 
    alarm_mins2 
    ) 
begin 

    -- default assignment 
    char_output <= (others => '0'); 

    if (set_alarm_switch = '1') then 
     -- set alarm case 

     case (current_display) is 
     when "0111" => 
      char_output <= alarm_hours1 & '1'; 
     when "1011" => 
      char_output <= alarm_hours2 & '1'; 
     when "1101" => 
      char_output <= alarm_mins1 & '1'; 
     when "1110" => 
      char_output <= alarm_mins2 & '1'; 
     when others => 
      -- case for other current_display values 
      -- including XUZ etc. 
      null; 
     end case; 

    else 
     -- default case 

     case (current_display) is 
     when "0111" => 
      char_output <= hours1 & '1'; 
     when "1011" => 
      char_output <= hours2 & '1'; 
     when "1101" => 
      char_output <= mins1 & '1'; 
     when "1110" => 
      char_output <= mins2 & '1'; 
     when others => 
      -- case for other current_display values 
      -- including XUZ etc. 
      null; 
     end case; 
    end if; 

end process assign_output_p; 

은 또한, 나는이 큰 다중 응용 프로그램에서 의미가 경우 평가한다고 생각합니다. 7 세그먼트 디스플레이는 그 타이밍이 중요하지 않으므로 어느 시점에 레지스터 단계를 포함하는 것이 좋습니다. 출력의 조합 => 다음 모듈을 등록 할 것이라고 가정을 떠나,

  1. 등록 입력 : 많은 기업은 이에 대한 정책을 선택합니다.
  2. 결합 입력, 레지스터 출력 => 이전 모듈에 출력이 등록되었다고 가정합니다.
1

개인적으로 나는 각 7 세그먼트 디스플레이를 자체 신호로 취급 할 것입니다. 당신은 이것을하지 않는 좋은 이유가 있을지 모르지만, 그것은 나에게 가장 이해가됩니다. 그래서 코드는 다음과 같습니다

seg3 <= hours_tens_time when current_display = '1' else hours_tens_alarm; 
seg2 <= hours_ones_time when current_display = '1' else hours_ones_alarm; 
seg1 <= mins_tens_time when current_display = '1' else mins_tens_alarm; 
seg0 <= mins_ones_time when current_display = '1' else mins_ones_alarm; 

이 방법을, 당신은 스톱워치를 추가 할 또는 어떤 경우 SEG3, 2, 1, 0에, 당신은 그것을 할 수 원하는대로 더 많은 신호를 추가 할 수 있습니다, 위의 조건부 할당을 확장하면됩니다. 신호에 더 의미있는 이름을 붙이십시오. hours1hours2은 아무 의미도 없습니다.

+0

그건 그렇고,이 부분은 내 주요 VHDL 모듈 코딩의 마지막 라인은 분명하다? 내가 보여준 부분이 나머지 코드를 이해하고 명확하게 이해하기를 바랍니다. 이 도움을 주셔서 감사합니다.이 아이디어로 내 7 세그먼트 디스플레이 라인을 변환하려고 노력할 것입니다. – Alkadian

+0

@Russell, 정말 당신이 가지고있는 보드에 달려 있습니다. Terasic Altera 보드 중 하나에 대해 각 세그먼트별로 별도의 라인이있는 것이 좋습니다.그러나 Digilent Xilinx 보드는 하나의 문자 출력 만 가지며 출력을 다중화합니다. 나는 Alkadian 보드가 Xilinx 보드와 더 유사하다고 생각한다. –

+0

아, 잘 알고 있습니다. 가능한 한 늦게 7 세그먼트에 muxing을 수행하는 것이 좋습니다. 이전 예제는 하나의 select 문 IMO에 너무 많이 넣었습니다. – Russell