国产精品天干天干,亚洲毛片在线,日韩gay小鲜肉啪啪18禁,女同Gay自慰喷水

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

FPGA 數(shù)字信號(hào)處理之 FSK 調(diào)制、解調(diào)的實(shí)現(xiàn)與仿真基于 verilog 保姆級(jí)

2022-05-30 14:05 作者:javaisone  | 我要投稿

試驗(yàn)說明:

筆者復(fù)現(xiàn)FSK調(diào)制、解調(diào)的過程中,在網(wǎng)上查了很多很多相關(guān)文章,至少在本文之前,沒發(fā)現(xiàn)能在參考一篇博文的情況下能完整復(fù)現(xiàn)實(shí)驗(yàn)結(jié)果的??傊?,全乎的基本沒有。

本筆記(文)的目標(biāo)是讓入門者或者說小白在參考本文的基礎(chǔ)上,能一步一步完整復(fù)現(xiàn)實(shí)驗(yàn)結(jié)果,少走彎路,盡力節(jié)省時(shí)間,因?yàn)闀r(shí)間很寶貴。

另:本實(shí)驗(yàn)只是復(fù)現(xiàn)參考博文的結(jié)果,有關(guān)概念、原理相關(guān)知識(shí)請(qǐng)參考原文。
主要參考博文鏈接如下:
https://bestfpga.blog.csdn.net/article/details/81166187

實(shí)驗(yàn)?zāi)繕?biāo):

達(dá)成和博文中最終仿真結(jié)果基本一致,先看一下本次實(shí)驗(yàn)的最終的仿真結(jié)果吧!


FSK是利用載波的頻率表示基帶信息,比如在2FSK系統(tǒng)中,采用單頻信號(hào)f1表示信息0、單頻信號(hào)f2表示信息1。根據(jù)碼元轉(zhuǎn)換時(shí)載波的相位是否連續(xù),分為非連續(xù)相位FSK和連續(xù)相位FSK。–摘自參考博文。

注意:
非連續(xù)相位調(diào)制沒試驗(yàn)復(fù)現(xiàn),只試驗(yàn)了連續(xù)相位調(diào)制(CPFSK)。

FSK調(diào)制信號(hào)生成步驟

簡(jiǎn)單說明:
在ISE14.7的環(huán)境下,完成2FSK(CPFSK)的調(diào)制,并進(jìn)行仿真,系統(tǒng)時(shí)鐘32Mhz,碼元速率1Mhz,載波頻率6Mhz,頻移指數(shù)h=3.5,f1=4.25MHz、f2=7.75Mhz

連續(xù)相位調(diào)制時(shí),配置1個(gè)DDS產(chǎn)生兩個(gè)代表1和0的單頻信號(hào)(要調(diào)制–非連續(xù)相位的要產(chǎn)生2個(gè)信號(hào))即可,非連續(xù)相位的內(nèi)容具體參考原文。
將DDS的無雜散動(dòng)態(tài)范圍設(shè)置為95dB,對(duì)應(yīng)的位寬為16bits。

有關(guān)概念、原理相關(guān)知識(shí)請(qǐng)參考原文
下面為本次實(shí)驗(yàn)的詳細(xì)記錄:
首先:

DDS IP核的配置過程:

ISE14.7新建工程:


注意:器件選擇高端點(diǎn)的,在試驗(yàn)過程中被坑過,因?yàn)槠骷x的低。

工程建立后,添加DDS IP核:


上圖中,指定IP的名稱和存放路徑


上圖指定了DDS 版本


上圖參數(shù)簡(jiǎn)要說明:

DDS的頻率分辨率設(shè)置為976.5625Hz,正好對(duì)應(yīng)相位位寬為15Bits
(Fs/2^B
=32MHz/2^15=976.5625Hz)。
因此
f1=4.25MHz對(duì)應(yīng)的頻率控制字為4351(f1/976.5625-1=4351);
f2=7.75MHz對(duì)應(yīng)的頻率控制字為7935(f2/976.5625-1=7935)

本實(shí)驗(yàn)使用連續(xù)相位FSK(CPFSK)只需要使用一個(gè)DDS Compiler IP核,比FSK要節(jié)省不少資源。
故省略了參考博文中的----非連續(xù)相位的試驗(yàn)。

因此,CPFSK配置如下:


注意上圖參數(shù)


生成后到工程內(nèi)找到ipcore_dir目錄,復(fù)制文件dds_cpfsk2.v 放入modelsim工程模板的src目錄備用。
此時(shí),也可單獨(dú)仿真,看一下FSK調(diào)制的結(jié)果,具體仿真步驟可參考后面的說明。

CPFSK (連續(xù)相位FSK)調(diào)制的仿真結(jié)果:


FSK調(diào)制部分,也提供了單獨(dú)的仿真文件,也詳細(xì)見后面的說明。

----------------------------------------------------華麗的分割線---------------------------------------------------------------------------------

FSK解調(diào)部分實(shí)驗(yàn)

首先
要生成濾波器的coe文件供ISE中配置濾波器時(shí)調(diào)用。
使用matlab配置、濾波器COE文件步驟如下:
打開matlab2018b

在命令行窗口輸入:fdatool


開始配置帶通濾波器(演示一個(gè),其它的方法和步驟一樣):


簡(jiǎn)要說明一下:
帶通濾波器分別篩選兩路ASK信號(hào)。
系統(tǒng)時(shí)鐘32Mhz,
碼元速率1Mhz,
載波頻率6Mhz,
頻移指數(shù)h=3.5,
f1=4.25Mhz,
f2=7.75MHz。
帶通濾波器通帶可分別選為:
A:(6Mhz-h×1Mhz)–6Mhz。
B:6Mhz–(6MHz+h×1Mhz)。
因此帶通濾波器A的配置如上圖所示。配置完成后,就可以導(dǎo)出coe文件了。

導(dǎo)出coe文件:
第一步:


第二步:見上圖,先選擇左側(cè)第三個(gè)圖標(biāo)量化后,即可。
再選擇:上面的菜單欄Targets–>XILINX (.COE) File
保存到指定目錄即可。

B的配置、導(dǎo)出COE文件的方法同A----即上圖,這里省略截圖了。

低通濾波器的配置:


低通濾波器用于提取出基帶信號(hào)包絡(luò),截止頻率設(shè)置為碼元速率即可。COE文件導(dǎo)出方式如前文描述。
注:
如果在上一步的導(dǎo)出COE界面,點(diǎn)擊紅色箭頭即可返回參數(shù)配置界面。

至此,所有的濾波器系數(shù)經(jīng)過量化后存儲(chǔ)為txt(coe)文件,供后面在FPGA設(shè)計(jì)中調(diào)用。
全部完成后,生成的COE文件共3個(gè):
bpf1_fir.coe、bpf2_fir.coe、lpf_fir.coe
名字隨意,自己記得清即可。

ISE14.7配置IP核:

新建工程,關(guān)鍵步驟如下:
注意下面的器件選擇


添加、配置帶通濾波器其中-1個(gè)的步驟:


選擇COE文件,matlab中生成:

輸入采用頻率和系統(tǒng)時(shí)鐘:
都是32MHz

輸出位數(shù):32
同時(shí)選擇截?cái)嗄J?br>


如上圖,之前用的6系列的器件這個(gè)紅框+紅圈的地方提示參數(shù)錯(cuò)誤。應(yīng)該是6系器件的DSP資源不足導(dǎo)致無法配置。
因此前面說新建工程時(shí)要選擇一個(gè)高端點(diǎn)的器件。


至此,配置就完成了,點(diǎn)擊“Generate”,生成IP核即可。

bpf2_fir配置方法和步驟一樣(略過)

lpf_fir的配置方法和步驟也一樣(略過)

全部生成后,到ipcore_dir目錄內(nèi),復(fù)制文件
bpf1_fir.mif bpf1_fir.mif lpf_fir.mif?該文件放入modelsim工程模板的sim目錄
bpf1_fir.v bpf2_fir.v 、lpf_fir.v?該文件放入modelsim工程模板的src目錄

----------------------------------------------------華麗的分割線---------------------------------------------------------------------------------

開始仿真

modelsim工程結(jié)構(gòu):


目錄結(jié)構(gòu)說明:
首先是:
run_simulation.bat 腳本文件啟動(dòng)仿真,內(nèi)容如下:

@echo off @cls title FPGA Auto Simulation batch scriptecho ModelSim simulation echo.echo Press '1' to start simulation echo. :inputset INPUT=set /P INPUT=Type test number: %=%if "%INPUT%"=="1" goto run1 goto end :run1 @clsecho Start Simulation;echo. echo.cd sim vsim -do "do compile.do"goto clean_workspace :clean_workspacermdir /S /Q work del vsim.wlf del transcript. :end

src目錄內(nèi)---- 存源文件
包括:生成的.v文件,仿真時(shí)少的庫文件等。
注意:
此目錄內(nèi),除了自己實(shí)現(xiàn)的文件及上面配置時(shí)生成的文件,同時(shí),在仿真編譯時(shí),注意看報(bào)錯(cuò)提示,若是缺少文件,自行搜索復(fù)制到該目錄內(nèi)即可。

sim目錄內(nèi)— 存激勵(lì)文件和2個(gè)do文件及1個(gè)ini文件
兩個(gè)do文件,其中,
wave.do文件內(nèi)容:

add wave -divider {cpfsk_modulate_demodulate_tb}add wave -position insertpoint sim:/cpfsk_modulate_demodulate_tb/*

compile.do文件內(nèi)容:

vlib work vmap work work vlog ?-work work glbl.v#library#vlog ?-work work ../../library/artix7/*.v#IP#vlog ?-work work ../../../source_code/ROM_IP/rom_controller.v#SourceCodevlog ?-work work ../src/*.v#Testbenchvlog ?-work work cpfsk_modulate_demodulate_tb.v #vsim -voptargs=+acc -L unisims_ver -L unisim -L work -Lf unisims_ver work.glbl work.cpfsk_modulate_demodulate_tbvsim -voptargs=+acc work.glbl work.cpfsk_modulate_demodulate_tb#Add signal into wave windowdo wave.do#run -allrun 1ms

Modelsim.ini文件內(nèi)容:

[Library]others = $MODEL_TECH/../modelsim.ini work = work[vcom]VHDL93 = 2002Explicit = 1[vlog]LibrarySearchPath = mtiAvm mtiOvm mtiUvm mtiUPF[sccom][vopt][vsim]VoptFlow = 1Resolution = ns UserTimeUnit = default RunLength = 100IterationLimit = 5000BreakOnAssertion = 3ShowFunctions = 1DefaultRadix = symbolic TranscriptFile = transcript PathSeparator = / DatasetSeparator = :UnbufferedOutput = 0ConcurrentFileLimit = 40ScTimeUnit = ns ScMainStackSize = 10 Mb ScMainFinishOnQuit = 1ScvPhaseRelationName = mti_phase OnFinish = ask DumpportsCollapse = 1MvcHome = $MODEL_TECH/..[lmc]libsm = $MODEL_TECH/libsm.sl libhm = $MODEL_TECH/libhm.sl[msg_system]suppress = 8780

最后附上調(diào)制、解調(diào)文件和激勵(lì)文件如下:

cpfsk_modulate_demodulate.v,該文件放入src目錄內(nèi),文件內(nèi)容:

`timescale 1ns / 1ps//--------------------------------------------------------// ? 包絡(luò)檢波法(非相干解調(diào))實(shí)現(xiàn)FSK信號(hào)解調(diào)//--------------------------------------------------------module cpfsk_modulate_demodulate( ? ?input clk , ? ? ? ? //32MHz系統(tǒng)時(shí)鐘 ? ?input rst_n , ? ?input din , ? ? ? ? ? //基帶信號(hào)輸入,碼元速率1MHz ? ?output [15:0] dout ? //FSK解調(diào)數(shù)據(jù)輸出);//-----------------------------------------------------// ? CPFSK調(diào)制,連續(xù)相位,h=3.5//-----------------------------------------------------wire [15:0] fsk;digital_adds fskmod( ? ?.clk ? (clk ) , ? ? ? ?.rst_n ?(rst_n ) , ? ? ?.din ? (din ) , ? ? ? ?.dout (fsk ) );//assign dout = fsk ; //**加上句是為了單獨(dú)測(cè)試CPFSK的調(diào)整信號(hào)輸出--即下面的代碼都未添加時(shí)--注釋掉到98行。**//--------------------------------------------------------// ? 帶通濾波器分為兩路ASK信號(hào)//--------------------------------------------------------wire signed [31:0] data1, data2;wire signed [15:0] bpf1 = data1[29:14]; wire signed [15:0] bpf2 = data2[29:14]; bpf1_fir fir1 ( ?.aclk (clk ) , ? ? ? ? ? ? ? ? ? ? ? ? ? ?.s_axis_data_tvalid (1'b1 ) , ?.s_axis_data_tready ( ) , ?.s_axis_data_tdata (fsk ) , ? ?.m_axis_data_tvalid ( ) , ? ?.m_axis_data_tdata (data1 ) ? ?);bpf2_fir fir2 ( ?.aclk (clk ) , ? ? ? ? ? ? ? ? ? ? ? ? ? ?.s_axis_data_tvalid (1'b1 ) , ?.s_axis_data_tready ( ) , ?.s_axis_data_tdata (fsk ) , ? ?.m_axis_data_tvalid ( ) , ? ?.m_axis_data_tdata (data2 ) ? ?); ? ? ?//--------------------------------------------------------// ? ?整流,即求絕對(duì)值//--------------------------------------------------------reg signed [15:0] bpf1_abs, bpf2_abs;always @ (posedge clk or posedge rst_n) ? ?if (rst_n) begin bpf1_abs <= 'd0; bpf2_abs <= 'd0; end ? ?else begin ? ? ? ?if (bpf1[15]) bpf1_abs <= -bpf1; ? ? ? ?else bpf1_abs <= bpf1; ? ? ? ?if (bpf2[15]) bpf2_abs <= -bpf2; ? ? ? ?else bpf2_abs <= bpf2; ? ?end//--------------------------------------------------------// ? ?低通濾波得到基帶信號(hào)包絡(luò)//--------------------------------------------------------wire signed [31:0] lpf1, lpf2;lpf_fir fir3 ( ?.aclk (clk ) , ? ? ? ? ? ? ? ? ? ? ? ? ? ?.s_axis_data_tvalid (1'b1 ) , ?.s_axis_data_tready ( ) , ?.s_axis_data_tdata (bpf1_abs ) , ? ?.m_axis_data_tvalid ( ) , ? ?.m_axis_data_tdata (lpf1 ) ? ?);lpf_fir fir4 ( ?.aclk (clk ) , ? ? ? ? ? ? ? ? ? ? ? ? ? ?.s_axis_data_tvalid (1'b1 ) , ?.s_axis_data_tready ( ) , ?.s_axis_data_tdata (bpf2_abs ) , ? ?.m_axis_data_tvalid ( ) , ? ?.m_axis_data_tdata (lpf2 ) ? ?);//--------------------------------------------------------// ? ?減法得到解調(diào)信號(hào)//--------------------------------------------------------reg signed [15:0] sub;always @ (posedge clk or posedge rst_n) ? ?if (rst_n) sub <= 'd0; ? ?else sub <= lpf1[29:14] - lpf2[29:14];assign dout = sub;endmodule

激勵(lì)文件
cpfsk_modulate_demodulate_tb.v,該文件放sim目錄中,內(nèi)容如下:

//測(cè)試文件`timescale 1ns/1ps module cpfsk_modulate_demodulate_tb(); ? ?reg ? clk ; ? ?reg ? rst_n ; reg din ; wire [15:0] dout ; cpfsk_modulate_demodulate cpfsk_modulate_demodulate_inst( ? ?.clk ? (clk ) , ? ?.rst_n (rst_n ) , ? ?.din (din ) , .dout (dout ) );initial clk = 1 ;always #16 clk = !clk ;always #1100 din=!din ;initial begin ? ? ? ? ? ? ? ? ? ? ? ? ? ?rst_n = 1 ; ? ?#100 ? ?rst_n = 0 ; din =1 ; ? ?#500000 ? ?$stop;end endmodule

最終仿真結(jié)果:

----------------------------------------------------華麗的分割線---------------------------------------------------------------------------------

附錄:

仿真工程里,還提供了單獨(dú)仿真FSK調(diào)制的文件和激勵(lì)文件,也可在cpfsk_modulate_demodulate.v中只仿真查看fsk輸出,這種方式具體見cpfsk_modulate_demodulate.v文件中注釋部分描述。

先看單獨(dú)的實(shí)現(xiàn):

FSK調(diào)制信號(hào)的仿真

digital_adds.v和digital_adds_tb.v文件即可

digital_adds.v文件內(nèi)容:

//頂層module digital_adds( ? ?input clk , input rst_n , input din , output [15:0] dout );//-----------------------------------------------------// ? 載波Fc=6MHz,h=3.5,則f1=4.25MHz、f2=7.75Mhz//-----------------------------------------------------wire [14:0] phase;dds_cpfsk2 dds_cpfsk2_inst( ?.aclk (clk ), ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?.s_axis_phase_tvalid (1'b1 ), ?.s_axis_phase_tdata ({1'b0,phase} ), ? ? ?.m_axis_data_tvalid ( ), ? ?.m_axis_data_tdata (dout ));assign phase = din ? 'd4351:'d7935 ;endmodule

digital_adds_tb.v文件內(nèi)容:

//測(cè)試文件`timescale 1ns/1ps module digital_adds_tb(); ? ?reg ? clk ; ? ?reg ? rst_n ; reg din ; wire [15:0] dout ; digital_adds digital_adds_inst( ? ?.clk ? (clk ) , ? ?.rst_n (rst_n ) , ? ?.din (din ) , .dout (dout ) );initial clk = 1;always #16 clk = !clk;initial begin ? ? ? ? ? ? ? ? ? ? ? ? //同步復(fù)位信號(hào)需要時(shí)鐘上升沿檢測(cè) ? ?rst_n = 0; ? ?#100 ? ?rst_n = 1; din =1; #1000 din=0 ; #1000 din=1 ; #1000; din =0; #1000 din=0 ; #1000 din=1 ; #1000; din =0; ? ?#500000 ? ?$stop;end endmodule

仿真時(shí),注意還要修改2個(gè)do文件。
wave.do修改如下:

add wave -divider {digital_adds_tb}add wave -position insertpoint sim:/digital_adds_tb/*

compile.do修改如下:

vlib work vmap work work vlog ?-work work glbl.v#library#vlog ?-work work ../../library/artix7/*.v#IP#vlog ?-work work ../../../source_code/ROM_IP/rom_controller.v#SourceCodevlog ?-work work ../src/*.v#Testbenchvlog ?-work work digital_adds_tb.v #vsim -voptargs=+acc -L unisims_ver -L unisim -L work -Lf unisims_ver work.glbl work.digital_adds_tbvsim -voptargs=+acc work.glbl work.digital_adds_tb#Add signal into wave windowdo wave.do#run -allrun 1ms

另,仿真時(shí)可能報(bào)類似如下的錯(cuò)誤:

Module ‘RAMB36E1’ is not defined.

解決辦法:
搜索ISE安裝目錄下同名的.v文件,到modelsim工程模板的src目錄即可。

缺少其他文件之類的(注意看編譯時(shí)的錯(cuò)誤提示信息確定是否缺少文件問題),也可這么操作。

結(jié)束語

不夸張的話,這應(yīng)該是全網(wǎng)最詳細(xì)的關(guān)于FSK調(diào)制與解調(diào)的筆記了,如果看到這里還沒復(fù)現(xiàn)實(shí)驗(yàn)結(jié)果,只有兩種可能
1 沒有仔細(xì)看筆記
2 工具和環(huán)境問題

本次實(shí)驗(yàn)環(huán)境和工具說明:
1 win10 專業(yè)版 64bits
2 ISE14.7 或 vivado2018.3
3 Modelsim 2020.4 或10.1a
4 matlab2008b

猜測(cè)一下,如果復(fù)現(xiàn)實(shí)驗(yàn)的過程真有坑話,也可能是在modelsim編譯、仿真這里出問題,若一語成讖,就不要借鑒文中的方法,老老實(shí)實(shí)的自行打開modelsim,一步一步的按常規(guī)做法,新建項(xiàng)目,添加文件…等,去完成編譯和仿真查看波形,具體可自行網(wǎng)絡(luò)查閱。

能看到末了這的,說明我們有緣分啊,浪費(fèi)你一秒的時(shí)間,給個(gè)鼓勵(lì),點(diǎn)關(guān)注,下次更新不迷路。


FPGA 數(shù)字信號(hào)處理之 FSK 調(diào)制、解調(diào)的實(shí)現(xiàn)與仿真基于 verilog 保姆級(jí)的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
丹阳市| 墨玉县| 宁化县| 沭阳县| 清徐县| 松江区| 论坛| 南江县| 会昌县| 阿拉善盟| 宜昌市| 永宁县| 濮阳县| 普洱| 东平县| 双城市| 汾阳市| 阿勒泰市| 哈密市| 凌海市| 芷江| 博湖县| 赣州市| 漳州市| 津市市| 光山县| 涡阳县| 子洲县| 陇川县| 周至县| 昌吉市| 玉树县| 鸡泽县| 林甸县| 神农架林区| 南皮县| 新建县| 普定县| 鸡东县| 浦城县| 镇赉县|