'Studyhard/VHDL'에 해당되는 글 10건
- 2010.01.09 VHDL Simulation
- 2010.01.09 VHDL Basic End
- 2010.01.09 VHDL Basic 6
- 2010.01.09 VHDL Basic 5
- 2010.01.09 VHDL Basic 4 2
- 2010.01.09 VHDL Basic 3
- 2010.01.08 VHDL Basic 2
- 2010.01.08 VHDL Basic 1
- 2010.01.05 [VHDL] Step Motor Test Code 1
- 2010.01.05 [VHDL]16Mhz to 1hz
- TDL(TEGAS HDL or Texas Instrument HDL)
동작적 모델링 | 구조적 모델링 | |
칩 | 알고리즘 | MP, RAM, ROM |
회로 | 미분 방정식 | TR, R, L, C |
게이트 | 부울 | 게이트 |
시스템 | 설계 명세 | 컴퓨터, 디스크 |
레지스터 | RTL | ALU, 카운터, 레지스터 |
library ieee;
use ieee.std_logic_1164.all;
entity revstep is
port(clk : in std_logic;
reverse : in std_logic;
q : out std_logic_vector(3 downto 0));
end revstep;
architecture arc of revstep is
type state_type is (s0, s1, s2, s3);
signal state : state_type;
signal clock : std_logic;
begin
process(clk)
variable cnt : integer range 0 to 49999; --16Mhz, Step Motor Voltage 9V 에서
begin -- 5999 최고 속도, 49999 적정 판단
if (clk'EVENT and clk='1') then -- Votage 가 더 높아지면 최고 속도가
if (cnt=49999)then -- 더 높아질 것이라고 판단됨
clock <= not clock;
cnt:=0;
else
cnt:=cnt+1;
end if;
end if;
end process;
process (clock) -- signal 로 clock 을 설정 해 줌,process 가능
begin
IF (clock'EVENT and clock = '1') then
case state is
when s0 => state <= s1;
when s1 => state <= s2;
when s2 => state <= s3;
when s3 => state <= s0;
end case;
end if;
end process;
process(reverse)--reverse 입력에 따른 스텝 모터 Direction 조절
begin
if(reverse='0')then
case state is
when s0=>q<="1100";
when s1=>q<="0110";
when s2=>q<="0011";
when s3=>q<="1001";
end case;
else
case state is
when s0=>q<="1100";
when s1=>q<="1001";
when s2=>q<="0011";
when s3=>q<="0110";
end case;
end if;
end process;
END arc;
--------------------------
스텝 모터를 테스트 하기 위한 부분이다.
스텝 모터 드라이버는 7026 을 썼고..
2상 여자 방식을 썼다..
AB/A/B
테스트 시에는 스텝 모터가 한 방향으로 무한정 돌아가고..
reverse 버튼이 눌렸을 경우 반대 방향으로 돌아가는 걸 확인 할 수 있었다.
library ieee;
use ieee.std_logic_1164.all;
entity divone is
port(clk : in std_logic;
clk_one : buffer std_logic);
end divone;
architecture arc of divone is
begin
process (clk)
variable cnt : integer range 0 to 7999999;
begin
if (clk'EVENT and clk='1')then
if (cnt=7999999)then
cnt:=0;
clk_one <= not clk_one;
else
cnt:=cnt+1;
end if;
end if;
end process;
end arc;
---
보드에 16Mhz 오실레이터를 1분주 하여 1hz 를 만들어 보았다.
테스트 보드에서 확인 해 본 결과 정확히 1초 마다 깜빡이는 걸 알 수 있었다.
근데 왜 7999999 일까?
0 부터 7999999 이기 때문(카운트는 8000000)이다. 그리고
오실레이터는 16Mhz 즉 16000000 이기 때문에
1Hz 라는 _______-------- 신호를 만들기 위해서는
16000000 의 절반인 8000000 를 반은 Low 신호, 반은 High 신호로 주어야
정확한 Clock 이 나오게 된다