标题:
基于FPGA的信号发生器程序
[打印本页]
作者:
阳光少年lhy
时间:
2018-12-5 23:03
标题:
基于FPGA的信号发生器程序
基于FPGA的信号发生器
三角波
//clk:时钟信号
//reset:复位信号
//triangle_out:三角波输出
module triangle(clk,reset,triangle_out);
input clk,reset;
output[7:0] triangle_out;
reg[7:0] triangle_out;
reg[7:0] num; //计数器
reg reg_1; //加减控制器
always@(posedge clk or posedge rest)
begin
if(reset)
num<=0; //当复位信号为1时输出为0
else if(reg_1==0)
begin
if(num==8’b11111000)
begin
num<=255;
reg_1<=1; //加至最大值,开始进行减法
end
else
num<=num+8; //进行加8运算,取出32个点
end
else if(num==8’b00000111)
begin
num<=0;
reg_1<=0; //准备进行加法
end
else
begin
num<=num-8; //进行减8运算,需要取出32个点
end
end
always@(num)
begin
triangle_out<=num;//将取出的点输出,即可实现三角波
end
endmodule
正弦波
//clk:时钟信号
//reset:复位信号
//sin_out:正弦波输出
Module sin(clk,reset,sin_out);
Input clk,reset;
output[7:0]sin_out;
reg[7:0]sin_out;
reg[6:0]num;
always@(posedge clk or posedge reset)
begin
if(reset)
sin_out<=0;
else if(num==63) //共需要64个点
num<=0;
else
num<=num+1;
case(num) //每个点一一对应的数据
0:sin_out<=255;
1:sin_out<=254;
2:sin_out<=252;
3:sin_out <=249;
4:sin_out <=245;
5:sin_out<= 239;
6:sin_out <= 23;
7:sin_out<= 225;
8:sin_out<=217;
9:sin_ out <=207;
10:sin out<=197;
11:sin out<= 186;
12:sin out <=174;
13:sin_out<=162;
14:sin_out<=150;
15:sin_out<=137;
16:sin_out<=124;
17:sin_out<=112;
18:sin_out<=99;
19:sin_out<=87;
20:sin_out<=75;
21:sin_out<=64;
22:sin_out<=53;
23:sin_out<=43;
24:sin_out<=34;
25:sin_out<=26
26:sin_out<=19;
27:sin_out<=13;
28:sin_out<=8;
29:sin_out<=4;
30:sin_out<=1;
31:sin_out<=0;
32:sin_out<=0;
33:sin_out<=1;
34:sin_out<=4;
35:sin_out<=8;
36:sin_out<=13;
37:sin_out<=19;
38:sin_out<=26;
39:sin_out<=34;
40:sin_out<=43;
41:sin_out<=53;
42:sin_out<=64;
43:sin_out<=75;
44:sin_out<=87;
45:sin_out<=99;
46:sin_out<=112;
47:sin_out<=124;
48:sin_out<=137;
49:sin_out<=150;
50:sin_out<=l62;
51:sin_out<=174;
52:sin_out<=186;
53:sin_out<=197;
54:sin_out<=207;
55:sin_out<=217;
56:sin_out<=225;
57:sin_out<=233;
58:sin_out<=239;
59:sin_out<=245;
60:sin_out<= 249;
61:sin_out <= 252;
62:sin_out <= 254;
63:sin_out <= 255;
default:sin_ out<=8 'bx;
endcase
end
endmodule
//clk:时钟信号
//reset:复位信号
//square:方波输出
module square( clk,reset,square_out) ;
input clk,reset;
output[7:0] square_ out;
reg[7:0] square_out;
reg[5:0] num;
reg reg_2;
always @( posedge clk or posedge reset)
begin
if( reset)
reg_2<=0; //当复位信号为1时,输出为0
else if(num<31)//分频
else
begin
num<=0;
reg 2<=~reg_ 2;
end
case(reg_2)
1:squae _out<=255;
0:square_out <=0;
endcase
end
endmodule
控制模式
//triangle_ctrl:三角波控制信号
//sin_ctrl:正弦波控制信号
//square_ctrl:方波控制信号
// triangle:三角波
//sin:正弦波
//square:方波
//wave_out:输出波形
module control( triangle _ctrl ,sin_ ctrl, square_ctrl,triangle,sin, square,wave_out);
input triangle_ ctrl ,sin _ctrl ,square ctrl;
input[ 7:0] triangle,sin,square;
output[ 7:0] wave_out;
reg[ 7:0] wave_ out;
reg[2:0]sel;
reg[9:0] a,b,c,d,e;
always@( triangle_ctrl or sin_ctrl or square_ctrl or triangle or sin or square)
begin
sel={triangle_ctrl,sin_ctrl,sqpuare_ctrl }; //控制信号
case(sel)
3'b100:wave_out=triangle;
3'b010:wave_out=sin;
3'b001:wave_out=square;
3'b011: //方波和正弦波的线性组合
begin
a= triangle + sin;
wave_out=a[8:1];
end
3'b101: //三角波和方波的线性组合
begin
a = triangle + square;
wave_ out=a[8:1];
end
3 'b110: //三角波和正弦波的线性组合
begin
a= square + sin;
wave_ out=a[8:1];
end
3'b111: //三角波、正弦波和方波的线性组合
begin
a= triangle + square;
b=a + sin;
c=b[9:2];
d=a[9:4];
e=a[9:6];
a=c +d;
b=a +e;
wave_out=b[7:0];
end
defalt:wave_ out=8 'bx;
endcase
end
endmodule
//clk:系统时钟信号
//reset:复位信号
//p:频率调节信号,p=系统时钟频率/产生频率/2
module div_ctrl(clk,p,clk_out,reset)
input clk,reset;
input[ 10:0] p ;
output clk_out;
reg clk_ out;
reg temp;
reg [10:0] count ;
always@(posedge clk or posedage reset)
begin
if( reset)clk_out<=0;//复位信号为1时,输出为0
else if(temp==0)
begin
count<=p-1;
temp<=1;
end
else if(count==1)
begin
temp<=0;
clk_out<=~clk_out;
end
else
begin
count <= count-1;
end
end
endmodule
module signal_gennerator(clk,reset,k,triangle,sin,square,wave);
input clk,reset;
input[10:0] k;
input triangle,sin,square;
output[7:0] wave;
wire[7:0] triangle_1,sin_1,square_1;
wire clk_1;
div_ctrl U1(.clk(clk),.reset(reset),.p(k),.clk_(clk_1));
control U2(.triangle_ctrl(triangle),.sin_ctrl(sin),.square_ctrl(square),.triangle(triangle_1),
.sin(sin_1),.square(square_1),.wave_out(wave));
triangle U3(.clk(clk_1),.reset(reset),.triangle_out(triangle_1));
sin U4(.clk(clk_1),.reset(reset),.sin_out(sin_1));
square U5(.clk(clk_1),.reset(reset),.square_out(square_1));
endmodule
复制代码
基于FPGA的信号发生器.docx
2018-12-5 23:02 上传
点击文件名下载附件
下载积分: 黑币 -5
15.97 KB, 下载次数: 41, 下载积分: 黑币 -5
信号发生器
作者:
tyrl800
时间:
2019-9-7 22:42
还是DDS有效
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1