2012-03-27 2 views
0

저는 ModelSim에서 VHDL을 배우기 시작했습니다. 그래서 내가하고있는 일이 정말로 멍청한 것 같으면 미리 사과드립니다."if-statement"가 적은 VHDL 코드에서 BCD_counter를 다시 작성하는 더 좋은 방법이 있습니까?

기본적으로 내가 만들려고하는 것은 한자리 위/아래 BCD 카운터에 대한 합성 VHDL 코드입니다. 카운터는 "Enable"이 '1'일 때 카운트하거나 그렇지 않으면 카운터가 유지됩니다. 입력 "Init"가 초기화되면 카운터는 "Direction"입력의 값에 따라 0 또는 9로 설정됩니다. ("Direction"이 '1'일 때, 그것은 up counter 임).

100 개의 if 및 else 행을 사용하는 것 이외의 다른 작업에 사용할 수있는 더 좋은 도구가 있는지 궁금합니다.

여기에 제 코드가 있습니다. 지금 당장 테스트 벤치를 작성 중이므로 아직 제대로 작동하는지 확실하지 않습니다. 그래서 실수를 저지른 경우 나에게 지적하십시오. 여기

감사합니다 사전에 많이, 그리고 내 코드입니다

entity BCD_counter is 
    port(clk, direction, init, enable: in bit; 
    q_out: out integer); 
end entity BCD_counter; 

architecture behaviour of BCD_counter is 
    signal q: integer; 
begin 
    process(clk) 
    begin 
    if(Clk'event and Clk = '1') then 
     if(direction = '1') then -- counting up 
     if(init = '1')then --initialize 
      q<=0; -- reset to 0 
     else 
     if(enable = '1')then -- counting   
      if (q<9) then 
       q<=q+1; 
      else 
       q<=0; 
      end if;   
     else 
      q<=q; 
      end if; 
     end if; 
     elsif(direction = '0') then --counting down 
     if(init = '1') then --initialize 
      q<=9; --reset to 9 
     else 
      if(enable = '1') then --counting   
      if (q>0) then 
       q<=q-1; 
      else 
       q<=9; 
      end if;  
      else 
      q<=q; 
      end if; 
     end if; 
     end if; 
    end if; 

    end process; 
     q_out <= q; 
end architecture behaviour; 

답변

2

약간 다른 스타일을 할 수 있지만, 내가 주목하는

포인트 그것을

architecture behaviour of BCD_counter is 
    signal next_q : integer; 
    signal q  : integer; 
begin 

    pReg : process 
    begin -- process pReg 
    wait until clk'event and clk = '1'; 
    if init = '1' then 
     q <= 0; 
    else 
     q <= next_q; 
    end if; 
    end process pReg; 

    pCount : process (direction, enable, q) 
    begin -- process pCount 
    next_q <= q; 

    if enable = '1' then 
     if direction = '1' then 
     next_q <= q + 1; 

     if q = 9 then 
      next_q <= 0; 
     end if; 

     else 
     next_q <= q - 1; 

     if q = 0 then 
      next_q <= 9; 
     end if; 

     end if; 
    end if; 
    end process pCount; 

    q_out <= q; 
end architecture behaviour; 
을 작성하는 방법입니다

  • 레지스터 동작에 로직과는 별도의 프로세스. 나는이 스타일이 깨끗하다는 것을 알았다. 다른 사람들은 다른 의견을 갖고있어서 보통 next_blah 신호를 좋아하지 않으려 고합니다.
  • init이 리셋 신호이므로 다른 것보다 우선하며 리셋 신호를 레지스터 프로세스에 넣습니다.
  • 카운터 프로세스의 첫 번째 줄은 기본적으로 수행하려고하는 것입니다. 이 경우 q의 다음 상태를 현재 상태라고합니다.
  • 나는 enable의 수표로 외부 if을가집니다. 활성화되지 않은 경우 아무 것도하지 않으므로 direction을 먼저 확인하십시오.
  • 방향 조건의 각 절반 안에 코드 구조가 동일합니다. 정상적인 경우를 원하는대로 설정 한 다음 규칙 예외를 확인하십시오. 예를 들어, 올라갈 경우 다음 상태를 q + 1로 설정하지만 q가 9이면 q를 < = 0으로 대체합니다.
  • 나는 어떤 비교에서도 >, <을 사용하지 않습니다. 이것들은 =보다 비싸고 =은 괜찮습니다.

또는 당신은 등록 과정에 활성화 걸릴 수 있습니다. 약간 더 짧아서 가능할 수도 있습니다. 또한이 기능을 위해 레지스터의 인 에이블 핀을 사용할 것으로 예상하고 있음을 분명히 알 수 있습니다.

pReg : process 
    begin -- process pReg 
    wait until clk'event and clk = '1'; 
    if init = '1' then 
     q <= 0; 
    else 
     if enable = '1' then 
     q <= next_q; 
     end if; 
    end if; 
    end process pReg; 

    pCount : process (direction, q) 
    begin -- process pCount 
    if direction = '1' then 
     next_q <= q + 1; 

     if q = 9 then 
     next_q <= 0; 
     end if; 
    else 
     next_q <= q - 1; 

     if q = 0 then 
     next_q <= 9; 
     end if; 
    end if; 
    end process pCount; 
1

내 마음에 오는 유일한 것은이 암시 적으로 수행되기 때문에이 두

else 
    q<=q; 

문을 ommit 수 있다는 것입니다 다른 조건들이 체크 아웃하지 않으면.

0

나는 이것을 많이한다. 나는 modulo_increment이라는 함수를 만들었는데,이 함수는 입력 정수와 "모듈러스"정수를 사용하고 값을 감싼 값을 반환한다.

그래서 당신은

q <= modulo_increment(q, 10);