之前在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 電路功能設計 在系統設計之前,首先要...