國產荔枝糖FPGA開發板實現FM發射

2021-08-27 16:15:34 字數 4655 閱讀 5496

之前在zedboard上實現了fm發射,移植到荔枝糖fpga開發板上,執行異常,抓波形看,波形紊亂,由於最高時鐘為450m,估計是荔枝糖fpga開發板跑不了這麼高,那就降頻吧,降到18m果然可以發**

top**如下:

module top(

output [2 : 0] rgb_led_o,

input clk24mhz,

input reset,

output fm_tx

);wire ireset;

wire lock;

wire clk90mhz;

wire iclk20mhz;

wire [15:0] in_factor;

wire [7:0] addr;

reg clk_audio;

reg [11:0] cnt;

reg [14:0] music_cnt;

always @(posedge iclk20mhz)

begin

if (!reset)

begin

cnt <= 0;

clk_audio <= 0;

endelse

begin

if (cnt == 453) sample rate

begin

clk_audio <= !clk_audio;

cnt <= 0;

endelse

cnt <= cnt + 1;

endendalways @(posedge clk_audio)

begin

if (!reset)

begin

music_cnt <= 0;

endelse

music_cnt <= music_cnt + 1;

endclk u1(

.refclk(clk24mhz),

.reset(ireset),

.stdby(),

.extlock(lock),

.clk0_out(iclk20mhz),

.clk1_out(clk90mhz)

);divider u2(

.clk_in(clk90mhz),

.nreset(reset),

.in_factor(in_factor),

.nclk(fm_tx)

);music u3(

.doa(addr),

.addra(music_cnt),

.clka(clk_audio),

.rsta(ireset)

);blk_mem u4(

.doa(in_factor),

.addra(addr),

.clka(iclk20mhz),

.rsta(ireset)

);assign ireset = !reset;

assign rgb_led_o[0] = !lock;

assign rgb_led_o[1] = 1;

assign rgb_led_o[2] = 1;

endmodule

divider**如下:

module divider(

input wire clk_in,

input wire nreset,

input wire [15:0]in_factor,

output wire nclk

);reg r0, r1, r2, r3, r4

;reg [15:0]factor=0

;reg [15:0]fcnt;

reg short;

reg short_f;

always @(posedge clk_in or negedge nreset)

begin

if(~nreset)

begin

r0<= 0;r1

<= 0;r2

<= 0;r3

<= 0;r4

<= 1

; end

else

begin

r0<= r1;r1

<= r2;r2

<= r3

; if(short)

r3<= r0

; else

r3<= r4

; if(~short)

r4<= r0

; end

endassign nclk = r0

;always @(posedge clk_in or negedge nreset)

if(~nreset)

begin

fcnt <= 0

; short <= 0

; short_f <= 0

; end

else

begin

if(r0)

fcnt <= short ? 0 : fcnt +1

; if(r2)

short <= (fcnt == factor);

if(r0)

short_f <= short;

if(r0 & short_f)

factor <= in_factor;

endendmodule

u4的fm_tx_rom初始化mif檔案生成matlab**如下:

clear all;

close all;

clc;

base_freq = 90000000;

carrier = 18000000;

band = 50000;

fid_s = fopen('fm_tx_rom.mif', 'wt');

fprintf(fid_s, '%s\n', 'depth=256;');

fprintf(fid_s, '%s\n', 'width=16;');

fprintf(fid_s, '%s\n', 'address_radix=uns;');%uns表示為十進位制

fprintf(fid_s, '%s\n', 'data_radix=uns;');

fprintf(fid_s, '%s\n', 'content begin');

for (i=1:256)

freq_wish = carrier + band*(i-1)/256;

divider = base_freq / freq_wish;

m=(divider-4)/(5-divider);

fprintf(fid_s, '%03d', i-1);

fprintf(fid_s, '%s', ' : ');

fprintf(fid_s, '%d', round(m));

fprintf(fid_s, '%s\n', ';');

endfclose(fid_s);

disp('***************====轉換完成*************************');

測試音訊rom檔案初始化mif檔案生成matlab**如下:

fs = 44100/2; %取樣頻率

t = 1/fs; %取樣週期

time1 = 0.7; %第乙個聲音片段的總時長

time2 = 0.1;

time3 = 0.686;

freq1 = 261; %第乙個聲音片段的頻率(音調)

freq2 = 0;

freq3 = 1000;

vol1 = 127; %第乙個聲音片段的音量

vol2 = 0;

vol3 = 100;

tone1 = 128+sin(2*pi*freq1*(0:t:time1))*(vol1); %生成第乙個聲音片段,注意需要用db2mag()函式把db轉換成magnitude。

tone2 = sin(2*pi*freq2*(0:t:time2))*(db2mag(vol2));

tone3 = 128+sin(2*pi*freq3*(0:t:time3))*(vol3);

tone = [round(tone1), round(tone2), round(tone3)]; %組合所有聲音片段

fid_s = fopen('music_rom.mif', 'wt');

fprintf(fid_s, '%s\n', 'depth=32768;');

fprintf(fid_s, '%s\n', 'width=8;');

fprintf(fid_s, '%s\n', 'address_radix=uns;');%uns表示為十進位制

fprintf(fid_s, '%s\n', 'data_radix=uns;');

fprintf(fid_s, '%s\n', 'content begin');

for (i=1:32768)

fprintf(fid_s, '%05d', i-1);

fprintf(fid_s, '%s', ' : ');

fprintf(fid_s, '%d', tone(i));

fprintf(fid_s, '%s\n', ';');

end

荔枝糖 按鍵滾動LED

fpga型號 eg4s20bg256 軟體 anlogic td 64 bit version 4.2.511 功能 按下按鍵則led紅 綠 藍切換 注意事項 在xilinx的ise或者vivado中,可以在定義的時候賦初值 在intel的quartus中可以用initial賦初值,在此版本的td軟...

FPGA開發之FPGA開發流程簡介

我以前一直很疑惑晶元設計這一塊在實際中是怎麼做的呢?今天了解了一下,現在設計晶元一般採用fpga開發,大概流程如下 1 功能定義 器件選型 設計晶元之前當然你要知道你設計的晶元有什麼功能,然後就模組化,寫清楚誰誰誰幹什麼,這當然就是從上至下的方法,你試試從下到上給我看看。2 設計輸入 這一步就是說我...

FPGA開發流程

fpga的設計流程就是利用eda開發軟體和程式設計工具對fpga晶元進行開發的過程。fpga的開發流程一般如圖1 6所示,包括電路設計 設計輸入 功 能 綜合優化 綜合後 實現 佈線後 板級 以及晶元程式設計與除錯等主要步驟。圖1 6 fpga開發的一般流程 1 電路功能設計 在系統設計之前,首先要...