第一篇:數字頻率計設計
數字頻率計設計 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教學版本庫元件的限制,有些電路與系統無法進行全部電路的仿真(例如收發信通信系統等),但有些局部電路也可以進行仿真,從而節省對這部分電路設計化費的時間。
第二篇:數字頻率計
//*********************************************************************
//* 標題: 簡易數字頻率計 //* 文件: 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
第三篇:數字頻率計實驗報告
數字電路與系統課程設計
大連理工大學城市學院
數字電路與系統課程設計
設計題目:數字頻率計
學 院:電子與自動化學院 專 業: 自動化 學 生: 揣智涵 同 組 人: 王曉寧 周英茹 指導教師: 于海霞 完成日期: 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版王振紅 主編機械工業出版社
數字電路與系統課程設計
第四篇:課程設計----數字頻率計
電子課程設計報告
設計課題: 數字頻率計 作 者:
李成贊≦
專 業: 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:參考文獻
第五篇:簡易數字頻率計設計報告
EDA技術基礎 簡易數字頻率計 必做實驗
電子信息科學與技術
物電學院
2011-06-24 湖北師范學院電工電子實驗教學省級示范中心電子版實驗報告
簡易數字頻率計
一.實驗要求
用Verilog硬件描述語言設計一個時序邏輯電路,能夠對輸入的TTL信號進行1s時長計數,將計數結果在數碼管上顯示,讓該電路循環運行,則數碼管顯示的就是輸入信號的頻率。
用標準DDS信號發生器輸入TTL信號,測試信號的頻率與DDS輸出設定的頻率比較,分析誤差以及誤差產生的原因。
顯示效果好,無閃爍,高位零不顯示。
二.方案原理圖
總體框圖:
三、主要部分原理說明及實驗步驟
根據原理圖,先把計數器模塊、顯示模塊、掃描模塊分別做出。對于計數器模塊因為要實現00000000~99999999的計數器,所以要用32bit,即要用
32第2頁,共8頁 湖北師范學院電工電子實驗教學省級示范中心電子版實驗報告
個D觸發器。從而要用8個數碼管進行循環掃描顯示。對于1HZ的精密脈沖在低電平時,一方面和被測脈沖通過或門,當被測脈沖為高電平時門電路開啟,另一方面通過一個非門把計數器的清零端置1,計數器正常工作開始計數。高電平時對計數器清零的同時,把測得的數據送入BUFFER中進行顯示鎖存。數碼管的掃描時鐘由外部提供。在此基礎上把前面的0清除。
1、我在該設計中使用了一個或門作為門控電路,當輸入時鐘clka為低電平時,被測信號clk通過,當輸入時鐘clka為高電平時,被測信號被阻止。從clka端輸入的是一個24M的脈沖,經過1HZ模塊處理后生成一秒赫茲信號(如下圖)
由這個信號來控制99999999計數器的清零和buffer中數據的更新以及被測信號的通過與阻止
其verilog語言代碼如下 module clk_1hz(clk,clked);input clk;output clked;reg clked;reg[31:0]jishu;always @(posedge clk)begin if(jishu==24000000)begin jishu=0;clked=1;end else begin jishu=jishu+1;clked=0;end end endmodule
2、門控電路部分
其verilog語言代碼如下
第3頁,共8頁 湖北師范學院電工電子實驗教學省級示范中心電子版實驗報告
module mynot(clk_1hz,nclk_1hz);input clk_1hz;output nclk_1hz;assign nclk_1hz=!clk_1hz;endmodule
99999999計數器計數在到達1S的瞬間,1HZ時鐘出現上升沿,控制緩存器將此時的計數值鎖存起來,然后送出顯示。很短一段時間后,1HZ時鐘恢復低電平,在這很短的時間內1HZ時鐘經非門也完成了計數器的清零,之后計數器又恢復計數狀態,進入下一秒的計數。
其verilog語言代碼如下 module mynot(clk_1hz,nclk_1hz);input clk_1hz;output nclk_1hz;assign nclk_1hz=!clk_1hz;endmodule
3、計數模塊
第4頁,共8頁 湖北師范學院電工電子實驗教學省級示范中心電子版實驗報告
99999999計數器是本次實驗的關鍵所在,它的主要功能是:在1hz精密時鐘和門控電路的控制下,在1s的時間內,對輸入信號進行計數,1s后,由于門控電路的存在,計數器停止計數 其verilog語言代碼如下 module cnt99999999(clr,clk,q);input clr,clk;output [31:0]q;reg [31:0]q;always @(posedge clk or negedge clr)begin if(!clr)q[31:0]=0;else if(q[31:0]==31'H99999999)q[31:0]=q[31:0]+32'H66666667;else if(q[27:0]==27'H9999999)q[31:0]=q[31:0]+28'H6666667;else if(q[23:0]==24'H999999)
q[31:0]=q[31:0]+24'H666667;else if(q[19:0]==20'H99999)
q[31:0]=q[31:0]+20'H66667;else if(q[15:0]==16'H9999)
q[31:0]=q[31:0]+16'H6667;else if(q[11:0]==12'H999)
q[31:0]=q[31:0]+12'H667;else if(q[ 7:0]== 8'H99)
q[31:0]=q[31:0]+8'H67;else if(q[ 3:0]== 4'H9)
q[31:0]=q[31:0]+4'H7;else q[31:0]=q[31:0]+1;end endmodule
4、顯示數據緩沖buffer的設計
數據緩沖buffer的功能是當用計數器對輸入信號計數,這些數據都暫時存在這個里面,每當時鐘的上升沿到來的時候,它就向后面的模塊輸送數據,這樣就可以得到相對穩定的顯示。
第5頁,共8頁 湖北師范學院電工電子實驗教學省級示范中心電子版實驗報告
其verilog語言代碼如下
module buff(in,clk,n1,n2,n3,n4,n5,n6,n7,n8);input clk;input [31:0]in;output [3:0]n1,n2,n3,n4,n5,n6,n7,n8;reg [3:0]n1,n2,n3,n4,n5,n6,n7,n8;
always @(posedge clk)begin begin n1=in[3:0];n2=in[7:4];n3=in[11:8];n4=in[15:12];n5=in[19:16];n6=in[23:20];n7=in[27:24];n8=in[31:28];end end endmodule
5、顯示部分
由于要用到8個數碼管對實驗結果進行顯示,我們可以設計一個譯碼模塊:
其verilog語言代碼如下 module yima(in,a,b,c,d,e,f,g,dp);input
[3:0]in;output a,b,c,d,e,f,g,dp;reg
a,b,c,d,e,f,g,dp;always @(in)begin case(in)
第6頁,共8頁 湖北師范學院電工電子實驗教學省級示范中心電子版實驗報告
4'b0000:{dp,g,f,e,d,c,b,a}=8'b00111111;4'b0001:{dp,g,f,e,d,c,b,a}=8'b00000110;4'b0010:{dp,g,f,e,d,c,b,a}=8'b01011011;4'b0011:{dp,g,f,e,d,c,b,a}=8'b01001111;4'b0100:{dp,g,f,e,d,c,b,a}=8'b01100110;4'b0101:{dp,g,f,e,d,c,b,a}=8'b01101101;4'b0110:{dp,g,f,e,d,c,b,a}=8'b01111101;4'b0111:{dp,g,f,e,d,c,b,a}=8'b00000111;4'b1000:{dp,g,f,e,d,c,b,a}=8'b01111111;4'b1001:{dp,g,f,e,d,c,b,a}=8'b01101111;default:{dp,g,f,e,d,c,b,a}=8'b01000000;endcase end endmodule 部分引腳功能的排列如下圖所示
數碼管的引腳排列 以上5部分就是頂層原理圖的主要部分
四、實驗總結
1、要用1HZ的精確時鐘不能直接接一個外接的信號源,這樣的誤差太大,只能將一個標準的24M的時鐘進行24分頻,才能的到相對穩定的時鐘信號。
2、數據緩沖部分不能少,如果沒有這部分,將得不到想要的結果,數碼管上會出現一排亂跳的數字。
3、在整個實驗設計過程中,我發現只要弄清楚所需要的幾個模塊,然后將模塊分開來進行生成,設計也并不是想象中的那么難。
第7頁,共8頁 湖北師范學院電工電子實驗教學省級示范中心電子版實驗報告
4、在此程序設計中,對各個模塊的功能有針對性的設計思路有了一定的提高,對于一個程序的需要哪些功能模塊,需要什么樣的輸入輸出,都比以前有了一定的提高。
5、學EDA已經有一學期了,現在對那些原理框圖并不陌生了,現在也可以寫一些簡單的代碼。我發現只要我們認真的去學習,虛心的的去請教他人,我們誰都可以把這門課學好。雖然在學習這門課以及做實驗的過程中,我們往往會遇到種種困難,但是當實驗結果與現象出來的那一剎那,我們就會感受那成功的快樂。
第8頁,共8頁