?? 頻率計2.txt
字號:
頻率計
1. 設計一個4位十進制頻率計,其測量范圍為1MHz。量程分10kHz、100kHz、1MHz、10Mhz四檔(最大讀數分別為9.999kHz、99.99kHz、999.9kHz、9999khz),量程自動轉換規則如下:
(1) 當讀數大于9999時,頻率計處于超量程狀態,下一次測量時,量程自動增大一檔。
(2) 當讀數小于0999時,頻率計處于欠量程狀態。下一次測量時,量程自動增大一檔。
2. 顯示方式如下:
(1) 采用記憶顯示方式,即計數過程中不顯示數據,待計數過程結束后,顯示計數結果,并將此顯示結果保持到下一次計數結束。顯示時間應不小于1s。
(2) 小數點位置隨量程變換自動移位。
3. 送入信號應是符合CMOS電路要求的脈沖或正弦波。
4. 設計符合上述功能的頻率計,并用層次化方法設計該電路。
5. 控制器、計數器、鎖存器的功能,用功能仿真方法驗證,還可通過觀察有關波形確認電路設計是否正確。
6. 完成電路設計后在實驗系統上下載,驗證課題的正確性。
二、設計說明與提示
頻率計測頻原理框圖如圖17-1所示。
fin
clr
count
en
clk led
choice
counts
load
clk1024
圖17-1 頻率計測頻原理圖
1. 信號說明:
clk:時鐘信號(1HZ)
fin:輸入頻率信號;最高可測頻率為9.999MHZ;
clr:清零信號;
en:計數使能信號;
count:計數輸出信號
counts:計數輸出經鎖存的信號
led:顯示輸出,四個十進制數
choice:控制量程的信號,00代表10khz檔;01代表100khz檔;10代表1Mhz檔;11代表10Mhz檔;
load:輸出鎖存;
clk1024:動態掃描模塊的掃描頻率
2. 模塊功能:
控制模塊:
每次測量時,用由時基信號產生的閘門信號啟動計數器,對輸入脈沖信號計數,閘門信號結束即將計數結果送入鎖存器,然后計數器清零,準備下一次計數。
計數模塊:
計數器為模9999十進制加法計數器,可由4個模10十進計數器級聯而成。并且可由量程選擇信號控制模9999計數器的基本頻率(比如100khz檔的基本頻率為10hz,即輸入10個脈沖時模9999計數器計1)
量程轉換模塊:
1)當讀數大于9999時,頻率計處于超量程狀態,此時顯示器發出溢出指示(最高位顯示F,其余各位不顯示數字),下一次測量時,量程自動增大一檔。
2) 當讀數小于0999時,頻率計處于欠量程狀態。下一次測量時,量程自動增大一檔。
動態掃描模塊:
1. 帶鎖存功能。
2. 顯示電路為四位動態掃描電路,。
程序設計說明:
控制模塊:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY control IS
PORT(
clk : IN STD_LOGIC;
en,clr,load : OUT STD_LOGIC);
END control;
ARCHITECTURE a OF control IS
SIGNAL eninside : STD_LOGIC;
BEGIN
en<=eninside; --en計數使能信號寬度為一秒
load<= NOT eninside; ――使能結束后發出鎖存信號
clr<=(NOT clk) AND (NOT eninside); ――鎖存信號發出0.5s后發出清零信號
controllabel:
PROCESS (clk) ――輸入時鐘周期為1s
BEGIN
IF clk'event AND clk='1' THEN
eninside<=not eninside;
END IF;
END PROCESS controllabel;
END a;
計數模塊:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY countmode IS
PORT(
fin,en,clr : IN STD_LOGIC;
choice : IN STD_LOGIC_VECTOR(1 DOWNTO 0);
count : BUFFER STD_LOGIC_VECTOR(15 DOWNTO 0));
END countmode;
ARCHITECTURE a OF countmode IS
SIGNAL finclk : STD_LOGIC; ――不同量程時的驅動時鐘(不包括直接輸入時鐘)
SIGNAL finclks : STD_LOGIC;――不同量程時的驅動時鐘
SIGNAL choicecount : STD_LOGIC_VECTOR(8 DOWNTO 0);――不同驅動時鐘的計數
SIGNAL choicechange : STD_LOGIC_VECTOR(8 DOWNTO 0);――不同量程驅動時鐘的計數
BEGIN
choicechange<="000000100" WHEN choice="01" ELSE --99.99kHz檔的驅動時鐘每10個脈沖為一次跳變周期,故每計數到4時跳變一次,可以實現相應跳變周期。
"000110001" WHEN choice="10" ELSE ――999.9kHz檔類上述計數49次跳變一次
"111110011"; ――9999kHz檔,每499次跳變一次
modelabel:
PROCESS (fin,en,clr) ――經過第一次處理得出驅動計數器的驅動頻率finclk
BEGIN
IF clr='1' THEN
choicecount<="000000000";
finclk<='0';
ELSIF fin'event AND fin='1' THEN
IF en='1' THEN choicecount<=choicecount+1; END IF;
IF choicecount=choicechange THEN choicecount<="000000000";finclk<=NOT finclk;END IF;
END IF;
END PROCESS modelabel;
finclks<=(NOT fin) WHEN choice="00" ELSE finclk;――加入直接驅動模式
countmodelabel:
PROCESS (finclks,en,clr)
VARIABLE countinside : STD_LOGIC_VECTOR(15 DOWNTO 0);
BEGIN
IF clr='1' THEN
countinside:="0000000000000000";
ELSIF finclks'event AND finclks='0' THEN
IF en='1' THEN countinside:=countinside+1;END IF;
IF countinside(3 DOWNTO 0)=10 THEN countinside:=countinside+6;END IF;――進制處理
IF countinside(7 DOWNTO 4)=10 THEN countinside:=countinside+"01100000";END IF;
IF countinside(11 DOWNTO 8)=10 THEN countinside:=countinside+"011000000000";END IF;
END IF;
count<=countinside;
END PROCESS countmodelabel;
END a;
量程轉換模塊:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY change IS
PORT(
clr : IN STD_LOGIC;
counts : IN STD_LOGIC_VECTOR(3 DOWNTO 0);
choice : OUT STD_LOGIC_VECTOR(1 DOWNTO 0));
END change;
ARCHITECTURE a OF change IS
SIGNAL up,down,change : STD_LOGIC;
BEGIN
up<='1' WHEN (counts > "1001") AND clr='1' ELSE '0';――超量程狀態,產生提檔信號
down<='1' WHEN (counts = "0000") AND clr='1' ELSE '0';――欠量程時,產生降檔信號
change<=up OR down;――變量程信號
controllabel:
PROCESS (change)
VARIABLE choicein : STD_LOGIC_VECTOR(1 DOWNTO 0);
BEGIN
IF change'event AND change='1' THEN
IF up='1' AND (not (choicein="11")) THEN choicein:=choicein+1;
ELSIF down='1' AND (not (choicein="00")) THEN choicein:=choicein-1;END IF;
END IF; ――產生量程選擇信號
choice<=choicein;
END PROCESS controllabel;
END a;
掃描轉換模塊:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
ENTITY sao IS
PORT(
load,clk : IN STD_LOGIC;
countin : IN STD_LOGIC_VECTOR(15 downto 0);
choiceshow : IN STD_LOGIC_VECTOR(1 downto 0);
counts : OUT STD_LOGIC_VECTOR(3 downto 0);
choice : OUT STD_LOGIC_VECTOR(3 downto 0);
data : OUT STD_LOGIC_VECTOR(7 downto 0));
END sao;
ARCHITECTURE a OF sao IS
SIGNAL dot : STD_LOGIC;
SIGNAL count : STD_LOGIC_VECTOR(1 downto 0);
SIGNAL temp,p4,p3,p2,p1 : STD_LOGIC_VECTOR(3 downto 0);
SIGNAL choicein : STD_LOGIC_VECTOR(3 downto 0);
SIGNAL datain : STD_LOGIC_VECTOR(7 downto 0);
BEGIN
clklabel:
PROCESS (load) ――鎖存顯示數值
BEGIN
IF load'event and load='1' THEN
counts<=countin(15 downto 12);
p4<=countin(15 downto 12);
p3<=countin(11 downto 8);
p2<=countin(7 downto 4);
p1<=countin(3 downto 0);
END IF;
END PROCESS clklabel;
clk1_label:
PROCESS (clk) ――掃描時鐘
BEGIN
IF clk'event and clk='1' THEN
count<=count+1;
END IF;
END PROCESS clk1_label;
dot<='1' WHEN choiceshow=count ELSE '0'; ――由選擇信號決定小數點的顯示
clk2_label:
PROCESS (clk)
BEGIN
if clk'event and clk='0' then
choice<=choicein; ――顯示當前掃描位置
data<=datain(7 DOWNTO 1) & dot; ――顯示當前顯示數值
END IF;
END PROCESS clk2_label;
choicein<="0001" when count="00" else ――掃描位置轉換
"0010" when count="01" else
"0100" when count="10" else
"1000" ;
temp<= p1 when count="00" else ――顯示數值選擇
p2 when count="01" else
p3 when count="10" else
p4 ;
WITH temp select
datain <= "11111100" WHEN "0000", ――數值轉換成數碼管的相應輸入信號
"01100000" WHEN "0001",
"11011010" WHEN "0010",
"11110010" WHEN "0011",
"01100110" WHEN "0100",
"10110110" WHEN "0101",
"10111110" WHEN "0110",
"11100000" WHEN "0111",
"11111110" WHEN "1000",
"11110110" WHEN "1001",
"11101110" WHEN "1010",
"00111110" WHEN "1011",
"10011100" WHEN "1100",
"01111010" WHEN "1101",
"10011110" WHEN "1110",
"10001110" WHEN OTHERS;
END a;
三、實驗報告要求
1. 畫出頂層原理圖。
2. 對照頻率計波形圖分析電路工作原理。
3. 寫出各功能模塊的VHDL語言源文件。
4. 敘述各模塊的工作原理。
5. 祥述控制器的工作原理,繪出完整的電路或寫出VHDL源文件。
6. 書寫實驗報告時應結構合理,層次分明,在分析時注意語言的流暢。
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -