2279|2

114

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

基于fpga的FIR滤波器设计(附上源码代码下载) [复制链接]

fir_prj.rar (1.19 KB, 下载次数: 15)

1.1 顶层接口 完整源码及完整文章下载技术交流群:97925396
新建目录:D:\mdy_book\fir_prj在该目录中,新建一个名为fir_prj.v的文件,并用GVIM打开,开始编写代码。

我们要实现的功能,概括起来就是FPGA产生控制AD9709,让其中的通道A未滤波的正弦信号,让通道B输出滤波后的正弦信号。为了控制AD9709的工作模式,就要控制AD9709MODESLEEP管脚;为了控制通道A,就需要控制AD9729CLK1WRT1DB7~0P1管脚;为了控制通道B,就需要控制AD9729CLK2WRT2DB7~0P2管脚。根据设计目标的要求,整个工程需要以下信号:
1. 使用clk连接到晶振,表示50M时钟的输入。
2. 使用rst_n连接到按键,表示复位信号。
3. 使用3位信号key,表示三位拨码开关。
4. 使用dac_mode信号连接到AD9709MODE管脚,用来控制其工作模式。
5. 使用dac_sleep信号连接到AD9709SLEEP管脚,用来控制其睡眠模式。
6. 使用dac_clka信号连接到AD9709CLK1管脚,用来控制通道A的时钟。
7. 使用dac_wra信号连接到AD9709WRT1管脚,用来控制通道A的写使能。
8. 使用8位信号dac_da连接到AD9709DB7~0P1管脚,用来控制通道A的写数据。
9. 使用dac_clkb号连接到AD9709CLK2脚,用来控制通道B时钟。
10. 使用dac_wrb号连接到AD9709WRT2脚,用来控制通道B使能。
11. 使用8位信号dac_db接到AD9709DB7~0P2脚,用来控制通道B写数据。

综上所述,我们这个工程需要11个信号,时钟clk,复位rst_n,拨码开关的输入keydac_modedac_sleepdac_clkadac_wradac_dadac_clkbdac_wrbdac_db信号,其中dac_dadac_db8位信号,其他都是1位信号。下面表格表示了硬件电路图的连接关系。

器件
AD9709管脚
原理图信号
FPGA管脚
FPGA工程信号
U8
MODE
DAC_MODE
Y4
dac_mode
SLEEP
DAC_SLEEP
H2
dac_sleep
CLK1
DA_CLKA
R2
dac_clka
WRT1
DA_WRA
U1
dac_wra
DB7P1
DAC_DA7
AA1
dac_da[7]
DB6P1
DAC_DA6
Y2
dac_da[6]
DB5P1
DAC_DA5
Y1
dac_da[5]
DB4P1
DAC_DA4
W2
dac_da[4]
DB3P1
DAC_DA3
W1
dac_da[3]
DB2P1
DAC_DA2
V2
dac_da[2]
DB1P1
DAC_DA1
V1
dac_da[1]
DB0P1
DAC_DA0
U2
dac_da[0]
CLK2
DA_CLKB
R1
dac_clkb
WRT2
DA_WRB
P2
dac_wrb
DB7P2
DAC_DB7
P1
dac_db[7]
DB6P2
DAC_DB6
N2
dac_db[6]
DB5P2
DAC_DB5
N1
dac_db[5]
DB4P2
DAC_DB4
M2
dac_db[4]
DB3P2
DAC_DB3
M1
dac_db[3]
DB2P2
DAC_DB2
J1
dac_db[2]
DB1P2
DAC_DB1
J2
dac_db[1]
DB0P2
DAC_DB0
H1
dac_db[0]
X1

SYS_CLK
G1
clk
K1

SYS_RST
AB12
rst_n


module的名称定义为fir_prj,代码如下:

1
2
3
4
5
6
7
8
9
module fir_prj(
           clk       ,
           rst_n     ,
           key       ,
           dac_mode ,
           dac_sleep ,
           dac_clka  ,
           dac_da   ,
           dac_wra  ,
           dac_clkb  ,
           dac_db   ,
           dac_wrb               
           );

其中clkrst_n1位的输入信号,dac_dadac_db8位的输出信号,key3位输入信号,dac_modedac_clkadac_wradac_sleepdac_clkbdac_wrb是一位输出信号。

1
2
3
4
5
6
7
input             clk        ;
input             rst_n      ;
input  [ 3-1:0]    key        ;
output            dac_mode ;
output            dac_clka  ;
output [ 8-1:0]    dac_da    ;
output            dac_wra   ;
output            dac_sleep ;
output            dac_clkb  ;
output [ 8-1:0]    dac_db    ;
output            dac_wrb   ;


1.2 正弦信号设计
假设产生的正弦信号命名为sin_data信号。sin_data是从表XX中选择出来的值,该表一共有128个点。该表的产生方法,请看案例“信号发生器和DA转换”一章的内容。
采样点i
sin_data
16进制)
采样点i
sin_data
16进制)
采样点i
sin_data
16进制)
采样点i
sin_data
16进制)
0
7F
32
FE
64
7D
96
1
1
85
33
FE
65
77
97
1
2
8C
34
FE
66
70
98
2
3
92
35
FD
67
6A
99
3
4
98
36
FC
68
64
100
4
5
9E
37
FA
69
5E
101
6
6
A4
38
F8
70
58
102
7
7
AA
39
F6
71
52
103
A
8
B0
40
F4
72
4C
104
C
9
B6
41
F1
73
46
105
F
10
BC
42
EF
74
41
106
12
11
C1
43
EB
75
3C
107
15
12
C6
44
E8
76
36
108
19
13
CB
45
E4
77
31
109
1D
14
D0
46
E0
78
2C
110
21
15
D5
47
DC
79
28
111
25
16
DA
48
D8
80
23
112
2A
17
DE
49
D3
81
1F
113
2E
18
E2
50
CE
82
1B
114
33
19
E6
51
C9
83
17
115
38
20
EA
52
C4
84
14
116
3E
21
ED
53
BE
85
11
117
43
22
F0
54
B9
86
E
118
49
23
F3
55
B3
87
B
119
4E
24
F5
56
AD
88
9
120
54
25
F7
57
A7
89
7
121
5A
26
F9
58
A1
90
5
122
60
27
FB
59
9B
91
3
123
67
28
FC
60
95
92
2
124
6D
29
FD
61
8F
93
1
125
73
30
FE
62
89
94
1
126
79
31
FE
63
82
95
1
127
7F

很自然地定义一个7位的选择信号addr。我们只要控制好addr,就能方便得到sin_data。因此可以写出下面代码。

1
2
3
4
5
6
7
8
9
always  @(*)begin
    case(addr)
          0: sin_data = 8'h7F;
          1: sin_data = 8'h85;
          2: sin_data = 8'h8C;
          3: sin_data = 8'h92;
          4: sin_data = 8'h98;
          5: sin_data = 8'h9E;
          6: sin_data = 8'hA4;
          7: sin_data = 8'hAA;
          8: sin_data = 8'hB0;
          9: sin_data = 8'hB6;
         10: sin_data = 8'hBC;
         11: sin_data = 8'hC1;
         12: sin_data = 8'hC6;
         13: sin_data = 8'hCB;
         14: sin_data = 8'hD0;
         15: sin_data = 8'hD5;
         16: sin_data = 8'hDA;
         17: sin_data = 8'hDE;
         18: sin_data = 8'hE2;
         19: sin_data = 8'hE6;
         20: sin_data = 8'hEA;
         21: sin_data = 8'hED;
         22: sin_data = 8'hF0;
         23: sin_data = 8'hF3;
         24: sin_data = 8'hF5;
         25: sin_data = 8'hF7;
         26: sin_data = 8'hF9;
         27: sin_data = 8'hFB;
         28: sin_data = 8'hFC;
         29: sin_data = 8'hFD;
         30: sin_data = 8'hFE;
         31: sin_data = 8'hFE;
         32: sin_data = 8'hFE;
         33: sin_data = 8'hFE;
         34: sin_data = 8'hFE;
         35: sin_data = 8'hFD;
         36: sin_data = 8'hFC;
         37: sin_data = 8'hFA;
         38: sin_data = 8'hF8;
         39: sin_data = 8'hF6;
         40: sin_data = 8'hF4;
         41: sin_data = 8'hF1;
         42: sin_data = 8'hEF;
         43: sin_data = 8'hEB;
         44: sin_data = 8'hE8;
         45: sin_data = 8'hE4;
         46: sin_data = 8'hE0;
         47: sin_data = 8'hDC;
         48: sin_data = 8'hD8;
         49: sin_data = 8'hD3;
         50: sin_data = 8'hCE;
         51: sin_data = 8'hC9;
         52: sin_data = 8'hC4;
         53: sin_data = 8'hBE;
         54: sin_data = 8'hB9;
         55: sin_data = 8'hB3;
         56: sin_data = 8'hAD;
         57: sin_data = 8'hA7;
         58: sin_data = 8'hA1;
         59: sin_data = 8'h9B;
         60: sin_data = 8'h95;
         61: sin_data = 8'h8F;
         62: sin_data = 8'h89;
         63: sin_data = 8'h82;
         64: sin_data = 8'h7D;
         65: sin_data = 8'h77;
         66: sin_data = 8'h70;
         67: sin_data = 8'h6A;
         68: sin_data = 8'h64;
         69: sin_data = 8'h5E;
         70: sin_data = 8'h58;
         71: sin_data = 8'h52;
         72: sin_data = 8'h4C;
         73: sin_data = 8'h46;
         74: sin_data = 8'h41;
         75: sin_data = 8'h3C;
         76: sin_data = 8'h36;
         77: sin_data = 8'h31;
         78: sin_data = 8'h2C;
         79: sin_data = 8'h28;
         80: sin_data = 8'h23;
         81: sin_data = 8'h1F;
         82: sin_data = 8'h1B;
         83: sin_data = 8'h17;
         84: sin_data = 8'h14;
         85: sin_data = 8'h11;
         86: sin_data = 8'hE ;
         87: sin_data = 8'hB ;
         88: sin_data = 8'h9 ;
         89: sin_data = 8'h7 ;
         90: sin_data = 8'h5 ;
         91: sin_data = 8'h3 ;
         92: sin_data = 8'h2 ;
         93: sin_data = 8'h1 ;
         94: sin_data = 8'h1 ;
         95: sin_data = 8'h1 ;
         96: sin_data = 8'h1 ;
         97: sin_data = 8'h1 ;
         98: sin_data = 8'h2 ;
         99: sin_data = 8'h3 ;
        100: sin_data = 8'h4 ;
        101: sin_data = 8'h6 ;
        102: sin_data = 8'h7 ;
        103: sin_data = 8'hA ;
        104: sin_data = 8'hC ;
        105: sin_data = 8'hF ;
        106: sin_data = 8'h12;
        107: sin_data = 8'h15;
        108: sin_data = 8'h19;
        109: sin_data = 8'h1D;
        110: sin_data = 8'h21;
        111: sin_data = 8'h25;
        112: sin_data = 8'h2A;
        113: sin_data = 8'h2E;
        114: sin_data = 8'h33;
        115: sin_data = 8'h38;
        116: sin_data = 8'h3E;
        117: sin_data = 8'h43;
        118: sin_data = 8'h49;
        119: sin_data = 8'h4E;
        120: sin_data = 8'h54;
        121: sin_data = 8'h5A;
        122: sin_data = 8'h60;
        123: sin_data = 8'h67;
        124: sin_data = 8'h6D;
        125: sin_data = 8'h73;
        126: sin_data = 8'h79;
        127: sin_data = 8'h7F;
    endcase
end

接下来是设计信号addr
addr是用来控制选择数据的地址,通过控制addr的增加值,就能产生多种频率的正弦波。
以频率为100KHz的正弦信号为例。该正弦信号的周期是10000ns。本工程的工作时钟是20ns,也就是10000/20 = 500个时钟输出一个正弦信号,也就是500个时钟将上表的128个值输出一遍。


此内容由EEWORLD论坛网友njiggih原创,如需转载或用于商业用途需征得作者同意并注明出处

此帖出自FPGA/CPLD论坛

最新回复

帖子不错,棒  详情 回复 发表于 2018-11-19 10:33
点赞 关注(1)
个人签名官网:www.mdy-edu.com
 

回复
举报

48

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
帖子不错,棒
此帖出自FPGA/CPLD论坛

点评

可以加技术群,大家交流下  详情 回复 发表于 2018-11-19 11:11
 
 

回复

114

帖子

0

TA的资源

一粒金砂(中级)

板凳
 

可以加技术群,大家交流下
此帖出自FPGA/CPLD论坛
个人签名官网:www.mdy-edu.com
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表