VHDL로 설계되어 있는 예제의 데이터 흐름을.. 순서도 등을 그려서 이해하시는 것이 좀 더 회로를 쉽게 이해하실 수 있습니다.
소소의 앞 부분에
if clk'event and clk = '1' then
if cnt = 1 then
p_clk <= not p_clk;
.....
라는 부분이 있습니다.
앞에서 설명 드렸듯이 주파수를 카운트하여, cnt가 1이 되었을 때 현재 p_clk값을 역으로 변화하게 합니다. 이 p_clk의 값은 std_logic 즉 1비트의 값이므로 이 값은 '0', '1', '0', '1' .. 이런식으로 값의 변하게 되고 이것이 PIEZO에 연결되는 주파수가 되는 것입니다.
>
지난변 피에조에 대한 답변 정말 감사합니다.
근데, 사실 소스를 보면 아직도 피에조에다가 어디서 값을 전달하는지를 모르겠습니다 ㅡㅡ;
물론 주파수 범위를 모두 바꾸고 버스스위치로 옥타브 설정까지 모두 했지만,
piezo_demo 소스를 보시면
저번에도 여쭤봤는데, piezo<=p_clk로 직접적으로 피에조로 버튼에 대한 주파수값을 전달이 어디서 이루어 지는지가 궁금합니다.
모든 키패드를 눌렀을 때 그 결과가 같은 음으로 나온다면....
키패드의 처리가 정확하게 되었는지, 카운트의 값이 잘 바뀌는 지 등을 살펴보셔야 합니다.
키패드의 블록을 따로 빼내어 각 키 패드를 눌렀을 때, 그 키 패드가 선택되는지를 먼저 동작시켜보고.. 설계한 로직에 연결하여 동작시켜보시기 바랍니다.
소스의 전체를 확인하지 못해, 자세히는 모르겠지만.. 이 키패드를 제어하는 부분에서 문제가 될 것으로 예상됩니다.
Component에서 입, 출력으로 선언한 핀들은 직접 하드웨어로 연결되지 않습니다.
하드웨어로 연결되는 입, 출력 핀들은 Top Project 파일의 Entity 문에서 선언된 입, 출력 포트만 핀 설정을 할 수 있습니다.
Component 문의 출력을 실제 output으로 하고 싶다면, Top prject 문에서의 Entity 문에서 선언한 포트와 연결해 주고, 이 Top Project 문에서 핀 설정을 해 주어야 합니다.
많은 도움을 드리지 못해 죄송합니다.
설계 할 때, 한 가지 방법적으로 말씀 드리면...
한번에 모든 블록을 설계하여 동작을 시켜보지 말고...
지금 설계되는 피아노 예제에서는 PIEZO를 제어하는 부분과 키패드를 제어하는 부분을 각각 설계하여 두 개를 합치는 방법으로 설계하시는 것이 좀 더 원활하게 작업을 할 수 있을 것으로 생각됩니다.
현재 PIEZO를 제어하는 예제도 6개의 버튼 스위치의 입력을 받아 동작하도록 되어 있는데..
1. 키패드 제어 블록에서 각 버튼을 눌렀을 때, 이 버튼이 눌린 값의 출력을 먼저 LED로 뽑아서 확인합니다. 이 때의 LED는 각 버튼을 눌렀을 때 그에 해당하는 1개의 LED가 출력되도록 설계되어야 합니다.
2. PIEZO의 제어 블록을 설계합니다. 지금 사용한 예제처럼 6개 또는 8비트 등의 입력을 받아 PIEZO의 출력을 하도록 설계합니다. 데이터의 입력은 버튼 스위치로 모자라니 BUS 스위치를 활용하면 됩니다.
3. 위의 각 두개의 제어 예제의 설계가 끝나면... 최 상위 파일을 설계하여 위의 두 개의 로직을 연결시킵니다. Key Pad 제어에서나오는 출력이 바로 PIeZO 제어 블록과 연결하게 하면 될 것입니다.
4. 3에서 위의 블록을 바로 연결해도 약간의 버그가 있을 수 있기 때문에.. 각 블록을 수정하여 테스트합니다.
이런 방법으로 설계를 진행하면 됩니다. ..
설계하려는 로직에서.. 먼저 그 기능의 정의하고, 기능 정의에 대하여 각 블록으로 나누어 제어 방법을 생각합니다. 위에서 나눈 각각의 블록을 설계하여 테스트하고 문제가 없을 시 상위 레벨에서 합쳐 테스트하는 방법으로 회로를 설계하는 것을 권장하여 드립니다.
좋은 하루 되세요..
--------------------------------------------------
그리고, 6개의 버튼으로 피아노 건반을 표현하기엔 조금 무리가 있는 듯 싶어서
키패드를 이용하려고 하는데,
이 키패드는 열이나 행의 버튼에서 사건이 발생해야 인식하는 장치라고
소스를 보면서 해석을 했는데,
그 소스에 버튼과 같이 피에조의 출력을 위해
PROCESS(clk) BEGIN --Press Button & Sound Effect
if clk'event and clk = '1' then
case keypadrow is
when "001" =>
case keypadcol is
when "0001" =>
if cnt = do then
cnt <= 0;
else
cnt <= cnt + 1;
end if;
라는 식으로 001에 해당하는 키패드 열일 때, 다시 키패드 행에 대한 case에서
0001에 해당하는 키패드의 사항 중
만약 카운트가 do... 라는 식으로 여기서부튼 버튼과 똑같이 설정을 했는데 불구하고
소리는 모두 동일한 음이 출력이 되는데
몇일을 키패드와 피에조를 함께 두고 고민을 해봐도 어느 부분이 문제인지 감이 오질 않네요;;
-----
마지막으로, 컴퍼넌트를 이용해서 다른 파일을 연계할 때, 컴퍼넌트 내에서
입출력 포트를 설정하는 것은 pin 설정에서 인식이 되지 않아,
메인 파일에서 컴퍼넌트에서 사용하는 인풋 아웃풋 변수를 또 선언해 줬더니
파일이 작동하지 않던데 (당연한 것 같기도 하네요 -_-;)
원래 컴퍼넌트에서 인, 아웃풋 설정은 인식이 되지 않는건가요?
너무 긴 질문... 죄송합니다;
Combo II를 이용해서 좀 더 완성도 높은 키패드 피아노를 제작하려다 보니
이것저것 자꾸 추가를 하게 되네요....
수고하세요~ |