2021-08-16 21:48:40 索煒達(dá)電子 694
項目編號:E224
文件大?。?34K
源碼說明:帶中文注釋
開發(fā)環(huán)境:.v
目錄結(jié)構(gòu)
-hdk
--Gerber_PCB.zip PCB制版文件
--Schematic.pdf 原理圖
-math
--text.m 波形生成測試
--wave.m 波形生成腳本
-rtl 主要的hdl文件
-gw_dds.rar 高云ide(gowin)的工程文件
介紹
本項目以高云FPGA(GW1N-LV1)作為控制核心,外圍搭建DAC、按鍵等電路,實(shí)現(xiàn)雙通道DDS信號發(fā)生器。通過按鍵和撥碼開關(guān),可以獨(dú)立調(diào)整每個通道的波形、頻率、相位。通過電位器,可以調(diào)整每個通道最終輸出波形的幅值。
技術(shù)指標(biāo)
通道數(shù):2 調(diào)制方式:DDS 波形類型:正弦波,方波,三角波,鋸齒波 頻率范圍:1-65535Hz 頻率步進(jìn):1Hz 相位范圍:0-360度 相位步進(jìn):360/(2^8)度 輸出幅值:0-3.3V 輸出阻抗:50ohm
總體結(jié)構(gòu)
本項目使用GW1N-LV1輸出雙通道DDS波形信號,模擬部分對信號進(jìn)行濾波、幅度調(diào)節(jié)、輸出緩沖。
原理分析
(1)邏輯部分
1.信號發(fā)生器每個通道使用了4KB的ROM作為波形存儲器。
其中,每種波形(正弦波、方波、三角波、鋸齒波)的一個周期的幅值信息占用1024字節(jié),4種波形占用4096字節(jié)。 輸出波形,首先需要根據(jù)波形種類確定基地址;其次,頻率寄存器決定了偏移量自增的速度;相位寄存器決定了兩個通道偏移量的差值;最后,基地址與偏移量相加,得到ROM中當(dāng)前時刻波形輸出的電壓值。
2.波形參數(shù)是通過外部按鍵和撥碼開關(guān)來設(shè)置的。
8位的撥碼開關(guān)是主要數(shù)據(jù)的輸入接口,用于頻率和相位具體參數(shù)的設(shè)定,數(shù)據(jù)范圍是0x00-0xFF。頻率輸入按鍵分高位按鍵和低位按鍵,按下高位按鍵表示8位撥碼開關(guān)的數(shù)據(jù)寫入頻率寄存器的高8位,按下低位按鍵表示8位撥碼開關(guān)的數(shù)據(jù)寫入頻率寄存器的低8位,高低8位寄存器共16位,可以實(shí)現(xiàn)頻率從1Hz到65535Hz的調(diào)整。 相位輸入按鍵只有一個,相位的表示方式是將360度分割成256份,通過8位撥碼開關(guān)設(shè)置當(dāng)前波形的相位值。 Wave按鍵的作用是切換波形,按下按鍵,波形會以空閑、正弦波、方波、三角波、鋸齒波的順序循環(huán)切換。CH端口連接的是撥動開關(guān),其高低電平指示頻率、相位、Wave按鍵按下后,參數(shù)應(yīng)當(dāng)寫入哪一個通道。
3.計數(shù)型按鍵消抖模塊。
很多MCU的軟件消抖邏輯是:采樣到電平變化后,隔一小段時間再采樣一次,如果兩次電平相同則認(rèn)為按鍵穩(wěn)定。這種方法適用于通用處理器,但是放硬件邏輯上不太合適。 本項目設(shè)計了一個計數(shù)型消抖模塊。定義一個位寬為[n:0]的計數(shù)器,n的大小決定了消抖的程度,應(yīng)根據(jù)按鍵的特性來選擇,太大會導(dǎo)致反應(yīng)遲緩,太小則不足以消抖。 按鍵的高低電平?jīng)Q定了計數(shù)器在每個時鐘周期是數(shù)值+1還是-1,計數(shù)器的最高位作為消抖后的輸出。當(dāng)計數(shù)器為全0,則停止-1;當(dāng)計數(shù)器為全1,則停止+1。按鍵抖動會被計數(shù)器的計數(shù)過程消除,最高位01變換的分界點(diǎn)是計數(shù)器的中間值。
(2)模擬部分
波形信號是以8位并行的方式從FPGA輸出,然后進(jìn)入8位的R2R電阻網(wǎng)絡(luò)進(jìn)行數(shù)模轉(zhuǎn)換。轉(zhuǎn)換后的信號是0~3.3V的高輸出阻抗模擬電壓信號,需要進(jìn)入運(yùn)放和電位器進(jìn)行幅值調(diào)整和輸出緩沖。
文件列表:
目錄│文件列表:
└ gowin_dds
│ gw_dds.rar
├ hdk
│ │ .keep
│ │ Gerber_PCB.zip
│ │ PCB.pdf
│ └ Schematic.pdf
├ math
│ │ test.m
│ │ test.txt
│ │ wave.m
│ └ wave.txt
└ rtl
│ .keep
│ dds.v
│ key_control.v
│ key_filter.v
└ top.v