前言:
本文主要介绍了EDA原理与应用这门课程的相关实验及代码。使用的软件是Quartus Ⅱ,该实验使用fpga芯片为cycloneⅤ 5CSEMA5F31C6。
(一)实验目的
(1)学习复杂数字系统设计;
(2)学习用LPM(Library of Parameterized Modules 参数可设置模块库)进行设计;
(3)了解Verilog产生VGA显示时序的方法;
(4)学习用在线逻辑分析仪SignalTap观察FPGA产生的信号;
(5)培养工程思维及创新思维。
(二)实验要求
自选一个具有创意的数字系统综合应用题目,划分功能模块,设计调试完成。
以信号发生器设计为例------
基本设计要求(每个同学必须完成,独立验收考核)----LPM定制信号发生器:
(1)数字化波形数据存在ROM中,ROM用LPM进行设计;
(2)正弦波或方波、锯齿波波形可选并数码管显示所选波形种类;
(3)信号频率、幅度可调并用数码管显示频率和幅值;
(4)用SignalTap逻辑仪器观察信号波形。
(三)实验代码
rom元件配置方法
配置好三种形式的波形后用顶层文件调用
实验代码:
module LPM(
input clk, /*时钟输入*/
input rst, /*低电平置0*/
input tp, //调节频率
input tf, //调节幅度
input mode_an,
output reg [7:0] q , /*输出*/
output reg [6:0] SG0,SG1,SG2,SG3,SG4,SG5
);
/***************address generate***************/
wire [5:0] addr;
reg [31:0] cnt;
reg [31:0] pin;
reg [3:0] fu;
reg [1:0] mode;
wire [7:0] q1,q2,q3;
reg [5:0] dp;
always@(posedge clk or negedge rst)
begin
if(!rst)
begin cnt <= 32'd0;pin<=32'h10000000;fu<=4'd1; dp<=6'd2;end
else
begin
cnt <= cnt+pin;
if(!tp)
begin
dp<=dp*2;pin<=pin<<1;
if(dp==6'd4)
dp<=6'd1;
if(pin==32'h20000000)
pin<=32'h08000000;
end
if(!tf)
begin
fu<=fu+1;
if(fu==4)
fu<=4'd1;
end
end
end
assign addr = cnt[31:26] ;
/***********ROM instance**********************/
rom_1 ROM_1(
.address(addr),
.clock(clk),
.q(q1)
);
rom_f ROM_f(
.address(addr),
.clock(clk),
.q(q2)
);
rom_j ROM_j(
.address(addr),
.clock(clk),
.q(q3)
);
always@(posedge clk or negedge rst)
begin
if(!rst)
begin
mode<=0;
end
else
begin
if(!mode_an)
begin
mode<=mode+1;
if(mode==3)
mode<=0;
end
case(mode)
0: begin
q<=q1*fu/5;
end
1:begin
q<=q2*fu/5;
end
2:begin
q<=q3*fu/5;
end
default begin mode<=0;q<=q1*fu/5; end
endcase
end
end
wire [3:0] dpb,dps,dpg;
wire [3:0] dfs,dfg;
assign dpb=dp/100;assign dps=dp%100/10;assign dpg=dp%10;
assign dfs=fu/10;assign dfg=fu%10;
always@(posedge clk)
begin
case(mode)
0:SG5<=7'b1000000; 1:SG5<=7'b1111001;
2:SG5<=7'b0100100; 3:SG5<=7'b0110000;
4:SG5<=7'b0011001; 5:SG5<=7'b0010010;
6:SG5<=7'b0000010; 7:SG5<=7'b1111000;
8:SG5<=7'b0000000; 9:SG5<=7'b0010000; //7段译码值
endcase
case(dpb)
0:SG4<=7'b1000000; 1:SG4<=7'b1111001;
2:SG4<=7'b0100100; 3:SG4<=7'b0110000;
4:SG4<=7'b0011001; 5:SG4<=7'b0010010;
6:SG4<=7'b0000010; 7:SG4<=7'b1111000;
8:SG4<=7'b0000000; 9:SG4<=7'b0010000; //7段译码值
endcase
case(dps)
0:SG3<=7'b1000000; 1:SG3<=7'b1111001;
2:SG3<=7'b0100100; 3:SG3<=7'b0110000;
4:SG3<=7'b0011001; 5:SG3<=7'b0010010;
6:SG3<=7'b0000010; 7:SG3<=7'b1111000;
8:SG3<=7'b0000000; 9:SG3<=7'b0010000; //7段译码值
endcase
case(dpg)
0:SG2<=7'b1000000; 1:SG2<=7'b1111001;
2:SG2<=7'b0100100; 3:SG2<=7'b0110000;
4:SG2<=7'b0011001; 5:SG2<=7'b0010010;
6:SG2<=7'b0000010; 7:SG2<=7'b1111000;
8:SG2<=7'b0000000; 9:SG2<=7'b0010000; //7段译码值
endcase
case(dfs)
0:SG1<=7'b1000000; 1:SG1<=7'b1111001;
2:SG1<=7'b0100100; 3:SG1<=7'b0110000;
4:SG1<=7'b0011001; 5:SG1<=7'b0010010;
6:SG1<=7'b0000010; 7:SG1<=7'b1111000;
8:SG1<=7'b0000000; 9:SG1<=7'b0010000; //7段译码值
endcase
case(dfg)
0:SG0<=7'b1000000; 1:SG0<=7'b1111001;
2:SG0<=7'b0100100; 3:SG0<=7'b0110000;
4:SG0<=7'b0011001; 5:SG0<=7'b0010010;
6:SG0<=7'b0000010; 7:SG0<=7'b1111000;
8:SG0<=7'b0000000; 9:SG0<=7'b0010000; //7段译码值
endcase
end
endmodule
(四)实验仿真
①modelsim仿真
②使用SignalTap II Logic Analyzer
均见于quartus 仿真介绍最后面