本次设计采用FPGA
与D/A转换器
完成四种波形的产生:递增斜波;递减斜波;三角波;递增阶梯波。
D/A转换器
的功能是把二进制数字量电信号转换为与其数值成正比的模拟量电信号。在D/A参数中一个最重要的参数就是分辨率,它是指输入数字量发生单位数码变化时,所对应输出模拟量(电压或电流)的变化量。
本次以FPGA
芯片EP3C10E144C8
与廉价的并行8位D/A转换
芯片AD558
完成设计。
AD558芯片
功能框图
可看出AD558
由四个主要的功能块(控制逻辑、锁存器、DAC、能隙参考)固化在一个集成块上,而且内部有高速输出缓冲放大器、接换电阻与调节电阻,所以接口特别简单,且使用时无须外部调整即可获得±1/2LSB
精度的电压。在该模块的锁存器和控制逻辑部分应用了低功率、小体积、高速度的IPL设计(IPL是一个完全兼容的线性双极性低功率的功能块结构)。这便使模块具有体积小、功耗低、速度快等特点。
主要性能
- 单电源供电(+5V~+15V)
- 完全8位D/A转换
- 内部标准能隙参考
- 完全兼容的微处理接口
- 无须外部电路补偿
- 建立时间快:
1μs
- 功耗:
75mW
- 低价格
- 封装:DIP16和PLCC20
引脚图和引脚名称
引脚 | 符号 | 功能 |
---|---|---|
1~8 | DB0~DB7 | 数字量输入 |
9 | CE/ | 使能端,CE/与CS/同时为低电平,选中芯片。 |
10 | CS/ | 片选端,和9脚共同决定是否选择芯片。 |
11 | +VCC | 为供电电源(+5V~+15V) |
12、13 | GND | 接地端 |
14、15 | VoutSENSE、VoutSELECT | 输出电压选择端(0~2.56v)或(0~10V) |
16 | Vout | 模拟电压输出端 |
控制时序
可以看出,当CE/
和CS/
有一个为'1'时,锁存器工作,锁存输入的信号。直到CE/
和CS/
全为'0',开始下一个数据的转换。
因为我们的转换结果是实时输出的,所以只需将CE/
和 CS/
同时置为'0'就可以完成了。
verilog实现
递增斜波模块
对于输出是递增斜波,我们可采用0~255
循环加法计数器实现。
module juchibo_ad(
input clk,
input rst_n,
output reg[7:0]daout
);
reg [7:0] tmp;
always @(posedge clk or negedge rst_n)begin
if (!rst_n)
tmp<=8'b0000_0000;
else if(tmp==8'b1111_1111)
tmp<=8'b0000_0000;
else
tmp<=tmp+1'b1;
daout<=tmp;
end
endmodule
递减斜波模块
对于输出是递减斜波,我们可采用255~0
循环减法计数器实现。
module juchibo_re(
input clk,
input rst_n,
output reg[7:0]daout
);
reg [7:0] tmp;
always @(posedge clk or negedge rst_n)begin
if (!rst_n)
tmp<=8'b1111_1111;
else if(tmp==8'b0000_0000)
tmp<=8'b1111_1111;
else
tmp<=tmp-1'b1;
daout<=tmp;
end
endmodule
三角波模块
对于输出是三角波,我们可采用0~255~0
循环加/减法计数器实现。
module sanjiaobo(
input clk,
input rst_n,
output reg[7:0]daout
);
reg [7:0] tmp;
reg flag;
always @(posedge clk or negedge rst_n)begin
if (!rst_n)begin
tmp<=8'b0000_0000;
flag<=0;
end
else if(flag==0)begin
if(tmp==8'b1111_1110)begin
tmp<=8'b1111_1111;
flag<=1;
end
else
tmp<=tmp+1'b1;
end
else begin
if(tmp==8'b0000_0001)begin
tmp<=8'b0000_0000;
flag<=0;
end
else
tmp<=tmp-1'b1;
end
daout<=tmp;
end
endmodule
阶梯波模块
对于输出是递增阶梯波,我们可采用00H
、20H
、40H
、60H
、80H
、A0H
、C0H
、E0H
不同进制计数器实现。
module jiebo(
input clk,
input rst_n,
output reg[7:0]daout
);
reg [3:0] sum;
always @(posedge clk or negedge rst_n)begin
if (!rst_n)
sum<=4'd0;
else if(sum==4'd7)
sum<=4'd0;
else
sum<=sum+1;
case(sum)
4'd0: daout<=8'h00;
4'd1: daout<=8'h20;
4'd2: daout<=8'h40;
4'd3: daout<=8'h60;
4'd4: daout<=8'h80;
4'd5: daout<=8'ha0;
4'd6: daout<=8'hc0;
4'd7: daout<=8'he0;
default: daout<=8'h00;
endcase
end
endmodule
控制模块
这里输入的en
,对应两位拨码开关。其状态00
~11
对应四种波形输出。
module control(
input clk,
input [1:0] en,
input [7:0] juchibo_ad,
input [7:0] juchibo_re,
input [7:0] sanjiaobo,
input [7:0] jiebo,
output reg[7:0] daout
);
always @(posedge clk)begin
case(en)
2'b00: daout<=juchibo_ad;
2'b01: daout<=juchibo_re;
2'b10: daout<=sanjiaobo;
2'b11: daout<=jiebo;
default: daout<=juchibo_ad;
endcase
end
endmodule
顶层文件
例化,综合。就是将各个模块连接起来就行了。
module main(
input clk,
input rst_n,
input [1:0]en,
output [7:0]daout
);
wire [7:0] juchibo_ad;
wire [7:0] juchibo_re;
wire [7:0] sanjiaobo;
wire [7:0] jiebo;
juchibo_ad u_juchibo_ad(
.clk (clk),
.rst_n (rst_n),
.daout (juchibo_ad)
);
juchibo_re u_juchibo_re(
.clk (clk),
.rst_n (rst_n),
.daout (juchibo_re)
);
sanjiaobo u_sanjiaobo(
.clk (clk),
.rst_n (rst_n),
.daout (sanjiaobo)
);
jiebo u_jiebo(
.clk (clk),
.rst_n (rst_n),
.daout (jiebo)
);
control control(
.clk (clk),
.en (en),
.juchibo_ad (juchibo_ad),
.juchibo_re (juchibo_re),
.sanjiaobo (sanjiaobo),
.jiebo (jiebo),
.daout (daout)
);
endmodule
EP3C10E144C8
管脚配置
Quartus II
里RTL原理图
验证
进行相关连线后,下载程序。通过示波器观察,可以看出:
拨码开关处于0,0
时输出递增斜波
拨码开关处于0,1
时输出递减斜波
拨码开关处于1,0
时输出三角波
拨码开关处于1,1
时输出阶梯波
2 条评论
《逃离“自由”电影院》剧情片高清在线免费观看:https://www.jgz518.com/xingkong/3528.html
哈哈哈,写的太好了https://www.cscnn.com/