第一篇:數字頻率計實驗報告
數字電路與系統課程設計
大連理工大學城市學院
數字電路與系統課程設計
設計題目:數字頻率計
學 院:電子與自動化學院 專 業: 自動化 學 生: 揣智涵 同 組 人: 王曉寧 周英茹 指導教師: 于海霞 完成日期: 2012年3月26日
數字電路與系統課程設計
目 錄
第一章 設計任務
1.1項目名稱 1.2項目設計說明 1.2.1設計任務和要求 1.2.2進度安排 1.3項目總體功能模塊圖
第二章 需求分析
2.1問題基本描述
(要求分析得出整個系統流程圖)2.2系統模塊分解及各模塊功能的基本要求
第三章 設計原理
3.1 設計原理 3.2 MAXPLUSII介紹
第四章 系統功能模塊設計
4.1 FEN模塊
4.1.1 FEN模塊流程圖
4.1.2 輸入輸出引腳及其功能說明 4.1.3 程序代碼實現 4.2 SEL模塊
4.2.1 SEL模塊流程圖
4.2.2輸入輸出引腳及其功能說明 4.2.3程序代碼實現
數字電路與系統課程設計
4.3 CORNA模塊
4.3.1 CORNA模塊流程圖
4.3.2 輸入輸出引腳及其功能說明 4.3.3 程序代碼實現 4.4 LOCK模塊
4.4.1 LOCK模塊流程圖
4.4.2 輸入輸出引腳及其功能說明 4.4.3 程序代碼實現 4.5 CH模塊
4.5.1 輸入輸出引腳及其功能說明 4.5.2 程序代碼實現 4.6 DISP模塊
4.6.1 輸入輸出引腳及其功能說明 4.6.2 程序代碼實現
第五章調試并分析結果
5.1輸入說明 5.2預計輸出 5.3測試結果記錄 5.4測試結果分析
第六章 結論 心得體會 參考文獻
數字電路與系統課程設計
第一章 設計任務
1.1 項目名稱:數字頻率計 1.2 項目設計說明
1.2.1 設計任務和要求 此頻率計共分4檔: 一檔:0~9999Hz;二檔:10~99.99kHZ;三檔:100.0~999.9kHz;,四檔:1.000~999MHz;在換擋的設計方面,此程序突破了以往改變閘門時間的方法,使自動換擋的實現更加簡單可靠。1.2.2 進度安排
第一節課:畫出模塊及程序流程圖
第二節課:調試各模塊程序使其無誤
第三節課:連接整個程序并下載到試驗箱是數字頻率計的功能實現
第四節課:改進程序設計實現創新,然后完成課程設計報告
第五節課:完成答辯 1.3 項目總體功能模塊圖如下
數字電路與系統課程設計
圖1-1
數字電路與系統課程設計
第二章 需求分析
2.1 問題基本描述
所謂頻率,就是周期信號在單位時間(1秒)內變化的次數。頻率計的測量范圍為1MHZ,為了測量精確量程分別為10KHZ,100KHZ,1000KHZ和1MHZ四個檔。即最大讀數分別為9.999KHZ,99.99KHZ,999.9KHZ,999MHZ。要求兩成自動換擋。其具體功能如下:
(1)當量程超過999時,自動增大一檔,下一次測量時量程大一檔;
(2)當超過測量范圍時,顯示溢出,報警器報警。(3)小數點位置隨量程變化自動移位。
(4)采用記憶顯示方法,在測量過程中不顯示數據,在測量完成以后顯示測頻結果,并將此結果 保存到下次測量結束,顯示時間不少于1秒。
(5)根據頻率計的測頻原理,可以選擇合適的時基信號即閥門時間,對輸入信號脈沖進行計數,實現測頻的目的。
(6)根據數字頻率計的設計原理,可以將數字頻率計設計分為五個模塊來實現其功能。即分頻模塊,控制模塊,計數模塊,鎖存模塊和顯示模塊。用CLDH語言進行編程。
(7)弄清什么情況下是測頻率,就是選擇合適的時基信號的問題。測頻率時以輸入信號作為時鐘信號,因為輸入信號的頻率大于頻率計的基準頻率。:
數字電路與系統課程設計
數字頻率計的系統流程圖如下
圖2-1
數字電路與系統課程設計
2.2 系統模塊分解及各模塊功能的基本要求
計數器在各個檔是被反復應用的,如果在各個檔分別設計計數器就造成資源的浪費,而且在測周期和頻率的時候,計數器的時基信號和輸入信號要進行調換,但計數功能是一樣的,所以將計數器設為單獨的模塊。七段譯碼器也是被重復使用的,也設成單獨的模塊,這樣的話就不用在重復使用的時候重復書寫譯碼電路了。總體來說數字頻率計分為五個模塊來設計,即分頻模塊計數 模塊,鎖存模塊,預測控制信號發生器,顯示模塊。
分頻模塊為計數模塊提供1秒的閥門時間。計數模塊是整個程序的核心,它完成在1秒的時間里對被測信號計數的功能,并通過選擇輸出數據實現自動換擋的功能。鎖存模塊在信號L的下降沿到來時將信號A4,A3,A2,A1鎖存。顯示模塊對應于數碼管片選信號,將相應的數據送出,其中檔位也通過數碼管顯示。
數字電路與系統課程設計
第三章 設計原理
3.1 設計原理
眾所周知,頻率信號易于傳輸,抗干擾性強,可以獲得較好的測量精度。因此,頻率檢測是電子測量領域最基本的測量之一。頻率計的基本原理是用一個頻率穩定度高的頻率源作為基準時鐘,對比測量其他信號的頻率。通常情況下計算每秒內待測信號的脈沖個數,即閘門時間為1 s。閘門時間可以根據需要取值,大于或小于1 s都可以。閘門時間越長,得到的頻率值就越準確,但閘門時間越長,則每測一次頻率的間隔就越長。閘門時間越短,測得的頻率值刷新就越快,但測得的頻率精度就受影響。一般取1 s作為閘門時間。
數字頻率計的關鍵組成部分包括測頻控制信號發生器、計數器、鎖存器、譯碼驅動電路和顯示電路,其原理框圖如圖3-1所示。
圖3-1數字頻率計原理圖
3.2 MAXPLUSII介紹
MAX+PLUSⅡ(Multiple Array and Programming Logic User System)開發工具是Altera公司推出的一種EDA工具,具有靈活高效、使用便捷和易學易用等特點。Altera公司在推出各種CPLD的同時,也在不斷地升級相應的開發工具軟件,已從早起的第一代A+PLUS、第二代MAX+PLUS發展到第三代MAX+PLUSⅡ和第四代
數字電路與系統課程設計
Quartus。使用MAX+PLUSⅡ軟件,設計者無需精通器件內部的復雜結構,只需用業已熟悉的設計輸入工具,如硬件描述語言、原理圖等進行輸入即可,MAX+PLUSⅡ就會自動將設計轉換成目標文件下載到器件中去。MAX+PLUSⅡ開發系統具有以下特點。(1)多平臺。MAX+PLUSⅡ軟件可以在基于PC機的操作系統如Windows95、Windows98、Windows2000、Windows NT下運行,也可以在Sun SPAC station等工作站上運行。
(2)開放的界面。MAX+PLUSⅡ提供了與其他設計輸入、綜合和校驗工具的接口,借口符合EDIF 200/300、LPM、VHDL、Verilog-HDL等標準。目前MAX+PLUSⅡ所支持的主流第三方EDA工具主要有Synopsys、Viewlogic、Mentor、Graphics、Cadence、OrCAD、Xilinx等公司提供的工具。
(3)模塊組合式工具軟件。MAX+PLUSⅡ具有一個完整的可編程邏輯設計環境,包括設計輸入、設計處理、設計校驗和下載編程4個模塊,設計者可以按設計流程選擇工作模塊。(4)與結構無關。MAX+PLUSⅡ開發系統的核心——Compiler(編譯器)能夠自動完成邏輯綜合和優化,它支持Altera的Classic、MAX7000、FLEX8000和FLEX10K等可編程器件系列,提供一個與結構無關的PLD開發環境。
(5)支持硬件描述語言。MAX+PLUSⅡ支持各種HDL設計輸入語言,包括VHDL、Verilog-HDL和Altera的硬件描述語言AHDL。(6)豐富的設計庫。MAX+PLUSⅡ提供豐富的庫單元供設計者調用,其中包括一些基本的邏輯單元,74系列的器件和多種特定功能的宏功能模塊以及參數化的兆功能模塊。調用庫單元進行設計,可以大大減輕設計人員的工作量,縮短設計周期。
數字電路與系統課程設計
第四章 系統功能模塊
4.1 FEN 模塊
4.1.1 FEN 模塊流程圖
圖4-1
數字電路與系統課程設計
4.1.2輸入輸出引腳及其功能說明
模塊FEN如圖9-87所示。通過對4MHz時鐘的分頻得到0.5Hz時鐘,為模塊CORNA提供1s的閘門時間。CLK:輸入時鐘信號;Q:輸出分頻后的基準信號。程序代碼的實現如下
library ieee;use ieee.std_logic_1164.all;entity fen is
port(clk:in std_logic;
q: out std_logic);
end fen;architecture fen_arc of fen is begin process(clk)variable cnt: integer range 0 to 999999;variable x: std_logic;begin
if clk'event and clk = '1' then
if cnt<999999 then
cnt:=cnt+1;
else
cnt:=0;
x:= not x;
end if;
end if;
q<=x;end process;end fen_arc;
圖4-2
數字電路與系統課程設計
4.2 SEL模塊
4.2.1 SEL 模塊流程圖
圖4-3 4.2.2 SEL模塊輸入輸出引腳及其功能說明
CLK:基準時鐘信號; Q[2..0]:產生數碼管的片選信號。4.2.3 程序代碼實現
library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity sel is port(clk: in std_logic;
圖4-4 q:out std_logic_vector(2 downto 0));
end sel;
數字電路與系統課程設計
architecture sel_arc of sel is begin process(clk)variable cnt:std_logic_vector(2 downto 0);begin
if clk'event and clk='1' then
cnt:=cnt+1;
end if;
q<=cnt;end process;end sel_arc;4.3 模塊CORNA 4.3.1 CORNA 模塊流程圖
圖4-5 14
數字電路與系統課程設計
4.3.2 輸入輸出引腳及其功能說明
該模塊是整個程序的核心,它完成在1s的時間里對被測信號計數的功能,并通過選擇輸出數據實現自動換擋的功能輸入輸出引腳及其功能說明CLR:復位按鈕;SIG:待測頻率信號;DOOR:基準時鐘頻率;ALM:蜂鳴器;DANG[3..0]:檔位值;Q0~4[3..0]:計算后的頻率值。4.3.3程序代碼實現
library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity corna is port(clr,sig,door : in std_logic;
alm : out std_logic;
q3,q2,q1,q0,dang : out std_logic_vector(3 downto 0));end corna;
architecture corn_arc of corna is begin process(door,sig)variable c0,c1,c2,c3,c4,c5,c6: std_logic_vector(3 downto 0);variable x:std_logic;
begin
if sig'event and sig='1' then
if door='1' then
if c0<“1001”then
c0:=c0+1;
else
c0:=“0000”;
if c1<“1001” then
c1:=c1+1;
else
c1:=“0000”;
圖4-6
數字電路與系統課程設計
if c2<“1001” then
c2:=c2+1;
else
c2:=“0000”;
if c3<“1001” then
c3:=c3+1;
else
end if;
end if;
end if;
end if;end if;end if;end if;else if clr = '0' then
alm <= '0';end if;c6:=“0000”;c5:=“0000”;c4:=“0000”;c3:=“0000”;c2:=“0000”;
c3:=“0000”;if c4<“1001” then c4:=c4+1;else c4:=“0000”;if c5<“1001” then
c5:=c5+1;else
c5:=“0000”;if c6<“1001” then
c6:=c6+1;else
c6:=“0000”;
alm<='1';
數字電路與系統課程設計
c1:=“0000”;c0:=“0000”;end if;if c6/=“0000” then q3<=c6;q2<=c5;q1<=c4;q0<=c3;dang<=“0100”;elsif c5/=“0000” then q3<=c5;q2<=c4;q1<=c3;q0<=c2;dang<=“0011”;elsif c4/=“0000” then q3<=c4;q2<=c3;q1<=c2;q0<=c1;dang<=“0010”;else q3<=c3;q2<=c2;q1<=c1;q0<=c0;dang<=“0001”;end if;end if;end process;end corn_arc;
數字電路與系統課程設計
4.4 模塊LOCK 4.4.1 LOCK 模塊流程圖
圖4-7 4.4.2 輸入輸出引腳及其功能說明
該模塊實現鎖存器的功能,在信號L的下降沿到來時信號A4、A3、A2、A1鎖存。輸入輸出引腳及其功能說明L:基準時鐘信號;A0~4[3..0]:接受計數器CORNA傳過來的值并鎖存;Q0~4[3..0]:向數據選擇器傳值。4.4.3 程序代碼實現
library ieee;use ieee.std_logic_1164.all;entity lock is
數字電路與系統課程設計
port(l: in std_logic;
a4,a3,a2,a1,a0:in std_logic_vector(3 downto 0);
q4,q3,q2,q1,q0:out std_logic_vector(3 downto 0));end lock;architecture lock_arc of lock is begin process(l)variable t4,t3,t2,t1,t0:std_logic_vector(3 downto 0);begin
if l'event and l='0' then
t4:=a4;
t3:=a3;
t2:=a2;
t1:=a1;
t0:=a0;
end if;
q4<=t4;
q3<=t3;
q2<=t2;
q1<=t1;
q0<=t0;end process;
圖4-8 end lock_arc;4.5 模塊CH
4.5.1 輸入輸出引腳及其功能說明
該模塊對應于數碼管片選信號,將相應的數據送出,其中檔位也通過數碼管顯示。輸入輸出引腳及其功能說明SEL[2..0]:接受SEL模塊傳來的數碼管片選信號;A[3..0]:接受鎖存器傳來的數碼管片選信號;DANG[3..0]:接受鎖存器傳來的檔位信號;Q[3..0]:傳出數碼管位選信號。4.5.2 程序代碼實現
library ieee;
數字電路與系統課程設計
use ieee.std_logic_1164.all;entity ch is port(sel:in std_logic_vector(2 downto 0);
a3,a2,a1,a0,dang:in std_logic_vector(3 downto 0);
q:out std_logic_vector(3 downto 0));end ch;
architecture ch_arc of ch is begin process(sel)begin
case sel is
when “110” =>q<=a0;
when “010” =>q<=a1;when “100” =>q<=a2;
圖4-9
when “000” =>q<=a3;
when “101” =>q<=dang;
when others =>q<= “1111”;end case;end process;end ch_arc;4.6 DISP模塊
4.6.1輸入輸出引腳及其功能說明
D[3..0]:接受CH傳出的數碼管位選信號;Q[6..0]:譯碼出數碼管位選信號; 4.6.2程序代碼實現
use ieee.std_logic_1164.all;entity disp is port(d:in std_logic_vector(3 downto 0);
q:out std_logic_vector(6 downto 0));
圖4-10 end disp;
數字電路與系統課程設計
architecture disp_arc of disp is
begin process(d)begin
case d is
when “0000” =>q<=“0111111”;
when “0001” =>q<=“0000110”;
when “0010” =>q<=“1011011”;
when “0011” =>q<=“1001111”;
when “0100” =>q<=“1100110”;
when “0101” =>q<=“1101101”;
when “0110” =>q<=“1111101”;
when “0111” =>q<=“0100111”;
when “1000” =>q<=“1111111”;
when “1001” =>q<=“1101111”;
when others =>q<=“0000000”;
end case;end process;end disp_arc;
數字電路與系統課程設計
第五章
5.1輸入說明
調試并分析結果
SIG:接1KHz頻率;CLR:接開關;CLK:接4MHz頻率。
5.2預計輸出
低兩位數碼管顯示‘1’;高四位數碼管顯示‘1000’。
5.3 測試結果記錄
低兩位數碼管顯示‘1’;高四位數碼管顯示‘1000’。
5.4 測試結果分析
本頻率計滿足試驗要求,使用周期和直接測量法進行測量,這樣會減小誤差。實驗中也遇到了很多問題,在器件在線編程過程中,program各項操作無法進行,如果是首次編程,則需要設置下載端口,如果還比能進行操作,可能是芯片或者試驗箱出現問題,所以應該換芯片或試驗箱。在連接引腳是要特別注意,否則顯示管無法顯示。此外此試驗還有需要改進的地方,比如測量頻率的精度和靈敏度。
待測信號給的是1KHz,數碼管檔位顯示為一檔(0~9999Hz);頻率顯示為‘1000’;與預計輸出完全一樣。因為基準信號和待測信號是同一個信號源,故如此準確。也論證了上述設計的正確性。
數字電路與系統課程設計
圖5-1 如上圖,待測信號sig 10KHz,clk接1MHz顯示如圖,第一行和第二行為脈沖頻率,第三行為檔位,10KHz的待測信號檔位為二檔。
數字電路與系統課程設計
第六章 結論
心得體會
經過這次的實驗課程設計,我學到了如何將多個程序綁在一起使用并構成一個完整的系統。在老師的指導下、在我們實驗設計小組的共同努力下、在其他同學的熱情幫助下,我們完整滴完成了《數字頻率計》的設計、組裝,并做了些創新。
雖然實驗成功,我們同樣在實驗過程中遇到了一些問題: 1.剛開始時候的設計是每組組員做一部分,但是問題就是有些系數不能同一。因此造成了一開始實驗進展緩慢。2.在實驗過程中,器材的問題也被我們遇到了。因此也得到了些經驗:要對自己的實驗成果由信心,不要一出問題就從程序中找問題。可能對你最大的阻礙就是你沒有考慮到的器材問題。
3.在最后仿真時候,導線的順序也是常出問題的地方。由于沒有及時發現問題的所在,我們小組花費了整整一節課的時間在改程序,浪費了許多寶貴時間。
參考文獻
【1】VHDL數字電路設計與應用與實踐教程 【2】第2版王振紅 主編機械工業出版社
數字電路與系統課程設計
第二篇:數字頻率計
//*********************************************************************
//* 標題: 簡易數字頻率計 //* 文件: topdesign.v
//* 作者: SJ&QJY
//* 日期: 2009.06.10 //* 修改: 2009.12.20
//* 軟件: Xilinx ISE 7.1 SP4
//* 芯片: Xilinx Spartan2 FPGA(XC2S200-pq208)
//* 說明: 測頻率并用LCD顯示,從信號源接入一個信號(正弦波,三角波或者方波),經過AD1轉換后,送入FPGA中。
//在FPGA中,使用雙值法整形,得到標準的方波,然后測出頻率,并送入1602中顯示。經測試,其測頻誤差小于0.5%,其測頻范圍為10Hz-10MHz。
//********************************************************************* //* 注意: 輸入信號電壓峰峰值不要超過AD輸入范圍,即4V。
//*********************************************************************
//---------------module topdesign(clk, rst, lcd_rs, lcd_rw, lcd_en, lcd_d, ad1_clk, ad1_d);
input clk;
//時鐘信號40MHz input rst;
//全局復位信號
output lcd_rs;//LCD數據/命令選擇信號,'1'表示數據輸入,'0'表示命令輸入
output lcd_rw;
//LCD讀/寫信號,'1'表示讀,'0'表示寫
output reg lcd_en;
//LCD使能信號,'1'有效
output[7:0] lcd_d;
//LCD數據總線(8位)
output ad1_clk;
//AD時鐘信號
input[11:0] ad1_d;
//AD9224,12位AD輸入
//LCD時序常量信號
parameter[10:0] IDLE = 11'b00000000000;
//初始化
parameter[10:0] CLEAR = 11'b00000000001;
//清屏
parameter[10:0] RETURNCURSOR = 11'b00000000010;//歸位
parameter[10:0] SETMODE = 11'b00000000100;
//設置輸入模式。此狀態為完成一個字符碼傳送后,AC自動減1,顯示不發生移位
parameter[10:0] SWITCHMODE = 11'b00000001000;//顯示開關控制
parameter[10:0] SHIFT = 11'b00000010000;//光標或顯示移位
parameter[10:0] SETFUNCTION = 11'b00000100000;//功能設置:數據總線選8位還是4位
parameter[10:0] SETCGRAM = 11'b00001000000;//CGRAM的地址設置
parameter[10:0] SETDDRAM = 11'b00010000000;
//DDRAM地址設置
parameter[10:0] READFLAG = 11'b00100000000;//讀忙標志BF和AC
parameter[10:0] WRITERAM = 11'b01000000000;
//寫數據到CGRAM或DDRAM
parameter[10:0] READRAM = 11'b10000000000;
parameter cur_inc = 1'b1;
parameter cur_dec = 1'b0;
parameter cur_shift = 1'b1;
parameter cur_noshift = 1'b0;
parameter open_display = 1'b1;
parameter open_cur = 1'b0;
parameter blank_cur = 1'b0;
parameter shift_display = 1'b1;
parameter shift_cur = 1'b0;
parameter right_shift = 1'b1;
parameter left_shift = 1'b0;
parameter datawidth8 = 1'b1;
parameter datawidth4 = 1'b0;
parameter twoline = 1'b1;
parameter oneline = 1'b0;
parameter font5x10 = 1'b1;
parameter font5x7 = 1'b0;
reg[10:0] state;
//時序信號
reg[5:0] counter;
reg[3:0] div_counter;
reg flag;
//輔助時序信號
parameter DIVSS = 4'd15;
reg[5:0] char_addr;
reg[7:0] data_in;
//延遲參量信號
reg clk_int;
reg[19:0] clkcnt;
parameter[19:0] divcnt = 20'b***00000;
reg clkdiv;
wire tc_clkcnt;
//測頻部分
parameter[15:0] ad_d_chankao1 = 16'b***1;
parameter[15:0] ad_d_chankao2 = 16'b***1;
reg[15:0] ad1_d_r;
//計數部分
reg[25:0] yimiao;
//用來計數
reg rukou;
//整形方波
reg[3:0] odata7;
//記錄數據
reg[3:0] odata6;
reg[3:0] odata5;
reg[3:0] odata4;
reg[3:0] odata3;
reg[3:0] odata2;
//將近-25mV //將近25mV
reg[3:0] odata1;
reg[3:0] odata0;
reg[7:0] data7;
reg[7:0] data6;
reg[7:0] data5;
reg[7:0] data4;
reg[7:0] data3;
reg[7:0] data2;
reg[7:0] data1;
reg[7:0] data0;
reg yimiao_rst;
//將記錄的數據轉換成ASCII碼,以便顯示
//數據清零信號
//主程序
assign ad1_clk = clk;
always @(posedge clk)
begin
yimiao_rst =(yimiao == 26'b***00111111111)? 1'b0 : 1'b1;//一秒時清零信號有效
end //測頻部分
always @(posedge clk)
begin
ad1_d_r <= {ad1_d, 4'b0000};
if(ad1_d_r > ad_d_chankao2)
rukou <= 1'b1;
if(ad1_d_r < ad_d_chankao1)
rukou <= 1'b0;
end //1秒鐘測頻
always @(posedge clk)
//每1秒鐘循環一次
begin
if(yimiao == 26'b***01000000000)
yimiao <= 26'b***00000000000;
else
yimiao <= yimiao + 1;
end
//計數部分
always @(posedge rukou or negedge yimiao_rst)
if(~yimiao_rst)
begin
odata0 <= 4'b0000;
odata1 <= 4'b0000;
odata2 <= 4'b0000;
odata3 <= 4'b0000;
odata4 <= 4'b0000;
odata5 <= 4'b0000;
odata6 <= 4'b0000;
odata7 <= 4'b0000;
end
else if(yimiao < 26'b***00111111111)
begin
begin
if(odata0 == 4'b1001)
begin
odata0 <= 4'b0000;
if(odata1 == 4'b1001)
begin
odata1 <= 4'b0000;
if(odata2 == 4'b1001)
begin
odata2 <= 4'b0000;
if(odata3 == 4'b1001)
begin
odata3 <= 4'b0000;
if(odata4 == 4'b1001)
begin
odata4 <= 4'b0000;
if(odata5 == 4'b1001)
begin
odata5 <= 4'b0000;
if(odata6 == 4'b1001)
begin
odata6 <= 4'b0000;
if(odata7 == 4'b1001)
begin
odata7 <= 4'b0000;
end
else
begin
odata7 <= odata7 + 1;
end
end
else
begin
odata6 <= odata6 + 1;
end
end
else
begin
odata5 <= odata5 + 1;
end
end
else
begin
odata4 <= odata4 + 1;
end
end
else
begin
odata3 <= odata3 + 1;
end
end
else
begin
odata2 <= odata2 + 1;
end
end
else
begin
odata1 <= odata1 + 1;
end
end
else
begin
odata0 <= odata0 + 1;
end
end
end
//碼制轉換
always @(posedge clk)
begin
if(yimiao == 26'b***00111110110)
begin
data7 <= {4'b0011, odata7};
//將二進制BCD碼轉換成ASCII碼,即1602可以顯示的碼值
data6 <= {4'b0011, odata6};
data5 <= {4'b0011, odata5};
data4 <= {4'b0011, odata4};
data3 <= {4'b0011, odata3};
data2 <= {4'b0011, odata2};
data1 <= {4'b0011, odata1};
data0 <= {4'b0011, odata0};
end
end
//時鐘分頻
always @(posedge clk)
begin
if(clkcnt == divcnt)
begin
clkcnt <= 20'b***00000;
end
else
begin
clkcnt <= clkcnt + 1;
end
end
assign tc_clkcnt =(clkcnt == divcnt)? 1'b1 : 1'b0;//tc_clkcnt 0.016s產生一次脈沖
always @(posedge tc_clkcnt)
begin
clkdiv <= ~clkdiv;
0.032s
end
always @(posedge clkdiv)
begin
clk_int <= ~clk_int;
end
//顯示界面設置
always @(negedge clkdiv)
begin
lcd_en <= ~lcd_en;
end
always @(char_addr)
begin
case(char_addr)
6'b000000 : //I
//clkdiv 0.016s翻轉一次,周期為
//clk_int 0.032s翻轉一次,周期為0.064s
begin
data_in <= 8'b01001001;
end
6'b000001 ://n
begin
data_in <= 8'b01101110;
end
6'b000010 : //p
begin
data_in <= 8'b01110000;
end
6'b000011 :
//u
begin
data_in <= 8'b01110101;
end
6'b000100 :
//t
begin
data_in <= 8'b01110100;
end
6'b000101 : //空格
begin
data_in <= 8'b00100000;
end
6'b000110 :
//F
begin
data_in <= 8'b01100110;
end
6'b000111 :
//r
begin
data_in <= 8'b01110010;
end
6'b001000 :
//e
begin
data_in <= 8'b01100101;
end
6'b001001 :
//q
begin
data_in <= 8'b01110001;
end
6'b001010 :
//u
begin
data_in <= 8'b01110101;
end
6'b001011 : //e
begin
data_in <= 8'b01100101;
end
6'b001100 : //n
begin
data_in <= 8'b01101110;
end
6'b001101 : //c
begin
data_in <= 8'b01100011;
end
6'b001110 : //y
begin
data_in <= 8'b01111001;
end
6'b001111 :
//空格
begin
data_in <= 8'b00100000;
end
6'b101000 :
//“=”
begin
data_in <= 8'b00111101;
end
6'b101001 :
//若為零則顯示空格
begin
if(data7 == 8'b00110000)
begin
data_in <= 8'b00100000;
end
else
begin
data_in <= data7;
end
end
6'b101010 : //若為零則顯示空格
begin
data_in <= data6;
if(data6 == 8'b00110000 & data7 == 8'b00110000)
begin
data_in <= 8'b00100000;
end
else
begin
data_in <= data6;
end
end
6'b101011 :
//若為零則顯示空格
begin
data_in <= data5;
if(data5 == 8'b00110000 & data6 == 8'b00110000 & data7 == 8'b00110000)
begin
data_in <= 8'b00100000;
end
else
begin
data_in <= data5;
end
end
6'b101100 : //若為零則顯示空格
begin
data_in <= data4;
if(data4 == 8'b00110000 & data5 == 8'b00110000 & data6 == 8'b00110000 & data7 == 8'b00110000)
begin
data_in <= 8'b00100000;
end
else
begin
data_in <= data4;
end
end
6'b101101 :
//若為零則顯示空格
begin
data_in <= data3;
if(data3 == 8'b00110000 & data4 == 8'b00110000 & data5 == 8'b00110000 & data6 == 8'b00110000 & data7 == 8'b00110000)
begin
data_in <= 8'b00100000;
end
else
begin
data_in <= data3;
end
end
6'b101110 :
//若為零則顯示空格
begin
data_in <= data2;
if(data2 == 8'b00110000 & data3 == 8'b00110000 & data4 == 8'b00110000 & data5 == 8'b00110000 & data6 == 8'b00110000 & data7 == 8'b00110000)
begin
data_in <= 8'b00100000;
end
else
begin
data_in <= data2;
end
end
6'b101111 :
//若為零則顯示空格
begin
data_in <= data1;
if(data1 == 8'b00110000 & data2 == 8'b00110000 & data3 == 8'b00110000 & data4 == 8'b00110000 & data5 == 8'b00110000 & data6 == 8'b00110000 & data7 == 8'b00110000)
begin
data_in <= 8'b00100000;
end
else
begin
data_in <= data1;
end
end
6'b110000 :
begin
data_in <= data0;
end
6'b110110 :
//H
begin
data_in <= 8'b01001000;
end
6'b110111 :
//z
begin
data_in <= 8'b01111010;
end
default :
begin
data_in <= 8'b00100000;
end
endcase
end
assign lcd_rs =(state == WRITERAM | state == READRAM)? 1'b1 : 1'b0;
assign lcd_rw =(state == CLEAR | state == RETURNCURSOR | state == SETMODE | state ==
SWITCHMODE | state == SHIFT | state == SETFUNCTION | state == SETCGRAM | state == SETDDRAM | state == WRITERAM)? 1'b0 : 1'b1;
assign lcd_d =(state == CLEAR)? 8'b00000001 :(state == RETURNCURSOR)? 8'b00000010 :(state == SETMODE)? {6'b000001, cur_inc, cur_noshift} :(state == SWITCHMODE)? {5'b00001, open_display, open_cur, blank_cur} :(state == SHIFT)? {4'b0001, shift_display, left_shift, 2'b00} :(state == SETFUNCTION)? {3'b001, datawidth8, twoline, font5x10, 2'b00} :(state == SETCGRAM)? 8'b01000000 :(state == SETDDRAM & counter == 0)? 8'b10000000 :(state == SETDDRAM & counter!= 0)? 8'b11000000 :(state == WRITERAM)? data_in : 8'bZZZZZZZZ;
//時序進程
always @(posedge clk_int or posedge rst)
begin
if(rst)
begin
state <= IDLE;
counter <= 0;
div_counter <= 0;
flag <= 1'b0;
char_addr <= 6'b000000;
end
else
case(state)
IDLE :
begin
if(flag == 1'b0)
begin
state <= SETFUNCTION;
flag <= 1'b1;
counter <= 0;
div_counter <= 0;
end
else
begin
if(div_counter < DIVSS)
begin
div_counter <= div_counter + 1;
state <= IDLE;
end
else
begin
div_counter <= 0;
state <= IDLE;
end
end
end
CLEAR :
begin
state <= SETMODE;
end
SETMODE :
begin
state <= WRITERAM;
end
RETURNCURSOR :
begin
state <= WRITERAM;
end
SWITCHMODE :
begin
state <= CLEAR;
end
SHIFT :
begin
state <= IDLE;
end
SETFUNCTION :
begin
state <= SWITCHMODE;
end
SETCGRAM :
begin
state <= IDLE;
end
SETDDRAM :
begin
state <= WRITERAM;
end
READFLAG :
begin
state <= IDLE;
end
WRITERAM :
//可用來修改,實現1602的輸出顯示
begin
if((counter >= 6'd0 & counter <= 6'd14)|(counter >= 6'd40 & counter <= 6'd54))
begin
state <= WRITERAM;
//一行同時只能顯示16個字符,第二行的首地址為40
char_addr <= char_addr + 1;
counter <= counter + 1;
end
else if(counter > 6'd14)
//換到第二行顯示
begin
state <= SETDDRAM;
counter <= 6'd40;
char_addr <= 6'b101000;
end
else
begin
state <= SHIFT;
state <= READRAM;
end
end
READRAM :
begin
state <= IDLE;
end
default :
begin
state <= IDLE;
end
endcase
end endmodule
第三篇:課程設計----數字頻率計
電子課程設計報告
設計課題: 數字頻率計 作 者:
李成贊≦
專 業: 08信息工程 班 級:(2)班
學 號: 3081231201 日 期 2009年6月5日——2009年6月17日
指導教師: 廖 東 進
設計小組其他成員:葉昕瑜 史海鑌 陳福青 姚閩 梁芳芳
衢州職業技術學院信息與電力工程系
前 言
一、頻率計的基本原理:
頻率計又稱為頻率計數器,是一種專門對被測信號頻率進行測量的電子測量儀器。其最基本的工作原理為:當被測信號在特定時間段T內的周期個數為N時,則被測信號的頻率f=N/T。
頻率計主要由四個部分構成:時基(T)電路、輸入電路、計數顯示電路以及控制電路。在一個測量周期過程中,被測周期信號在輸入電路中經過放大、整形、微分操作之后形成特定周期的窄脈沖,送到主門的一個輸入端。主門的另外一個輸入端為時基電路產生電路產生的閘門脈沖。在閘門脈沖開啟主門的期間,特定周期的窄脈沖才能通過主門,從而進入計數器進行計數,計數器的顯示電路則用來顯示被測信號的頻率值,內部控制電路則用來完成各種測量功能之間的切換并實現測量設置。
二、頻率計的應用范圍:
在傳統的電子測量儀器中,示波器在進行頻率測量時測量精度較低,誤差較大。頻譜儀可以準確的測量頻率并顯示被測信號的頻譜,但測量速度較慢,無法實時快速的跟蹤捕捉到被測信號頻率的變化。正是由于頻率計能夠快速準確的捕捉到被測信號頻率的變化,因此,頻率計擁有非常廣泛的應用范圍。
在傳統的生產制造企業中,頻率計被廣泛的應用在產線的生產測試中。頻率計能夠快速的捕捉到晶體振蕩器輸出頻率的變化,用戶通過使用頻率計能夠迅速的發現有故障的晶振產品,確保產品質量。
在計量實驗室中,頻率計被用來對各種電子測量設備的本地振蕩器進行校準。在無線通訊測試中,頻率計既可以被用來對無線通訊基站的主時鐘進行校準,還可以被用來對無線電臺的跳頻信號和頻率調制信號進行分析。
目 錄
1、設計要求
數字頻率計
2、第一章 系統概述
3、第二章單元電路設計與分析 3.1 數字頻率計的基本原理 3.2 數字頻率的設計 3.2.1 放大整形電路
3.2.2 時基電路
3.2.3 邏輯控制電路 3.2.4 輸出實現器
4、第三章 總結設計
附錄A 系統電路原理圖
附錄B 元件清單
附錄C 參考文獻
設 計 要 求
電子課程設計報告格式:
每人必須寫出一份4000字以上設計總結報告,總結報告應包括以下內容:
題目名稱、前言、目錄、鳴謝、元器件明細表、附圖、參數文獻。
其中,前言應包含設計題目的主要內容、資料收集工作的簡介。正文參考格式如下:
第一章 系統概述
簡單介紹系統設計思路與總體解決的可行論證,各功能塊的劃分與組成,全面介紹總體工作或工作原理。
第二章 單元電路設計與分析
詳細介紹個單元電路的選擇、設計及工作原理分析,并介紹有關參數的計算及元件參數的選擇等。
第三章 總結
簡單介紹對設計題目的結論性意見,進一步完善或改進的意向性說明,總結設計課程的收獲與體會。
元器件明細表主要用于列出本次課程設計中所用到的全部元器件。
附圖要求用2#以上圖紙畫出總原理接線圖,參考文獻格式如下:
序號 作者名 書刊名 出版社 出版時間(刊號)
數字頻率計(設計要求):
數字頻率計是用來測量正弦信號、矩形信號等波形上工作頻率的儀器,其測量結果直接用十進制數字顯示。本題要求采用中、小規模集成芯片設計集成有下列功能的數字頻率測量計:
被測信號的頻率范圍為1Hz—100KHz,分成兩個頻段,即1—999Hz、1—100KHz,用三位數碼管顯示測量數據,測量誤差小于5%。
數字頻率計
第一章 系統概述
為了使計數器被測信號的頻率范圍為1—999Hz、,用三位數碼管顯示測量數據。
第二章 單元電路設計與分析
一、數字頻率計測頻率的基本原理
所謂頻率,就是周期性信號在單位時間(1s)內變化的次數。若在一定時間間隔T秒內測得 這個周期性信號的重復變化次數為N,則其頻率可表示為:
f=N/T
圖1——數字頻率計的組成框圖和波形圖
圖1是數字頻率計的組成框圖。被測信號v x 經放大整形電路變成計數器所要求的脈沖信號I,其頻率與被測信號的頻率f x 相同。時基電路提供標準時間基準信號II,其高電平持續時間t1=1 秒,當l秒信號來到時,閘門開通,被測脈沖信號通過閘門,計數器開始計數,直到l秒信號結束時閘門關閉,停止計數。若在閘門時間1s內計數器計得的脈沖個數為N,則被測信號頻率f 邏輯控制電路的作用有兩個:一是產生鎖存脈沖IV,使顯示器上的數x =NHz。字穩定;二是產生清“0”脈沖V,使計數器每次測量從零開始計數。
各信號之間的時序關系如圖1所示。
二、數字頻率計的電路設計
基本電路設計
數字頻率計的基本框圖如圖1所示,各部分作用如下。
①放大整形電路
圖2——放大整形電路圖
放大整形電路由晶體管3DG100與74LS00等組成,其中3DGl00組成放大器將輸入頻率。為f 三角波等進行放大,與非門74LS00構成施密特觸發器,它對放 x 的周期信號如正弦波、大器的輸出信號進行整形,使之成為矩形脈沖。
②時基電路
圖3——時基電路
時基電路的作用是產生一個標準時間信號(高電平持續時間為 1s),由定時器555構成的多諧振蕩器產生。若振蕩器的頻率 f0 1/(t1 t 2)0.8Hz,則振蕩器的輸出波形如圖1中的波形II所示,其中t1=1s,t2=0.25s。由公式t1=0.7(R1+R2)C和t2=0.7R2C,可計算出電阻R1、R2及電容C的值如圖。
③邏輯控制電路
圖4——邏輯控制電路
根據圖1所示波形,在計數信號II結束時產生鎖存信號IV,鎖存信號IV 結束時產生 清“0”信號 V。脈沖信號IV和V可由兩個單穩態觸發器74LS123產生,它們的脈沖寬度由電路的時間常數決定。
設所存信號IV和清“0”信號V的脈沖寬度tw相同,如果要求tw=0.02s,則得:
tw=0.45RextCext=0.02s
若取 Rext=10kΩ,則 Cext=tw/0.45Rext=4.4μ
F。
由74LS123的功能(見下表1)可得,當 1R 1B ?1 觸發脈沖從1A端輸入時,在觸D
發脈沖的負跳變作用下,輸出端1Q可獲得一負脈沖,其波形關系正好滿足圖1所示的波形IV和V的要求。手動復位開關S按下時,計數器清“0”。
表1——74LS123功芯片能表
④輸出實現器
圖5——頻率計算器
表2——74LS90的不同接線方法
鎖存器的作用是將計數器在1s結束時所計得的數進行鎖存,使顯示器上能穩定地顯示 此時計數器的值。如圖所示,1s計數時間結束時,邏輯控制電路發出鎖存信號IV,將此時計數器的值送譯碼顯示器,選用兩個8位鎖存器74L273可以完成上述功能。當時鎖存信號CP的正跳變來到時,鎖存器的輸出等于輸入,從而將計數器的輸出值送到鎖存器的輸出端。
高電平結束后,無論D為何值,輸出端的狀態仍保持原來的狀態不變,所以在計數期間內,計數器的輸出不會送到譯碼顯示器。
表3——74LS273功能表
表4——74LS4
第三章 結束語
①設計總結
簡易的數字頻率計基本完成,各Vcc接電源正極,各開關控制電路的各個部分。整個電路綜合使用了與門、非門、555定時器、顯示器、74LS48譯碼器、74LS273鎖存器、74LS90計數器等等的邏輯器件和施密特、可重觸發器等模擬電子器件。
②設計心得、體會
本次課程設計由李成贊同學總設計,在廖東進老師輔導下順利完成啦。通過本次的課程設計,加深了我對數字電子技術模擬電子兩門課程的理解,強化了我對相關知識的記憶,提高了我對所學知識的應用。這極大擴展了我的視野,更加激發了我對這門課程的熱愛,在設計的過程中,由于綜合應用了各種學習、應用軟件,例如:word、auto CAD、Multisim等,不但體改了技能,還能從中獲得了成就感。通過這次設計,我完全知道了團隊合作的所帶來的快樂,集體的力量的強大性!我定位了我自己,發現自己的優勢和不足,并且勉勵自己不斷進步,并對未來充滿信心。
再此感謝給與指導的廖東進老師、李培江老師、黃云龍老師的指導。對本課程設計的的大力支持。
附錄A
:
系
統
電
路
原
理
附錄B:元件清單
附錄C:參考文獻
第四篇:數字頻率計設計
數字頻率計設計 1.設計任務
設計一簡易數字頻率計,其基本要求是:
1)測量頻率范圍1Hz~10Hz,量程分為4檔,即×1,×10,×100,×1000。2)頻率測量準確度?fx??2?10?3.fx3)被測信號可以是下弦波、三角波和方波。4)顯示方式為4位十進制數顯示。5)使用EWB進行仿真。2.設計原理及方案
頻率的定義是單位時間(1s)內周期信號的變化次數。若在一定時間間隔T內測得周期信號的重復變化次數為N,則其頻率為
f=N/T 據此,設計方案框圖如圖1所示。
圖1 數字頻率計組成框圖
其基本原理是,被測信號ux首先經整形電路變成計數器所要求的脈沖信號,頻率與被測信號的頻率fx相同。時鐘電路產生時間基準信號,分頻后控制計數與保持狀態。當其高電平時,計數器計數;低電平時,計數器處于保持狀態,數據送入鎖存器進行鎖存顯示。然后對計數器清零,準備下一次計數。其波形邏輯關系圖如圖2所示。3.基本電路設計 1)整形電路
整形電路是將待測信號整形變成計數器所要求的脈沖信號。電路形式采用由555定時器所構成的施密特觸發器,電路如圖XXX所示。若待測信號為三角波,輸入整形電路,設置分析為瞬態分析,啟動電路,其輸入、輸出波形如圖XXX所示。可見輸出為方波,二者頻率相同。
2)時鐘產生電路
時鐘信號是控制計數器計數的標準時間信號,其精度很大程度上決定了頻率計的頻率測量精度。當要求頻率測量精度較高時,應使用晶體振蕩器通過分頻獲得。在此頻率計中,時鐘信號采用555定時器構成的多諧振蕩器電路,產生頻率為1Kz的信號,然后再進行分頻。多諧振蕩器電路如圖XXX所示。由555定時器構成多諧振蕩器的周期計算公式為
XXXXXXXXXX 取XXXXXXXXXXXXXX,則得到振蕩頻率為1Kz的負脈沖,其振蕩波形如圖XXX所示。3)分頻器電路
采用計數器構成分頻電路,對1Kz的時鐘脈沖進行分頻,取得不同量程所需要的時間基準信號,實現量程控制。1Kz的時鐘脈沖,對其進行3次10分頻,每個10分頻器的輸出信號頻率分別為100Hz,10Hz,1Hz三種時間基準信號。對應于以1Kz,100Hz,10Hz,1Hz的信號作為時間基準信號時,相應的量程為×1000,×100,×10,×1。
構成10分頻帶電路是采用十進制計數器74LS160實現的。具體電路及其輸入、輸出波形如圖XXX所示。
(1)T觸發器
T觸發器電路是用來將分頻帶器輸出阻抗的窄脈沖整形為方波,因為計數器需要用方波來控制其計數/保持狀態的切換。整形后方波的頻率為頻器輸出信號頻率的一半,則對應于1Kz,100Kz,10Kz,1Hz的信號,T觸發器輸出信號的高電平持續時間分別為0.001s,0.01s,0.1s,1s。T觸發器采用JK觸發器7473為實現,其電路連接圖及其輸入、輸出波形如圖XXX所示。
(2)單穩觸發器
單穩觸發器用于產生一窄脈沖,以觸發鎖存器,使計數器在計數完畢后更新鎖存器數值。單穩觸發器電路采用555定時器實現,為了保證系統正常工作,單穩電路產生的脈沖寬度不能大于該量程分頻帶器輸出信號的周期。例如,計數器的最大量程是×1000,對應分頻帶器輸出的時間基準信號頻率為1000Hz,周期是1ms。取單穩電路輸出脈沖寬度TW=0.1ms。根據TW=1.1RC,取C=0.01Uf,則R=9.8KΩ,取標稱什為10KΩ。單穩觸發器輸入信號是T觸發器輸出信號經Rd、Cd組成的微分器將方波變成尖脈沖后加到555定時器的觸發器。電路圖及輸入、輸出波形如圖XXX所示。
(3)延遲反相器
延時反相器的功能是為了得到一個對計數器清零的信號。由于計數器清零是低電平有效,而且計數器清零必須在單穩觸發信號之后,故延遲反相器是在上述單穩電路之后,再加一級單穩觸發電路,且在其輸出端加反相器輸出。其輸入、輸出波形如圖XXX所示。(4)計數器
計數器在T觸發器輸出信號的控制下,對經過整形的待測信號進行脈沖計數,所得結果乘以量程即為待測信號頻率。
根據精度要求,采用4個十進制計數器級聯,構成N=1000計數器。十進制計數器仍采用74LS160實現。其電路圖如圖XXX所示。其中計數器的清零信號由延遲反相器提供,控制信號由T觸發器提供,計數器輸出結果送入鎖存器。
(5)鎖存器和顯示
計數器的結果進入鎖存器鎖存,4個七段數碼管顯示測試信號的頻率。鎖存器使用了兩片8D集成觸發器實現,其控制信號來自于延遲反相器,具體電路如圖XXX所示。
(6)數字頻率計的總體電路
圖XXX是數字頻率計的總體電路圖。
4.測試
搭建好以上電路以后,進行調試,首先分模塊進行調試,待每一個模塊調試正確后,不規則進行聯調。因為整個電路的分析是瞬態分析,故總體電路的分析需要較長時間。以上僅僅是學生所做綜合電路分析與設計的例子,由于EWB5.12教學版本庫元件的限制,有些電路與系統無法進行全部電路的仿真(例如收發信通信系統等),但有些局部電路也可以進行仿真,從而節省對這部分電路設計化費的時間。
第五篇:基于FPGA的簡易數字頻率計
EDA 簡易數字頻計 設計性實驗 2008112020327 ** 電子信息科學與技術
物電
電工電子中心2009年5月繪制
2008.6.10 湖北師范學院電工電子實驗教學省級示范中心電子版實驗報告
簡易數字頻率計設計
一.任務解析
通過對選擇題的分析,認為該簡易數字頻率計應該能達到以下要求: 1. 準確測出所給的方波信號的頻率(1HZ以上的信號)。2. 在顯示環節上,應能實現高位清零功能。3. 另外還有一個總的清零按鍵。
二.方案論證
本實驗中所做的頻率計的原理圖如上圖所示。即在一個1HZ時鐘信號的控制下,在每個時鐘的上升沿將計數器的數據送到緩沖器中保存起來,再送數碼管中顯示出來。
第2頁,共11頁 湖北師范學院電工電子實驗教學省級示范中心電子版實驗報告
在本實驗中,用到過幾中不同的方案,主要是在1HZ時鐘信號的選擇和計數器清零環節上:
1. 在實驗設計過程中,考濾到兩種1HZ時鐘信號其波形如下圖所
對于上術的兩種波形,可以調整各項參數來產生兩種1HZ時鐘信號。最后通過實驗的驗證發現第二種波形對于控制緩沖器獲得數據和控制計數器清零更易實現。并且,用第二種波形做為時鐘信號,可以在很短的高電平時間內對計數器清零,在低電平時間內讓計數器計數,從面提高測量的精度。而用第一種波形則不易實現這個過程。
2.在計數器的清零過程中,也有兩個方案,分別是能通過緩沖器反回一個清零信號,另一個是在時鐘的控制下進行清零。最終通過實驗發現,用時鐘進行清零更易實現。因為如果用緩沖器反回一個清零信號,有一個清零信號歸位問題,即當緩沖器反回一個低電平清零信號時,計數器實現清零,但不好控制讓緩器沖的清零信號又回到高電平,否則計數器就一直處于清零狀態面不能正常計數了。
三.實驗步驟
通過上分析后,實驗分為以下幾步:
1.1HZ時鐘信號的產生(產生該信號的模塊如下):
module ones(clk,clkout);input clk;output clkout;parameter parameter N=24000000;n=24;
第3頁,共11頁 湖北師范學院電工電子實驗教學省級示范中心電子版實驗報告
reg [n:0]cnt;reg clkout;
always @(posedge clk)begin if(cnt==N)else end endmodule begin cnt=0;
clkout=1;clkout=0;end
end begin cnt=cnt+1;最終產生的信號的波形:
2. 計數模塊。其主要公能是在每個被測信號的上升沿自動加一,并且有一個清零信號的輸入端,在1HZ時鐘信號的高電平時間里進行清零。模塊如下:
module count_99999999(sign,clr,b0,b1,b2,b3,b4,b5,b6,b7);input sign,clr;output [3:0]b0,b1,b2,b3,b4,b5,b6,b7;reg [3:0]b0,b1,b2,b3,b4,b5,b6,b7;always @(posedge sign or posedge clr)
if(clr)begin b0=0;b1=0;b2=0;b3=0;b4=0;b5=0;b6=0;b7=0;end else begin if(b0<9)b0=b0+1;else begin b0=0;if(b1<9)
第4頁,共11頁 湖北師范學院電工電子實驗教學省級示范中心電子版實驗報告
b1=b1+1;else begin b1=0;if(b2<9)b2=b2+1;else begin
b2=0;
if(b3<9)
b3=b3+1;
else begin
b3=0;
if(b4<9)
b4=b4+1;
else begin
b4=0;
if(b5<9)
b5=b5+1;
else begin
b5=0;
if(b6<9)
b6=b6+1;
else begin
b6=0;
if(b7<9)
b7=b7+1;
else b7=0;
第5頁,共11頁
湖北師范學院電工電子實驗教學省級示范中心電子版實驗報告
end
end
end
end
end
end end
end endmodule 如果要訪真該模塊,要設定較長的訪真時間,故在此不進行軟件訪真,只在實驗箱上進行實驗。
3. 數據緩沖模塊。在每個秒級門控信號的上升沿接收計數器的數據,并送到驅動八個數碼管的顯示模塊里。
module fre_count(clk,clr,b0,b1,b2,b3,b4,b5,b6,b7,a0,a1,a2,a3,a4,a5,a6,a7);input clk,clr;input [3:0]b0,b1,b2,b3,b4,b5,b6,b7;output [3:0]a0,a1,a2,a3,a4,a5,a6,a7;reg clro;reg [3:0]a0,a1,a2,a3,a4,a5,a6,a7;always @(posedge clk or negedge clr)//clk應該為1HZ的信號// begin if(!clr)
begin
a0<=0;a1<=0;a2<=0;a3<=0;a4<=0;a5<=0;a6<=0;a7<=0;end else
第6頁,共11頁 湖北師范學院電工電子實驗教學省級示范中心電子版實驗報告
end begin a0<=b0;a1<=b1;a2<=b2;a3<=b3;a4<=b4;a5<=b5;a6<=b6;a7<=b7;end endmodule 在此模塊中用了到了<=阻塞賦值的方式。
4.編寫控制高位清零的模塊,利用在掃描模塊中控制SEL的值來實現高位清零。即先從高位開始判斷,當只有個位有數據時,SEL只能等于0,當只有個位和十位有數據時,SEL要小于1,依此類推,實現高位清零功能。module scan(clk,a1,a2,a3,a4,a5,a6,a7,sel);input clk;input [3:0]a1,a2,a3,a4,a5,a6,a7;output [2:0]sel;reg [2:0]sel;always @(posedge clk)if({a1,a2,a3,a4,a5,a6,a7}==0000000)sel=0;else if({a2,a3,a4,a5,a6,a7}==000000)if(sel<1)sel=sel+1;else sel=0;else if({a3,a4,a5,a6,a7}==00000)if(sel<2)sel=sel+1;else sel=0;else if({a4,a5,a6,a7}==0000)if(sel<3)sel=sel+1;
第7頁,共11頁 湖北師范學院電工電子實驗教學省級示范中心電子版實驗報告
else sel=0;else if({a5,a6,a7}==000)if(sel<4)sel=sel+1;else sel=0;else if({a6,a7}==00)if(sel<5)sel=sel+1;else sel=0;else if({a7}==0)if(sel<6)sel=sel+1;else sel=0;else sel=sel+1;endmodule 5.上述三個模塊為本次實驗的主要模塊。除此,還用到了,譯碼,數據選擇器模塊。相應的模塊代碼省略。
6.所有模塊都寫完后,就是寫頂層文件。
module top(clk,clr,sig_in,a,b,c,d,e,f,g,dp,sel);input clk,clr,sig_in;output [2:0]sel;output a,b,c,d,e,f,g,dp;
wire clk1,clk2,clk3;wire [2:0]sel_sign;wire [3:0] QA,QB,QC,QD,QE,QF,QG,QH;wire [3:0] b0_o,b1_o,b2_o,b3_o,b4_o,b5_o,b6_o,b7_o;wire [3:0] org_data;
第8頁,共11頁 湖北師范學院電工電子實驗教學省級示范中心電子版實驗報告
assign sel=sel_sign;assign clk3=clk;
fre_count frequence(.clk(clk2),.clr(clr),.b0(b0_o),.b1(b1_o),.b2(b2_o),.b3(b3_o),.b4(b4_o),.b5(b5_o),.b6(b6_o),.b7(b7_o),.a0(QA),.a1(QB),count_99999999 mycounter(.sign(sig_in),.clr(clk2),.b0(b0_o),.b1(b1_o),.a2(QC),.a3(QD),.a4(QE),.a5(QF),.a6(QG),.a7(QH));.b2(b2_o),.b3(b3_o),.b4(b4_o),.b5(b5_o),.b6(b6_o),.b7(b7_o));
clk_div clksource(.clk(clk3),.clko1(clk1));
ones ones_con(.clk(clk3),.clkout(clk2));scan myscan(.clk(clk1),.a1(QB),.a2(QC),.a3(QD),.a4(QE),.a5(QF),.a6(QG),.a7(QF),.sel(sel_sign));mux81 mymux81(.sel(sel_sign),.a(QA),.b(QB),.c(QC),.d(QD),.e(QE),.f(QF),.g(QG),.h(QH),.out(org_data));
第9頁,共11頁 湖北師范學院電工電子實驗教學省級示范中心電子版實驗報告
decode3_8 decode(.org(org_data),.a(a),.b(b),.c(c),.d(d),.e(e),.f(f),.g(g),.dp(dp));
endmodule
7. 寫完了全部代碼后,就是器件選擇,分配引腳,下載程序,最后在實驗箱上進行實驗。
在實驗的驗證過程中,用到了DDS函數信號發生器,從其TTL輸出端輸出各種不同頻率的方波信號,接入接簡易頻率計的被測信號輸入端,在八個數碼管上顯示出相應的測量結果。
四.結果分析
在上述實驗過程中,我們選取了若干組不同的TTL輸出進行測量,發現當被測信號的頻率不小于1HZ時,簡易頻率計可以精確的測出被測信號的頻率。但是,當被測信號小于1HZ時,顯示的測量結果在0和1之間跳動,不穩定。分析簡易頻率計的結構可知,在如下圖所示波形關系中,當被測信號的頻率小于1HZ時,在秒級門控信號的一個周期內,計數器要么能計數一次,要么計數零次,因而不能準確的測出被測信號的頻率。
五.經驗總結
1.本實驗中的頻率計由于其在結構上存在缺限,因而在測量小于1HZ的信號時,會有較大的誤碼差,在測量頻率大于1HZ信號時,也可能存1HZ誤差,其原因在于如果在一個秒級門控信號的周期內,被測信號的上升沿的個數正好
第10頁,共11頁 湖北師范學院電工電子實驗教學省級示范中心電子版實驗報告
和其周數相同,則測量結果是準確的,如果上升沿的個數比周期數多一,則測量結果比實際值大一。
2.提高測量精度的另一個關鍵地方在所產生的秒級門控信號的精度。只有所產生的秒級門控信號的低電平時間長度為嚴格的一秒時,測量結果才會更精確。由于實驗箱上所使用的晶振不是嚴格等于24MHZ,因而可用示波器測出晶振的準確頻率后,再在parameter
N=24000000;語句中改變N的值。也可以在實驗中逐漸調整N的值,直到測量結果最精確為止。最終我們的實驗中,N的值取的是24000351。
3.對于高位清零功能的加入,正是儀器設計人性化的一個體現。如果沒有這個功能,再未顯示數據的數碼管也一直處于工作狀態,一則是對資源的亂費,二則是會減少器件的使用壽命。
第11頁,共11頁