使用63個macrocells,幾乎不浪費阿XD
所需材料:
1.HC-SR04 超音波距離感測器
2.數位電子乙級檢定的CPLD子板
3.7段顯示器(4位數封裝)
4.驅動7段顯示器的電路(參考下圖)
使用語言:VHDL
HC-SR04 超音波距離感測器介紹:
共有4隻腳位,分別為Vcc,Trig,Echo,Gnd;
電源與TTL相容(5V)
<以下腳位皆為高電位致能>
Trig:脈波輸入腳,建議使用負緣與正緣長度>=60mS且寬度>=10uS的脈波。
Echo:資料輸出腳,輸出的時間(uS)/(58)=距離(cm)。
NOTE:
1.發射角度15~30度。
2.建議偵測物體面積>0.5公尺平方(距離越遠面積要越大)。
3.距離偵測範圍:2~400cm(精確度:3mm)。
4.當距離太遠無法接收到回來的聲波,或是發射or接收器被阻擋時,資料會亂跳。
5.遇到會吸收聲音的材質時(ex:布料),數據會失準。
運作過程:
1.偵測到脈波,且脈波結束(負緣觸發)
2.發射8個週期的40kHZ超音波之後,Echo將呈現高電位狀態,直到接收端收到8個週期的40kHZ超音波為止。
原理:
利用聲波反射及音速,輸出發射出去和接收回來的時間,再透過計算之後(/58)得到長度。
VHDL程式碼:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY TEST IS
PORT(clk,echo:in std_logic;
trig:out std_logic;
scanout:out std_logic_vector(3 downto 0);
segout:out std_logic_vector(6 downto 0)
);
END;
ARCHITECTURE A OF TEST IS
signal cnt:std_logic_vector(16 downto 0);
signal cnt1:integer range 0 to 63;
signal bcd1,bcd0,bcd_1,bcd_0,bcd:std_logic_vector(3 downto 0);
signal bcd_2,bcd2:std_logic_vector(2 downto 0);
signal state:integer range 0 to 1;
signal f:std_logic_vector(1 downto 0);
begin
PROCESS(clk)
begin
if rising_edge(clk)then
f<=f+1;
end if;
if rising_edge(f(1))then
cnt<=cnt+1;
if cnt1/=57 then
cnt1<=cnt1+1;
else
cnt1<=0;
if echo='1'then
if bcd0/=x"9" then
bcd0<=bcd0+1;
else
bcd0<=x"0";
if bcd1/=x"9" then
bcd1<=bcd1+1;
else
bcd1<=x"0";
if bcd2/="111" then
bcd2<=bcd2+1;
end if;
end if;
end if;
state<=0;
else
case state is
when 0=>bcd_2<=bcd2;bcd_1<=bcd1;bcd_0<=bcd0;state<=1;
when 1=>bcd2<="000";bcd1<=x"0";bcd0<=x"0";
end case;
end if;
end if;
end if;
end process;
trig<=cnt(16);
with cnt(9 downto 8) select
scanout<="1110"when "00",
"1101"when "01",
"1011"when "10",
"0111"when "11";
with cnt(9 downto 8) select
bcd<=bcd_0 when "00",
bcd_1 when "01",
"0"& bcd_2 when "10",
x"f" when "11";
with bcd select
segout<="0000001"when x"0",
"1001111"when x"1",
"0010010"when x"2",
"0000110"when x"3",
"1001100"when x"4",
"0100100"when x"5",
"1100000"when x"6",
"0001101"when x"7",
"0000000"when x"8",
"0001100"when x"9",
"1111111"when others;
END A;
VHDL程式碼使用與解析:
clk連接到p43,使用4MHZ的石英震盪
echo和trig請連接至超音波感測器
scanout是四位數七段顯示器的掃描訊號輸出(3~0),請接至驅動電路的P1
segout是四位數七段顯示器的資料訊號輸出(a~g),請接至驅動電路的P2
這邊建議,CPLD用3.3V,超音波感測器用5V;雖然CPLD吃5V短時間不會出問題,但時間一久CPLD會變超燙,是很有可能燒掉CPLD的!另外也可以試試看讓超音波感測吃3.3V,我手上的似乎不會出問題。
24~26行:除頻用,將4MHZ轉成1MHZ,方便計算(1uS)。
29行:計算時脈訊號,2^17=131072,1MHZ/131072=7.6HZ,負緣與正緣的距離66mS。
59行:引出時脈訊號。
30~55行:該if主要是讓計數器每58uS上數一次,這樣就會有/58的效果。
35~47行:上數的程式,有做過乙級題目的都知道,因為該CPLD邏輯閘數量很少,所以不能用一般的方式(用整數上數,再/1000輸出....),另外這邊將第三位數限制在8以內,因為官方資料最遠是4m,而4這個數字的二進制為100(3bits),因此將第三位數限制在8(111)以內。
48~54行:送出資料與清空資料。
61~65行:掃描訊號輸出。
67~71行:bcd碼掃描選擇。
73~84行:七段解碼。
成品:






請問bcd_1跟bcd1是什麼的定義
回覆刪除還有請問state是定義什麼
回覆刪除謝謝
有底線(_)的是處理好的資料的暫存器,沒底線是處理中的資料;bcd1計算完成時會丟到bcd_1
回覆刪除state主要是要處理:bcd1丟到bcd_1、清空計算用的bcd1
作者已經移除這則留言。
回覆刪除