第一篇:數(shù)字頻率計(jì)
//*********************************************************************
//* 標(biāo)題: 簡(jiǎn)易數(shù)字頻率計(jì) //* 文件: topdesign.v
//* 作者: SJ&QJY
//* 日期: 2009.06.10 //* 修改: 2009.12.20
//* 軟件: Xilinx ISE 7.1 SP4
//* 芯片: Xilinx Spartan2 FPGA(XC2S200-pq208)
//* 說(shuō)明: 測(cè)頻率并用LCD顯示,從信號(hào)源接入一個(gè)信號(hào)(正弦波,三角波或者方波),經(jīng)過(guò)AD1轉(zhuǎn)換后,送入FPGA中。
//在FPGA中,使用雙值法整形,得到標(biāo)準(zhǔn)的方波,然后測(cè)出頻率,并送入1602中顯示。經(jīng)測(cè)試,其測(cè)頻誤差小于0.5%,其測(cè)頻范圍為10Hz-10MHz。
//********************************************************************* //* 注意: 輸入信號(hào)電壓峰峰值不要超過(guò)AD輸入范圍,即4V。
//*********************************************************************
//---------------module topdesign(clk, rst, lcd_rs, lcd_rw, lcd_en, lcd_d, ad1_clk, ad1_d);
input clk;
//時(shí)鐘信號(hào)40MHz input rst;
//全局復(fù)位信號(hào)
output lcd_rs;//LCD數(shù)據(jù)/命令選擇信號(hào),'1'表示數(shù)據(jù)輸入,'0'表示命令輸入
output lcd_rw;
//LCD讀/寫(xiě)信號(hào),'1'表示讀,'0'表示寫(xiě)
output reg lcd_en;
//LCD使能信號(hào),'1'有效
output[7:0] lcd_d;
//LCD數(shù)據(jù)總線(xiàn)(8位)
output ad1_clk;
//AD時(shí)鐘信號(hào)
input[11:0] ad1_d;
//AD9224,12位AD輸入
//LCD時(shí)序常量信號(hào)
parameter[10:0] IDLE = 11'b00000000000;
//初始化
parameter[10:0] CLEAR = 11'b00000000001;
//清屏
parameter[10:0] RETURNCURSOR = 11'b00000000010;//歸位
parameter[10:0] SETMODE = 11'b00000000100;
//設(shè)置輸入模式。此狀態(tài)為完成一個(gè)字符碼傳送后,AC自動(dòng)減1,顯示不發(fā)生移位
parameter[10:0] SWITCHMODE = 11'b00000001000;//顯示開(kāi)關(guān)控制
parameter[10:0] SHIFT = 11'b00000010000;//光標(biāo)或顯示移位
parameter[10:0] SETFUNCTION = 11'b00000100000;//功能設(shè)置:數(shù)據(jù)總線(xiàn)選8位還是4位
parameter[10:0] SETCGRAM = 11'b00001000000;//CGRAM的地址設(shè)置
parameter[10:0] SETDDRAM = 11'b00010000000;
//DDRAM地址設(shè)置
parameter[10:0] READFLAG = 11'b00100000000;//讀忙標(biāo)志BF和AC
parameter[10:0] WRITERAM = 11'b01000000000;
//寫(xiě)數(shù)據(jù)到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;
//時(shí)序信號(hào)
reg[5:0] counter;
reg[3:0] div_counter;
reg flag;
//輔助時(shí)序信號(hào)
parameter DIVSS = 4'd15;
reg[5:0] char_addr;
reg[7:0] data_in;
//延遲參量信號(hào)
reg clk_int;
reg[19:0] clkcnt;
parameter[19:0] divcnt = 20'b***00000;
reg clkdiv;
wire tc_clkcnt;
//測(cè)頻部分
parameter[15:0] ad_d_chankao1 = 16'b***1;
parameter[15:0] ad_d_chankao2 = 16'b***1;
reg[15:0] ad1_d_r;
//計(jì)數(shù)部分
reg[25:0] yimiao;
//用來(lái)計(jì)數(shù)
reg rukou;
//整形方波
reg[3:0] odata7;
//記錄數(shù)據(jù)
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;
//將記錄的數(shù)據(jù)轉(zhuǎn)換成ASCII碼,以便顯示
//數(shù)據(jù)清零信號(hào)
//主程序
assign ad1_clk = clk;
always @(posedge clk)
begin
yimiao_rst =(yimiao == 26'b***00111111111)? 1'b0 : 1'b1;//一秒時(shí)清零信號(hào)有效
end //測(cè)頻部分
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秒鐘測(cè)頻
always @(posedge clk)
//每1秒鐘循環(huán)一次
begin
if(yimiao == 26'b***01000000000)
yimiao <= 26'b***00000000000;
else
yimiao <= yimiao + 1;
end
//計(jì)數(shù)部分
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
//碼制轉(zhuǎn)換
always @(posedge clk)
begin
if(yimiao == 26'b***00111110110)
begin
data7 <= {4'b0011, odata7};
//將二進(jìn)制BCD碼轉(zhuǎn)換成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
//時(shí)鐘分頻
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產(chǎn)生一次脈沖
always @(posedge tc_clkcnt)
begin
clkdiv <= ~clkdiv;
0.032s
end
always @(posedge clkdiv)
begin
clk_int <= ~clk_int;
end
//顯示界面設(shè)置
always @(negedge clkdiv)
begin
lcd_en <= ~lcd_en;
end
always @(char_addr)
begin
case(char_addr)
6'b000000 : //I
//clkdiv 0.016s翻轉(zhuǎn)一次,周期為
//clk_int 0.032s翻轉(zhuǎn)一次,周期為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;
//時(shí)序進(jìn)程
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 :
//可用來(lái)修改,實(shí)現(xiàn)1602的輸出顯示
begin
if((counter >= 6'd0 & counter <= 6'd14)|(counter >= 6'd40 & counter <= 6'd54))
begin
state <= WRITERAM;
//一行同時(shí)只能顯示16個(gè)字符,第二行的首地址為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
第二篇:數(shù)字頻率計(jì)設(shè)計(jì)
數(shù)字頻率計(jì)設(shè)計(jì) 1.設(shè)計(jì)任務(wù)
設(shè)計(jì)一簡(jiǎn)易數(shù)字頻率計(jì),其基本要求是:
1)測(cè)量頻率范圍1Hz~10Hz,量程分為4檔,即×1,×10,×100,×1000。2)頻率測(cè)量準(zhǔn)確度?fx??2?10?3.fx3)被測(cè)信號(hào)可以是下弦波、三角波和方波。4)顯示方式為4位十進(jìn)制數(shù)顯示。5)使用EWB進(jìn)行仿真。2.設(shè)計(jì)原理及方案
頻率的定義是單位時(shí)間(1s)內(nèi)周期信號(hào)的變化次數(shù)。若在一定時(shí)間間隔T內(nèi)測(cè)得周期信號(hào)的重復(fù)變化次數(shù)為N,則其頻率為
f=N/T 據(jù)此,設(shè)計(jì)方案框圖如圖1所示。
圖1 數(shù)字頻率計(jì)組成框圖
其基本原理是,被測(cè)信號(hào)ux首先經(jīng)整形電路變成計(jì)數(shù)器所要求的脈沖信號(hào),頻率與被測(cè)信號(hào)的頻率fx相同。時(shí)鐘電路產(chǎn)生時(shí)間基準(zhǔn)信號(hào),分頻后控制計(jì)數(shù)與保持狀態(tài)。當(dāng)其高電平時(shí),計(jì)數(shù)器計(jì)數(shù);低電平時(shí),計(jì)數(shù)器處于保持狀態(tài),數(shù)據(jù)送入鎖存器進(jìn)行鎖存顯示。然后對(duì)計(jì)數(shù)器清零,準(zhǔn)備下一次計(jì)數(shù)。其波形邏輯關(guān)系圖如圖2所示。3.基本電路設(shè)計(jì) 1)整形電路
整形電路是將待測(cè)信號(hào)整形變成計(jì)數(shù)器所要求的脈沖信號(hào)。電路形式采用由555定時(shí)器所構(gòu)成的施密特觸發(fā)器,電路如圖XXX所示。若待測(cè)信號(hào)為三角波,輸入整形電路,設(shè)置分析為瞬態(tài)分析,啟動(dòng)電路,其輸入、輸出波形如圖XXX所示。可見(jiàn)輸出為方波,二者頻率相同。
2)時(shí)鐘產(chǎn)生電路
時(shí)鐘信號(hào)是控制計(jì)數(shù)器計(jì)數(shù)的標(biāo)準(zhǔn)時(shí)間信號(hào),其精度很大程度上決定了頻率計(jì)的頻率測(cè)量精度。當(dāng)要求頻率測(cè)量精度較高時(shí),應(yīng)使用晶體振蕩器通過(guò)分頻獲得。在此頻率計(jì)中,時(shí)鐘信號(hào)采用555定時(shí)器構(gòu)成的多諧振蕩器電路,產(chǎn)生頻率為1Kz的信號(hào),然后再進(jìn)行分頻。多諧振蕩器電路如圖XXX所示。由555定時(shí)器構(gòu)成多諧振蕩器的周期計(jì)算公式為
XXXXXXXXXX 取XXXXXXXXXXXXXX,則得到振蕩頻率為1Kz的負(fù)脈沖,其振蕩波形如圖XXX所示。3)分頻器電路
采用計(jì)數(shù)器構(gòu)成分頻電路,對(duì)1Kz的時(shí)鐘脈沖進(jìn)行分頻,取得不同量程所需要的時(shí)間基準(zhǔn)信號(hào),實(shí)現(xiàn)量程控制。1Kz的時(shí)鐘脈沖,對(duì)其進(jìn)行3次10分頻,每個(gè)10分頻器的輸出信號(hào)頻率分別為100Hz,10Hz,1Hz三種時(shí)間基準(zhǔn)信號(hào)。對(duì)應(yīng)于以1Kz,100Hz,10Hz,1Hz的信號(hào)作為時(shí)間基準(zhǔn)信號(hào)時(shí),相應(yīng)的量程為×1000,×100,×10,×1。
構(gòu)成10分頻帶電路是采用十進(jìn)制計(jì)數(shù)器74LS160實(shí)現(xiàn)的。具體電路及其輸入、輸出波形如圖XXX所示。
(1)T觸發(fā)器
T觸發(fā)器電路是用來(lái)將分頻帶器輸出阻抗的窄脈沖整形為方波,因?yàn)橛?jì)數(shù)器需要用方波來(lái)控制其計(jì)數(shù)/保持狀態(tài)的切換。整形后方波的頻率為頻器輸出信號(hào)頻率的一半,則對(duì)應(yīng)于1Kz,100Kz,10Kz,1Hz的信號(hào),T觸發(fā)器輸出信號(hào)的高電平持續(xù)時(shí)間分別為0.001s,0.01s,0.1s,1s。T觸發(fā)器采用JK觸發(fā)器7473為實(shí)現(xiàn),其電路連接圖及其輸入、輸出波形如圖XXX所示。
(2)單穩(wěn)觸發(fā)器
單穩(wěn)觸發(fā)器用于產(chǎn)生一窄脈沖,以觸發(fā)鎖存器,使計(jì)數(shù)器在計(jì)數(shù)完畢后更新鎖存器數(shù)值。單穩(wěn)觸發(fā)器電路采用555定時(shí)器實(shí)現(xiàn),為了保證系統(tǒng)正常工作,單穩(wěn)電路產(chǎn)生的脈沖寬度不能大于該量程分頻帶器輸出信號(hào)的周期。例如,計(jì)數(shù)器的最大量程是×1000,對(duì)應(yīng)分頻帶器輸出的時(shí)間基準(zhǔn)信號(hào)頻率為1000Hz,周期是1ms。取單穩(wěn)電路輸出脈沖寬度TW=0.1ms。根據(jù)TW=1.1RC,取C=0.01Uf,則R=9.8KΩ,取標(biāo)稱(chēng)什為10KΩ。單穩(wěn)觸發(fā)器輸入信號(hào)是T觸發(fā)器輸出信號(hào)經(jīng)Rd、Cd組成的微分器將方波變成尖脈沖后加到555定時(shí)器的觸發(fā)器。電路圖及輸入、輸出波形如圖XXX所示。
(3)延遲反相器
延時(shí)反相器的功能是為了得到一個(gè)對(duì)計(jì)數(shù)器清零的信號(hào)。由于計(jì)數(shù)器清零是低電平有效,而且計(jì)數(shù)器清零必須在單穩(wěn)觸發(fā)信號(hào)之后,故延遲反相器是在上述單穩(wěn)電路之后,再加一級(jí)單穩(wěn)觸發(fā)電路,且在其輸出端加反相器輸出。其輸入、輸出波形如圖XXX所示。(4)計(jì)數(shù)器
計(jì)數(shù)器在T觸發(fā)器輸出信號(hào)的控制下,對(duì)經(jīng)過(guò)整形的待測(cè)信號(hào)進(jìn)行脈沖計(jì)數(shù),所得結(jié)果乘以量程即為待測(cè)信號(hào)頻率。
根據(jù)精度要求,采用4個(gè)十進(jìn)制計(jì)數(shù)器級(jí)聯(lián),構(gòu)成N=1000計(jì)數(shù)器。十進(jìn)制計(jì)數(shù)器仍采用74LS160實(shí)現(xiàn)。其電路圖如圖XXX所示。其中計(jì)數(shù)器的清零信號(hào)由延遲反相器提供,控制信號(hào)由T觸發(fā)器提供,計(jì)數(shù)器輸出結(jié)果送入鎖存器。
(5)鎖存器和顯示
計(jì)數(shù)器的結(jié)果進(jìn)入鎖存器鎖存,4個(gè)七段數(shù)碼管顯示測(cè)試信號(hào)的頻率。鎖存器使用了兩片8D集成觸發(fā)器實(shí)現(xiàn),其控制信號(hào)來(lái)自于延遲反相器,具體電路如圖XXX所示。
(6)數(shù)字頻率計(jì)的總體電路
圖XXX是數(shù)字頻率計(jì)的總體電路圖。
4.測(cè)試
搭建好以上電路以后,進(jìn)行調(diào)試,首先分模塊進(jìn)行調(diào)試,待每一個(gè)模塊調(diào)試正確后,不規(guī)則進(jìn)行聯(lián)調(diào)。因?yàn)檎麄€(gè)電路的分析是瞬態(tài)分析,故總體電路的分析需要較長(zhǎng)時(shí)間。以上僅僅是學(xué)生所做綜合電路分析與設(shè)計(jì)的例子,由于EWB5.12教學(xué)版本庫(kù)元件的限制,有些電路與系統(tǒng)無(wú)法進(jìn)行全部電路的仿真(例如收發(fā)信通信系統(tǒng)等),但有些局部電路也可以進(jìn)行仿真,從而節(jié)省對(duì)這部分電路設(shè)計(jì)化費(fèi)的時(shí)間。
第三篇:數(shù)字頻率計(jì)實(shí)驗(yàn)報(bào)告
數(shù)字電路與系統(tǒng)課程設(shè)計(jì)
大連理工大學(xué)城市學(xué)院
數(shù)字電路與系統(tǒng)課程設(shè)計(jì)
設(shè)計(jì)題目:數(shù)字頻率計(jì)
學(xué) 院:電子與自動(dòng)化學(xué)院 專(zhuān) 業(yè): 自動(dòng)化 學(xué) 生: 揣智涵 同 組 人: 王曉寧 周英茹 指導(dǎo)教師: 于海霞 完成日期: 2012年3月26日
數(shù)字電路與系統(tǒng)課程設(shè)計(jì)
目 錄
第一章 設(shè)計(jì)任務(wù)
1.1項(xiàng)目名稱(chēng) 1.2項(xiàng)目設(shè)計(jì)說(shuō)明 1.2.1設(shè)計(jì)任務(wù)和要求 1.2.2進(jìn)度安排 1.3項(xiàng)目總體功能模塊圖
第二章 需求分析
2.1問(wèn)題基本描述
(要求分析得出整個(gè)系統(tǒng)流程圖)2.2系統(tǒng)模塊分解及各模塊功能的基本要求
第三章 設(shè)計(jì)原理
3.1 設(shè)計(jì)原理 3.2 MAXPLUSII介紹
第四章 系統(tǒng)功能模塊設(shè)計(jì)
4.1 FEN模塊
4.1.1 FEN模塊流程圖
4.1.2 輸入輸出引腳及其功能說(shuō)明 4.1.3 程序代碼實(shí)現(xiàn) 4.2 SEL模塊
4.2.1 SEL模塊流程圖
4.2.2輸入輸出引腳及其功能說(shuō)明 4.2.3程序代碼實(shí)現(xiàn)
數(shù)字電路與系統(tǒng)課程設(shè)計(jì)
4.3 CORNA模塊
4.3.1 CORNA模塊流程圖
4.3.2 輸入輸出引腳及其功能說(shuō)明 4.3.3 程序代碼實(shí)現(xiàn) 4.4 LOCK模塊
4.4.1 LOCK模塊流程圖
4.4.2 輸入輸出引腳及其功能說(shuō)明 4.4.3 程序代碼實(shí)現(xiàn) 4.5 CH模塊
4.5.1 輸入輸出引腳及其功能說(shuō)明 4.5.2 程序代碼實(shí)現(xiàn) 4.6 DISP模塊
4.6.1 輸入輸出引腳及其功能說(shuō)明 4.6.2 程序代碼實(shí)現(xiàn)
第五章調(diào)試并分析結(jié)果
5.1輸入說(shuō)明 5.2預(yù)計(jì)輸出 5.3測(cè)試結(jié)果記錄 5.4測(cè)試結(jié)果分析
第六章 結(jié)論 心得體會(huì) 參考文獻(xiàn)
數(shù)字電路與系統(tǒng)課程設(shè)計(jì)
第一章 設(shè)計(jì)任務(wù)
1.1 項(xiàng)目名稱(chēng):數(shù)字頻率計(jì) 1.2 項(xiàng)目設(shè)計(jì)說(shuō)明
1.2.1 設(shè)計(jì)任務(wù)和要求 此頻率計(jì)共分4檔: 一檔:0~9999Hz;二檔:10~99.99kHZ;三檔:100.0~999.9kHz;,四檔:1.000~999MHz;在換擋的設(shè)計(jì)方面,此程序突破了以往改變閘門(mén)時(shí)間的方法,使自動(dòng)換擋的實(shí)現(xiàn)更加簡(jiǎn)單可靠。1.2.2 進(jìn)度安排
第一節(jié)課:畫(huà)出模塊及程序流程圖
第二節(jié)課:調(diào)試各模塊程序使其無(wú)誤
第三節(jié)課:連接整個(gè)程序并下載到試驗(yàn)箱是數(shù)字頻率計(jì)的功能實(shí)現(xiàn)
第四節(jié)課:改進(jìn)程序設(shè)計(jì)實(shí)現(xiàn)創(chuàng)新,然后完成課程設(shè)計(jì)報(bào)告
第五節(jié)課:完成答辯 1.3 項(xiàng)目總體功能模塊圖如下
數(shù)字電路與系統(tǒng)課程設(shè)計(jì)
圖1-1
數(shù)字電路與系統(tǒng)課程設(shè)計(jì)
第二章 需求分析
2.1 問(wèn)題基本描述
所謂頻率,就是周期信號(hào)在單位時(shí)間(1秒)內(nèi)變化的次數(shù)。頻率計(jì)的測(cè)量范圍為1MHZ,為了測(cè)量精確量程分別為10KHZ,100KHZ,1000KHZ和1MHZ四個(gè)檔。即最大讀數(shù)分別為9.999KHZ,99.99KHZ,999.9KHZ,999MHZ。要求兩成自動(dòng)換擋。其具體功能如下:
(1)當(dāng)量程超過(guò)999時(shí),自動(dòng)增大一檔,下一次測(cè)量時(shí)量程大一檔;
(2)當(dāng)超過(guò)測(cè)量范圍時(shí),顯示溢出,報(bào)警器報(bào)警。(3)小數(shù)點(diǎn)位置隨量程變化自動(dòng)移位。
(4)采用記憶顯示方法,在測(cè)量過(guò)程中不顯示數(shù)據(jù),在測(cè)量完成以后顯示測(cè)頻結(jié)果,并將此結(jié)果 保存到下次測(cè)量結(jié)束,顯示時(shí)間不少于1秒。
(5)根據(jù)頻率計(jì)的測(cè)頻原理,可以選擇合適的時(shí)基信號(hào)即閥門(mén)時(shí)間,對(duì)輸入信號(hào)脈沖進(jìn)行計(jì)數(shù),實(shí)現(xiàn)測(cè)頻的目的。
(6)根據(jù)數(shù)字頻率計(jì)的設(shè)計(jì)原理,可以將數(shù)字頻率計(jì)設(shè)計(jì)分為五個(gè)模塊來(lái)實(shí)現(xiàn)其功能。即分頻模塊,控制模塊,計(jì)數(shù)模塊,鎖存模塊和顯示模塊。用CLDH語(yǔ)言進(jìn)行編程。
(7)弄清什么情況下是測(cè)頻率,就是選擇合適的時(shí)基信號(hào)的問(wèn)題。測(cè)頻率時(shí)以輸入信號(hào)作為時(shí)鐘信號(hào),因?yàn)檩斎胄盘?hào)的頻率大于頻率計(jì)的基準(zhǔn)頻率。:
數(shù)字電路與系統(tǒng)課程設(shè)計(jì)
數(shù)字頻率計(jì)的系統(tǒng)流程圖如下
圖2-1
數(shù)字電路與系統(tǒng)課程設(shè)計(jì)
2.2 系統(tǒng)模塊分解及各模塊功能的基本要求
計(jì)數(shù)器在各個(gè)檔是被反復(fù)應(yīng)用的,如果在各個(gè)檔分別設(shè)計(jì)計(jì)數(shù)器就造成資源的浪費(fèi),而且在測(cè)周期和頻率的時(shí)候,計(jì)數(shù)器的時(shí)基信號(hào)和輸入信號(hào)要進(jìn)行調(diào)換,但計(jì)數(shù)功能是一樣的,所以將計(jì)數(shù)器設(shè)為單獨(dú)的模塊。七段譯碼器也是被重復(fù)使用的,也設(shè)成單獨(dú)的模塊,這樣的話(huà)就不用在重復(fù)使用的時(shí)候重復(fù)書(shū)寫(xiě)譯碼電路了??傮w來(lái)說(shuō)數(shù)字頻率計(jì)分為五個(gè)模塊來(lái)設(shè)計(jì),即分頻模塊計(jì)數(shù) 模塊,鎖存模塊,預(yù)測(cè)控制信號(hào)發(fā)生器,顯示模塊。
分頻模塊為計(jì)數(shù)模塊提供1秒的閥門(mén)時(shí)間。計(jì)數(shù)模塊是整個(gè)程序的核心,它完成在1秒的時(shí)間里對(duì)被測(cè)信號(hào)計(jì)數(shù)的功能,并通過(guò)選擇輸出數(shù)據(jù)實(shí)現(xiàn)自動(dòng)換擋的功能。鎖存模塊在信號(hào)L的下降沿到來(lái)時(shí)將信號(hào)A4,A3,A2,A1鎖存。顯示模塊對(duì)應(yīng)于數(shù)碼管片選信號(hào),將相應(yīng)的數(shù)據(jù)送出,其中檔位也通過(guò)數(shù)碼管顯示。
數(shù)字電路與系統(tǒng)課程設(shè)計(jì)
第三章 設(shè)計(jì)原理
3.1 設(shè)計(jì)原理
眾所周知,頻率信號(hào)易于傳輸,抗干擾性強(qiáng),可以獲得較好的測(cè)量精度。因此,頻率檢測(cè)是電子測(cè)量領(lǐng)域最基本的測(cè)量之一。頻率計(jì)的基本原理是用一個(gè)頻率穩(wěn)定度高的頻率源作為基準(zhǔn)時(shí)鐘,對(duì)比測(cè)量其他信號(hào)的頻率。通常情況下計(jì)算每秒內(nèi)待測(cè)信號(hào)的脈沖個(gè)數(shù),即閘門(mén)時(shí)間為1 s。閘門(mén)時(shí)間可以根據(jù)需要取值,大于或小于1 s都可以。閘門(mén)時(shí)間越長(zhǎng),得到的頻率值就越準(zhǔn)確,但閘門(mén)時(shí)間越長(zhǎng),則每測(cè)一次頻率的間隔就越長(zhǎng)。閘門(mén)時(shí)間越短,測(cè)得的頻率值刷新就越快,但測(cè)得的頻率精度就受影響。一般取1 s作為閘門(mén)時(shí)間。
數(shù)字頻率計(jì)的關(guān)鍵組成部分包括測(cè)頻控制信號(hào)發(fā)生器、計(jì)數(shù)器、鎖存器、譯碼驅(qū)動(dòng)電路和顯示電路,其原理框圖如圖3-1所示。
圖3-1數(shù)字頻率計(jì)原理圖
3.2 MAXPLUSII介紹
MAX+PLUSⅡ(Multiple Array and Programming Logic User System)開(kāi)發(fā)工具是Altera公司推出的一種EDA工具,具有靈活高效、使用便捷和易學(xué)易用等特點(diǎn)。Altera公司在推出各種CPLD的同時(shí),也在不斷地升級(jí)相應(yīng)的開(kāi)發(fā)工具軟件,已從早起的第一代A+PLUS、第二代MAX+PLUS發(fā)展到第三代MAX+PLUSⅡ和第四代
數(shù)字電路與系統(tǒng)課程設(shè)計(jì)
Quartus。使用MAX+PLUSⅡ軟件,設(shè)計(jì)者無(wú)需精通器件內(nèi)部的復(fù)雜結(jié)構(gòu),只需用業(yè)已熟悉的設(shè)計(jì)輸入工具,如硬件描述語(yǔ)言、原理圖等進(jìn)行輸入即可,MAX+PLUSⅡ就會(huì)自動(dòng)將設(shè)計(jì)轉(zhuǎn)換成目標(biāo)文件下載到器件中去。MAX+PLUSⅡ開(kāi)發(fā)系統(tǒng)具有以下特點(diǎn)。(1)多平臺(tái)。MAX+PLUSⅡ軟件可以在基于PC機(jī)的操作系統(tǒng)如Windows95、Windows98、Windows2000、Windows NT下運(yùn)行,也可以在Sun SPAC station等工作站上運(yùn)行。
(2)開(kāi)放的界面。MAX+PLUSⅡ提供了與其他設(shè)計(jì)輸入、綜合和校驗(yàn)工具的接口,借口符合EDIF 200/300、LPM、VHDL、Verilog-HDL等標(biāo)準(zhǔn)。目前MAX+PLUSⅡ所支持的主流第三方EDA工具主要有Synopsys、Viewlogic、Mentor、Graphics、Cadence、OrCAD、Xilinx等公司提供的工具。
(3)模塊組合式工具軟件。MAX+PLUSⅡ具有一個(gè)完整的可編程邏輯設(shè)計(jì)環(huán)境,包括設(shè)計(jì)輸入、設(shè)計(jì)處理、設(shè)計(jì)校驗(yàn)和下載編程4個(gè)模塊,設(shè)計(jì)者可以按設(shè)計(jì)流程選擇工作模塊。(4)與結(jié)構(gòu)無(wú)關(guān)。MAX+PLUSⅡ開(kāi)發(fā)系統(tǒng)的核心——Compiler(編譯器)能夠自動(dòng)完成邏輯綜合和優(yōu)化,它支持Altera的Classic、MAX7000、FLEX8000和FLEX10K等可編程器件系列,提供一個(gè)與結(jié)構(gòu)無(wú)關(guān)的PLD開(kāi)發(fā)環(huán)境。
(5)支持硬件描述語(yǔ)言。MAX+PLUSⅡ支持各種HDL設(shè)計(jì)輸入語(yǔ)言,包括VHDL、Verilog-HDL和Altera的硬件描述語(yǔ)言AHDL。(6)豐富的設(shè)計(jì)庫(kù)。MAX+PLUSⅡ提供豐富的庫(kù)單元供設(shè)計(jì)者調(diào)用,其中包括一些基本的邏輯單元,74系列的器件和多種特定功能的宏功能模塊以及參數(shù)化的兆功能模塊。調(diào)用庫(kù)單元進(jìn)行設(shè)計(jì),可以大大減輕設(shè)計(jì)人員的工作量,縮短設(shè)計(jì)周期。
數(shù)字電路與系統(tǒng)課程設(shè)計(jì)
第四章 系統(tǒng)功能模塊
4.1 FEN 模塊
4.1.1 FEN 模塊流程圖
圖4-1
數(shù)字電路與系統(tǒng)課程設(shè)計(jì)
4.1.2輸入輸出引腳及其功能說(shuō)明
模塊FEN如圖9-87所示。通過(guò)對(duì)4MHz時(shí)鐘的分頻得到0.5Hz時(shí)鐘,為模塊CORNA提供1s的閘門(mén)時(shí)間。CLK:輸入時(shí)鐘信號(hào);Q:輸出分頻后的基準(zhǔn)信號(hào)。程序代碼的實(shí)現(xiàn)如下
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
數(shù)字電路與系統(tǒng)課程設(shè)計(jì)
4.2 SEL模塊
4.2.1 SEL 模塊流程圖
圖4-3 4.2.2 SEL模塊輸入輸出引腳及其功能說(shuō)明
CLK:基準(zhǔn)時(shí)鐘信號(hào); Q[2..0]:產(chǎn)生數(shù)碼管的片選信號(hào)。4.2.3 程序代碼實(shí)現(xiàn)
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;
數(shù)字電路與系統(tǒng)課程設(shè)計(jì)
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
數(shù)字電路與系統(tǒng)課程設(shè)計(jì)
4.3.2 輸入輸出引腳及其功能說(shuō)明
該模塊是整個(gè)程序的核心,它完成在1s的時(shí)間里對(duì)被測(cè)信號(hào)計(jì)數(shù)的功能,并通過(guò)選擇輸出數(shù)據(jù)實(shí)現(xiàn)自動(dòng)換擋的功能輸入輸出引腳及其功能說(shuō)明CLR:復(fù)位按鈕;SIG:待測(cè)頻率信號(hào);DOOR:基準(zhǔn)時(shí)鐘頻率;ALM:蜂鳴器;DANG[3..0]:檔位值;Q0~4[3..0]:計(jì)算后的頻率值。4.3.3程序代碼實(shí)現(xiàn)
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
數(shù)字電路與系統(tǒng)課程設(shè)計(jì)
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';
數(shù)字電路與系統(tǒng)課程設(shè)計(jì)
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;
數(shù)字電路與系統(tǒng)課程設(shè)計(jì)
4.4 模塊LOCK 4.4.1 LOCK 模塊流程圖
圖4-7 4.4.2 輸入輸出引腳及其功能說(shuō)明
該模塊實(shí)現(xiàn)鎖存器的功能,在信號(hào)L的下降沿到來(lái)時(shí)信號(hào)A4、A3、A2、A1鎖存。輸入輸出引腳及其功能說(shuō)明L:基準(zhǔn)時(shí)鐘信號(hào);A0~4[3..0]:接受計(jì)數(shù)器CORNA傳過(guò)來(lái)的值并鎖存;Q0~4[3..0]:向數(shù)據(jù)選擇器傳值。4.4.3 程序代碼實(shí)現(xiàn)
library ieee;use ieee.std_logic_1164.all;entity lock is
數(shù)字電路與系統(tǒng)課程設(shè)計(jì)
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 輸入輸出引腳及其功能說(shuō)明
該模塊對(duì)應(yīng)于數(shù)碼管片選信號(hào),將相應(yīng)的數(shù)據(jù)送出,其中檔位也通過(guò)數(shù)碼管顯示。輸入輸出引腳及其功能說(shuō)明SEL[2..0]:接受SEL模塊傳來(lái)的數(shù)碼管片選信號(hào);A[3..0]:接受鎖存器傳來(lái)的數(shù)碼管片選信號(hào);DANG[3..0]:接受鎖存器傳來(lái)的檔位信號(hào);Q[3..0]:傳出數(shù)碼管位選信號(hào)。4.5.2 程序代碼實(shí)現(xiàn)
library ieee;
數(shù)字電路與系統(tǒng)課程設(shè)計(jì)
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輸入輸出引腳及其功能說(shuō)明
D[3..0]:接受CH傳出的數(shù)碼管位選信號(hào);Q[6..0]:譯碼出數(shù)碼管位選信號(hào); 4.6.2程序代碼實(shí)現(xiàn)
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;
數(shù)字電路與系統(tǒng)課程設(shè)計(jì)
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;
數(shù)字電路與系統(tǒng)課程設(shè)計(jì)
第五章
5.1輸入說(shuō)明
調(diào)試并分析結(jié)果
SIG:接1KHz頻率;CLR:接開(kāi)關(guān);CLK:接4MHz頻率。
5.2預(yù)計(jì)輸出
低兩位數(shù)碼管顯示‘1’;高四位數(shù)碼管顯示‘1000’。
5.3 測(cè)試結(jié)果記錄
低兩位數(shù)碼管顯示‘1’;高四位數(shù)碼管顯示‘1000’。
5.4 測(cè)試結(jié)果分析
本頻率計(jì)滿(mǎn)足試驗(yàn)要求,使用周期和直接測(cè)量法進(jìn)行測(cè)量,這樣會(huì)減小誤差。實(shí)驗(yàn)中也遇到了很多問(wèn)題,在器件在線(xiàn)編程過(guò)程中,program各項(xiàng)操作無(wú)法進(jìn)行,如果是首次編程,則需要設(shè)置下載端口,如果還比能進(jìn)行操作,可能是芯片或者試驗(yàn)箱出現(xiàn)問(wèn)題,所以應(yīng)該換芯片或試驗(yàn)箱。在連接引腳是要特別注意,否則顯示管無(wú)法顯示。此外此試驗(yàn)還有需要改進(jìn)的地方,比如測(cè)量頻率的精度和靈敏度。
待測(cè)信號(hào)給的是1KHz,數(shù)碼管檔位顯示為一檔(0~9999Hz);頻率顯示為‘1000’;與預(yù)計(jì)輸出完全一樣。因?yàn)榛鶞?zhǔn)信號(hào)和待測(cè)信號(hào)是同一個(gè)信號(hào)源,故如此準(zhǔn)確。也論證了上述設(shè)計(jì)的正確性。
數(shù)字電路與系統(tǒng)課程設(shè)計(jì)
圖5-1 如上圖,待測(cè)信號(hào)sig 10KHz,clk接1MHz顯示如圖,第一行和第二行為脈沖頻率,第三行為檔位,10KHz的待測(cè)信號(hào)檔位為二檔。
數(shù)字電路與系統(tǒng)課程設(shè)計(jì)
第六章 結(jié)論
心得體會(huì)
經(jīng)過(guò)這次的實(shí)驗(yàn)課程設(shè)計(jì),我學(xué)到了如何將多個(gè)程序綁在一起使用并構(gòu)成一個(gè)完整的系統(tǒng)。在老師的指導(dǎo)下、在我們實(shí)驗(yàn)設(shè)計(jì)小組的共同努力下、在其他同學(xué)的熱情幫助下,我們完整滴完成了《數(shù)字頻率計(jì)》的設(shè)計(jì)、組裝,并做了些創(chuàng)新。
雖然實(shí)驗(yàn)成功,我們同樣在實(shí)驗(yàn)過(guò)程中遇到了一些問(wèn)題: 1.剛開(kāi)始時(shí)候的設(shè)計(jì)是每組組員做一部分,但是問(wèn)題就是有些系數(shù)不能同一。因此造成了一開(kāi)始實(shí)驗(yàn)進(jìn)展緩慢。2.在實(shí)驗(yàn)過(guò)程中,器材的問(wèn)題也被我們遇到了。因此也得到了些經(jīng)驗(yàn):要對(duì)自己的實(shí)驗(yàn)成果由信心,不要一出問(wèn)題就從程序中找問(wèn)題??赡軐?duì)你最大的阻礙就是你沒(méi)有考慮到的器材問(wèn)題。
3.在最后仿真時(shí)候,導(dǎo)線(xiàn)的順序也是常出問(wèn)題的地方。由于沒(méi)有及時(shí)發(fā)現(xiàn)問(wèn)題的所在,我們小組花費(fèi)了整整一節(jié)課的時(shí)間在改程序,浪費(fèi)了許多寶貴時(shí)間。
參考文獻(xiàn)
【1】VHDL數(shù)字電路設(shè)計(jì)與應(yīng)用與實(shí)踐教程 【2】第2版王振紅 主編機(jī)械工業(yè)出版社
數(shù)字電路與系統(tǒng)課程設(shè)計(jì)
第四篇:簡(jiǎn)易數(shù)字頻率計(jì)(數(shù)字電路課程設(shè)計(jì))
數(shù)字電路課程設(shè)計(jì)報(bào)告
1)設(shè)計(jì)題目
簡(jiǎn)易數(shù)字頻率計(jì)
2)設(shè)計(jì)任務(wù)和要求
要求設(shè)計(jì)一個(gè)簡(jiǎn)易的數(shù)字頻率計(jì),測(cè)量給定信號(hào)的頻率,并用十進(jìn)制數(shù)字顯示,具體指標(biāo)為:
1)測(cè)量范圍:1HZ—9.999KHZ,閘門(mén)時(shí)間1s;
HZ—99.99KHZ,閘門(mén)時(shí)間0.1s;
HZ—999.9KHZ,閘門(mén)時(shí)間10ms;
KHZ—9999KHZ,閘門(mén)時(shí)間1ms;
2)顯示方式:四位十進(jìn)制數(shù)
3)當(dāng)被測(cè)信號(hào)的頻率超出測(cè)量范圍時(shí),報(bào)警.3)原理電路和程序設(shè)計(jì):
(1)整體電路
數(shù)顯式頻率計(jì)電路
(2)單元電路設(shè)計(jì);
(a)時(shí)基電路
(b)放大邏輯電路
(c)計(jì)數(shù)、譯碼、驅(qū)動(dòng)電路
(3)說(shuō)明電路工作原理;
四位數(shù)字式頻率計(jì)是由一個(gè)CD4017(包含一個(gè)計(jì)數(shù)器和一個(gè)譯碼器)組成邏輯電路,一個(gè)555組成時(shí)基電路,一個(gè)9014形成放大電路,四個(gè)CD40110(在圖中是由四個(gè)74LS48、四個(gè)74LS194、四個(gè)74LS90組成)及數(shù)碼管組成。
兩個(gè)CD40110串聯(lián)成一個(gè)四位數(shù)的十進(jìn)制計(jì)數(shù)器,與非門(mén)U1A、U1B構(gòu)成計(jì)數(shù)脈沖輸入電路。當(dāng)被測(cè)信號(hào)從U1A輸入,經(jīng)過(guò)U1A、U1B兩級(jí)反相和整形后加至計(jì)數(shù)器U13的CP+,通過(guò)計(jì)數(shù)器的運(yùn)算轉(zhuǎn)換,將輸入脈沖數(shù)轉(zhuǎn)換為相應(yīng)的數(shù)碼顯示筆段,通過(guò)數(shù)碼管顯示出來(lái),范圍是1—9。當(dāng)輸入第十個(gè)脈沖,就通過(guò)CO輸入下一個(gè)CD40110的CP+,所以此四位計(jì)數(shù)器范圍為1—9999。
其中U1A與非門(mén)是一個(gè)能夠控制信號(hào)是否輸入的計(jì)數(shù)電路閘門(mén),當(dāng)一個(gè)輸入端輸入的時(shí)基信號(hào)為高電平的時(shí)候,閘門(mén)打開(kāi),信號(hào)能夠通過(guò);否則不能通過(guò)。
時(shí)基電路555與R2、R3,R4、C3組成低頻多諧振蕩器,產(chǎn)生1HZ的秒時(shí)基脈沖,作為閘門(mén)控制信號(hào)。計(jì)數(shù)公式:來(lái)確定。
與非門(mén)U2A與CD4017組成門(mén)控電路,在測(cè)量時(shí),當(dāng)時(shí)基電路輸出第一個(gè)時(shí)基脈沖并通過(guò)U2A反相后加至CD4017的CP,CD4017的2腳輸出高電平從而使得閘門(mén)打開(kāi)。1s后,時(shí)基電路送來(lái)第二個(gè)脈沖信號(hào),CD4017的2腳變?yōu)榈碗娖?,閘門(mén)關(guān)閉,測(cè)量結(jié)束。數(shù)碼管顯示即為所測(cè)頻率。當(dāng)555第三個(gè)脈沖送過(guò)來(lái)的時(shí)候,電路保持間歇1S,第四個(gè)脈沖后高電平加至R,使計(jì)數(shù)器復(fù)位。為下一次計(jì)算準(zhǔn)備。
(4)元件選擇。
資
料
元
件
標(biāo)號(hào)
封裝
數(shù)量
芯片
CD40110
GK7491AG
陶瓷熔扁平
CD4017
62F2X6KE4
陶瓷熔扁平
74LS00
陶瓷熔扁平
74LS10
陶瓷熔扁平
NE555
K104G4
雙列直插型號(hào)
顯示器
七段共陰數(shù)碼管
電阻
300Ω
1KΩ
5.1KΩ
10KΩ
100KΩ
1MΩ
10KΩ(滑動(dòng))
電容
1000PF
0.1μF
100μF
二極管
1N4148
發(fā)光LED
開(kāi)關(guān)
單刀雙擲
導(dǎo)線(xiàn)
導(dǎo)線(xiàn)
若干
三極管
9014
電源
12V直流電源
4)電路和程序調(diào)試過(guò)程與結(jié)果:
a)、設(shè)計(jì)邏輯流程:
b)、理論波形圖:
c)、仿真波形圖:
1)、時(shí)基電路
2)、未、已經(jīng)過(guò)施密特的波形:
d)、誤差分析:
本實(shí)驗(yàn)的誤差來(lái)自多方面的原因:一、時(shí)基電路NE555的滑動(dòng)變阻器調(diào)節(jié)導(dǎo)致誤差;二、閘門(mén)開(kāi)放時(shí)間與信號(hào)輸入時(shí)間的沖突導(dǎo)致測(cè)量不準(zhǔn)確;三、整體電路的阻抗、容抗對(duì)電路信號(hào)的影響。
對(duì)于第一點(diǎn),先計(jì)算相關(guān)的滑動(dòng)變阻器的相應(yīng)阻值大小,然后可以在關(guān)閉電源的情況下用萬(wàn)用表測(cè)量后才進(jìn)行測(cè)量;第二點(diǎn)有點(diǎn)系統(tǒng)的偶然性;第三點(diǎn)可以盡量減少電路布局,從而減少相應(yīng)的影響。
5)總結(jié)
這個(gè)電路多處使用了集成IC芯片,讓電路更加簡(jiǎn)潔明了,并且提高了電路的安全性、可行性,減少了整個(gè)電路的功耗和整個(gè)電路的布線(xiàn)。但是此電路沒(méi)有完全地符合實(shí)驗(yàn)要求:首先,整個(gè)電路沒(méi)有施密特觸發(fā)器,輸入信號(hào)放大電路,數(shù)碼管的小數(shù)點(diǎn)驅(qū)動(dòng),滿(mǎn)位報(bào)警電路。因此我首先加入以三極管9014為核心的放大電路;然后用74LS00兩個(gè)雙輸入與非門(mén)構(gòu)成施密特觸發(fā)器,對(duì)輸入信號(hào)進(jìn)行整形;對(duì)于報(bào)警電路,由于集成IC沒(méi)有譯碼電路引腳,所以選擇了一個(gè)8輸入與非門(mén)和一個(gè)74LS00結(jié)成,這樣可以充分考慮到唯一性;還有就是它的計(jì)數(shù)不是直接顯示頻率,而是顯示一個(gè)數(shù)字,再與閘門(mén)的時(shí)候計(jì)算才可以得出真正的頻率。
總體來(lái)說(shuō),電路還是存在一點(diǎn)小問(wèn)題沒(méi)有得到很好的解決,因?yàn)?4LS00組成的施密特觸發(fā)器沒(méi)有很好地整形波,在示波器上出現(xiàn)脈沖波,還得于計(jì)算,可以改為以NE555組成的施密特電路。改用其他的數(shù)碼管驅(qū)動(dòng),從而驅(qū)動(dòng)小數(shù)點(diǎn)。
通過(guò)這次實(shí)驗(yàn),讓我認(rèn)識(shí)到數(shù)字電路的萬(wàn)千變化,集成IC的推出,大大提高安全性和可行性。理解了科學(xué)就是力量。最主要是學(xué)習(xí)到設(shè)計(jì)電路的思想以為加強(qiáng)自己的焊接能力。讓自己的電子技術(shù)更上一層樓。
附錄:完整的電路PCB圖,完整的源程序名列表(不需要把源程序打印出來(lái),作為電子文檔提交)。
附錄一:
附錄二:
第五篇:verilog簡(jiǎn)易數(shù)字頻率計(jì)報(bào)告
一、實(shí)驗(yàn)原理
根據(jù)原理圖,將計(jì)數(shù)器模塊、顯示模塊、掃描模塊、譯碼器模塊等分別做出。其原理是在1S內(nèi)用待測(cè)信號(hào)給計(jì)數(shù)器計(jì)數(shù),并在一秒結(jié)束時(shí)給計(jì)數(shù)器清零,計(jì)出來(lái)用緩存器緩存,在數(shù)碼管中顯示出來(lái)。
二、方案論證
一、通過(guò)50M的時(shí)鐘進(jìn)行計(jì)數(shù)獲得精密的1HZ——計(jì)數(shù)器用Verilog HDL語(yǔ)言實(shí)現(xiàn)在1HZ為底電平時(shí)計(jì)數(shù)——門(mén)控電路用或門(mén)開(kāi)啟——1HZ為高電平時(shí)進(jìn)行數(shù)據(jù)鎖存與顯示——利用Verilog HDL語(yǔ)言使前面的0不顯示。
計(jì)數(shù)器用Verilog HDL語(yǔ)言在寫(xiě)代碼時(shí)可以用復(fù)制粘貼的方法可以簡(jiǎn)便的實(shí)現(xiàn)。通過(guò)50M的時(shí)鐘進(jìn)行計(jì)數(shù)獲得精密的1HZ后只是經(jīng)過(guò)很短的時(shí)間內(nèi)進(jìn)行計(jì)數(shù)器的清零及數(shù)據(jù)的瑣存,并且得到的是1HZ的精密時(shí)鐘。把鎖存的數(shù)據(jù)進(jìn)行清0的轉(zhuǎn)換后利用分時(shí)掃描,后通過(guò)數(shù)碼管譯碼顯示。
說(shuō)明:
Cnt9999:0000~9999計(jì)數(shù)器; Buffer:鎖存器; Scan:掃描顯示 共8個(gè)模塊
三、實(shí)驗(yàn)步驟
一、計(jì)數(shù)器模塊 計(jì)數(shù)器模塊的仿真波形
二、鎖存模塊
利用32位的D觸發(fā)器進(jìn)行儲(chǔ)存計(jì)數(shù)器送給它的數(shù)據(jù)。在時(shí)鐘為上升沿的時(shí)候觸發(fā)保存數(shù)據(jù)。鎖存模塊的源代碼:
module buffer_32(clr,clear,in,out);input
clear,clr;input[31:0] in;output[31:0] out;reg[31:0]
out;always@(posedge clear or negedge clr)
if(!clr)out<=0;
//else if(clear)out=in;
else out<=in;
endmodule
三、轉(zhuǎn)化清零模塊 波形仿真波形
module cnt9999(clr,clk,q,c);
input clr,clk;output c;output [15:0]q;reg c;reg [15:0]q;
always @(posedge clk or negedge clr)begin
if(!clr)begin q[15:0]<=0;c<=1'b0;end
else if(q[15:0]==16'H9999)begin q[15:0]<=0;c<=1'b1;end
else if(q[11:0]==12'H999)begin q[15:0]<=q[15:0]+12'H667;c<=1'b0;end
else if(q[7:0]== 8'H99)begin q[15:0]<=q[15:0]+8'H67;c<=1'b0;end
else if(q[3:0]== 4'H9)begin q[15:0]<=q[15:0]+4'H7;c<=1'b0;end
else begin q[15:0]<=q[15:0]+1'b1;c<=1'b0;end end endmodule
四、掃描顯示模塊
把存儲(chǔ)的數(shù)據(jù)分別分給8個(gè)數(shù)碼管,利用循環(huán)掃描即可顯示出所要顯示的數(shù)據(jù)。
掃描顯示模塊的仿真波形
module scan(clk,q);input clk;output [2:0]q;reg
[2:0]q;
always @(posedge clk)
begin
q=q+1;
end
endmodule
四、引腳分配
五、實(shí)驗(yàn)總結(jié)
頻率就是信號(hào)在1s內(nèi)發(fā)生相同變化的次數(shù),簡(jiǎn)易頻率計(jì)就是基于這個(gè)原理設(shè)計(jì)的。我們先產(chǎn)生一個(gè)低電平為1s,高電平為1/50M秒的周期信號(hào)clk,用該信號(hào)與待測(cè)信號(hào)相與作為計(jì)數(shù)器的輸入時(shí)鐘,并把clk的上升沿作為緩存器的開(kāi)關(guān),把clk的高電平作為計(jì)數(shù)器的清零信號(hào),這樣就能保證緩沖器中存放的始終是待測(cè)信號(hào)在一秒內(nèi)的跳變次數(shù),也即待測(cè)信號(hào)的頻率。
實(shí)驗(yàn)的原理盡管很清楚,但真正看到實(shí)驗(yàn)現(xiàn)象還是經(jīng)歷了一番波折,在寫(xiě)8選1數(shù)據(jù)選擇器的時(shí)候,定義模塊端口時(shí),由于疏忽,把四位位寬漏寫(xiě)成了1位,結(jié)果在數(shù)碼管上顯示的始終只有0和1兩種數(shù)字。為了改正這個(gè)錯(cuò)誤,我把程序的主要模塊都檢查了一遍,結(jié)果不管怎么改實(shí)驗(yàn)現(xiàn)象都沒(méi)有出來(lái),這讓我郁悶了很長(zhǎng)一段時(shí)間,原理明明是對(duì)的,為什么就沒(méi)有效果呢?最后我把整個(gè)程序都打印出來(lái),一行一行地檢查,最后終于找到了癥結(jié)所在,就是8選1數(shù)據(jù)選擇器的位寬弄錯(cuò)了!經(jīng)歷了這次錯(cuò)誤,讓我明白了寫(xiě)程序還是不能大意,8選1數(shù)據(jù)選擇器雖然簡(jiǎn)單,卻因?yàn)槲粚掃@個(gè)小小的錯(cuò)誤讓我浪費(fèi)了很長(zhǎng)的時(shí)間,檢查錯(cuò)誤時(shí)也因?yàn)槠浜?jiǎn)單而沒(méi)有認(rèn)真對(duì)待。