赞
踩
FPGA 电路开发入门实验
第0章:基础知识
如图1,本实验使用实验板为altera DE0,板子型号为Cyclone Ⅲ, EP3C16F484C6,编译软件为QuartusⅡ9.0。
图 1 Quartus实验板设置
0.1 常用管脚
实验板中常用管脚有50MHz时钟、拨码开关、按钮、LED和八段数码管等。
表格 1 时钟、拨码开关、按钮、LED管脚分布
功能 |
管脚 |
板上位置 |
50MHz时钟 |
G21 |
|
B12 |
||
拨码开关 |
J6 |
sw0 |
H5 |
sw1 |
|
H6 |
sw2 |
|
G4 |
sw3 |
|
G5 |
sw4 |
|
J7 |
sw5 |
|
H7 |
sw6 |
|
E3 |
sw7 |
|
E4 |
sw8 |
|
D2 |
sw9 |
|
按钮 |
H2 |
button0 |
G3 |
button1 |
|
F1 |
button2 |
|
LED |
J1 |
LEDG0 |
J2 |
LEDG1 |
|
J3 |
LEDG2 |
|
H1 |
LEDG3 |
|
F2 |
LEDG4 |
|
E1 |
LEDG5 |
|
C1 |
LEDG6 |
|
C2 |
LEDG7 |
|
B2 |
LEDG8 |
|
B1 |
LEDG9 |
图 2 数码管管脚
0.2 signaltap介绍
SignalTap是由Altera公司开发的一个在线、片内信号分析的工具,为设计开发者验证所用。
用到signaltap的情况是当代码经过仿真没有问题,但加载到FPGA电路板后,发现功能不正确时,可以用signalTap工具进行分析,它的作用就类似于一个数字逻辑分析仪。利用signaltap基本上可以代替数字逻辑分析仪了,它是quartus里最常用的工具,必须熟练使用工具。
0.2.1 触发的概念
以模拟示波器为例,说明触发的概念。
(1)示波器的同步
要明白触发的概念,首先要了解示波器同步的概念。那么什么是示波器的同步呢?我们这里所说的示波器同步是指示波器的扫描信号与被观测的信号同步,也就是说它们的频率之间存在着整数倍的关系。
先了解一下示波器的工作原理。我们知道,示波器是通过在X和Y偏转板上加上控制电压,控制由电子枪射出电子束的偏转从而在屏幕上描绘出轨迹的,一般在X偏转板加的是正向锯齿波信号,线性上升的电压控制电子束从左到右移动,形成水平扫描。因为上升的电压与时间成线性关系,扫描得到的轨迹就可以模拟时间轴。如果同时在Y偏转板加上与被测信号成比例的电压,使电子束在水平移动的同时也在垂直方向移动,这样电子束就描绘出了被测信号与时间的关系,也就是信号的波形。这是示波器显示波形的基本原理。
Y是一周期性信号,X是扫描信号,显然它们是不同步的。显然它们在屏幕上的位置都不同,而且先后出现,所以看到的是它们的混合,得不到一个稳定的波形。这就是示波器的扫描与信号不同步的结果。
如果设法将X信号变成使每一次扫描开始时刻都对应于Y信号一个周期的同一点,使得每一次扫描对应的Y信号都相同,也就是让示波器的扫描信号与被测信号“同步”。当将这样的信号同时分别加到示波器的X和Y偏转系统时,由于每一个扫描周期X和Y的信号都相同,电子束受到同样的偏转控制,因而每一次扫描的电子束都打在屏幕上的同样的轨迹上。这是能看到的唯一波形,因为每一个扫描周期电子束都打在这个波形的轨迹上,而不是其他位置,因而这个波形是稳定的。这就是示波器扫描与信号同步的结果。
综上所述,如果要在示波器的屏幕上观察到稳定的波形,必要的条件是示波器的扫描信号要与被观察的信号保持同步关系。
那么,怎样才能使示波器的扫描信号与被观测信号保持同步关系呢?
(2)触发的作用
为了使扫描信号与被测信号同步,可以设定一些条件,将被测信号不断地与这些条件相比较,只有当被测信号满足这些条件时才启动扫描,从而使得扫描的频率与被测信号相同或存在整数倍的关系,也就是同步。这种技术我们就称为“触发”,而这些条件我们称其为“触发条件” 。
用作触发条件的形式很多,最常用最基本的就是“边沿触发”,即将被测信号的变化(即信号上升或下降的边沿)与某一电平相比较,当信号的变化以某种选定的方式达到这一电平时,产生一个触发信号,启动一次扫描。可以将触发电平选在0V,当被测信号从低到高跨越这个电平时,就产生一次扫描,这样就得到了与被测信号同步的扫描信号。其他的触发条件有“脉宽触发” 、“斜率触发” 、“状态触发” 等等,这些触发条件通常会在比较高档的示波器中出现。
0.2.2 SignalTapII原理
在使用signalTap前,先理解一下SignalTap的原理,这样就助于理解每个参数。
想观察一组信号,称之为“被测信号”(可以是多个),同时指定一个采样时钟。
想看这个被测信号,在其下降沿前后几个时钟内,被测信号的值是多少。那么“下降沿”就是触发条件。
当满足触发条件时,signaltap会将触发条件前后,时钟上升沿时的所有信号值保存到一个RAM当中。
可以指定触发条件前后采多少个样点。如果RAM比较大,那么可以保存的数据就比较多。如果RAM比较小,那么保存的数据自然少。(因此RAM大小决定了观察数据的多少)。
SignalTap将数据保存到RAM后,将读出RAM中的数据,然后逐个在显示器中显示出来(因此SignalTap看到的都是理想的,没有毛刺的信号)。
0.2.3 打开SignalTapII
打开Quartus后,在菜单栏中,选择“Tools”->”SignalTal II Logic Analyzer”,就可以打开SignalTap工具。
0.2.4 界面介绍
图 3 signaltap界面介绍
上面是SignalTap的界面,我们按照使用顺序简述地介绍每个部分功能。
红色标号1:下载线选择,点击setup选择硬件的USB接口
红色标号2:硬件检测,扫描有没有FPGA硬件。
红色标号3:选择工程配置文件。可以将综合后的sof文件加载进来
红色标号4:正式加载sof工程文件
红色标号5:设置采样时钟
红色标号6:设置RAM的大小
红色标号7:选择要观察的信号,并且设置触发条件
红色标号8:开始运行,等待触发条件满足后显示波形
红色标号9:这里可以观察FPGA资源使用情况。如果资源多于FPGA本身的资源,综合时会报错。
0.2.5 SignalTapII使用步骤
a 选择下载线、fpga芯片型号、工程配置文件
b 设置采样时钟、采样深度
这里我们选择clk50M作为采样时钟,注意采样时钟不一定是工程里的时钟,内部任何信号都可以是采样时钟。
这里我们将采样深度设置为128个。也就是我们总共能看到128采样点的数据。
c 选择采样信号
在setup窗口中,双击空白地方,弹出Node Finder界面
图 4 Node Finder界面
Filter是选择哪个阶段的信号,例如是综合前、综合后等,因为综合时会优化,有些信号可能就找不到了。我们一般选择pre-synthesis或Design Entry(all name)。
在Node Founder选择我们要观察的信号,添加到右边框即可。
d 设置触发条件
选择好信号后,设置触发条件。
在trigger Conditions一列中右击,将有6个选择。
don’t care:表示不关心,也就是说这个信号的值不影响触发条件。
Low :表示为0时触发,也就是说触发条件包括该信号的值为0.
Falling Edge:下降沿触发。即该信号的下降沿是触发条件
Rising Edge:上升沿触发。
High:给为1时触发
Either Edge:双沿触发,即有变化时触发。
以上是对一个信号的触发。如果触发条件包含多个信号,如下图所示:
注意,各信号之间触发条件是“与”的关系,而非是“或”的关系。
e 点击“Run Analysis”按钮,开始抓波形
f 观看结果
如果触发条件成立,则可在Data窗口观察到采样波形。
点击波形,则可以放大波形观看;右击波形,则是缩小波形。
实验1:项目创建、编译和下载
1.1 实验内容
用1个拨码开关控制所有LED灯亮灭
1.2 实验流程
· 新建项目
· 新建bdf文件添加input和output元件。bdf文件是该设计中的顶层文件。分析查看是否有错误
· 新建vwf文件,编译后运行仿真,查看波形,验证电路是否正确
· 使用assignments-pin planner配置fpga I/O管脚
· 下载文件至fpga,在菜单栏中选择tools-programmer。板子与电脑连接后打开电源。使用hardware setup确认板子与电脑连接无误,按下左栏start。如图
图1- 1 下载程序至FPGA
1.3 bdf文件
图1- 2 一个拨码开关控制10个LED
1.4 vwf文件
图1- 3 vwf图
可从图中看出,led等的亮灭由SW控制
1.5 配置管脚
图1- 4 LED管脚
图1- 5 拨码开关SW管脚
1.6 实验结果
将拨码开关拨到1,可看到所有LED灯亮起。
实验2:FPGA译码器组合逻辑
2.1 实验内容
1.放置2个2-4译码器模块,每个译码器分别有两个SW输入,4个LED输出
2.设计一个4-16译码器,4个SW输入,16个LED输出。将8个LED的管脚配置到的DE0开发板的一个7段共阳极数码管上。如图
使用SW输入0-9-A-F,共16个数字和字母,每个字母的显示有特定的共阳极编码。
2.2 两个2-4译码器
2.2.1 2-4译码器模块verilog代码
1. module decoder2to4(
2. input [1:0] IN,
3. output reg [3:0] OUT
4. );
5. always @(IN)
6. begin
7. case(IN)
8. 2'b00:OUT=4'b0001;
9. 2'b01:OUT=4'b0010;
10. 2'b10:OUT=4'b0100;
11. 2'b11:OUT=4'b1000;
12. endcase
13. end
14. endmodule
2.2.2 bdf顶层文件
· 注意粗线是总线,意思是多位数据通信
· 改变output和总线的名称为XXX[n..0]形式,对应数据位数为n+1
图2- 1 2个2-4译码器bdf图
2.2.3 RTL图
图2- 2 顶层RTL图
图2- 3 2-4译码器模块RTL图
双击顶层文件中的decoder2to4,可查看2-4译码器的RTL图。由图可知,2-4译码器的主要组成部分是输入输出和DECODER。
2.2.4 管脚配置
· pins in bdf: bdf文件中输入输出的管脚名称
· pins in DE0: DE0开发板上管脚
· pins in FPGA: FPGA内部管脚
pins in bdf |
pins in DE0 |
pins in FPGA |
sw0 |
SW0 |
PIN_J6 |
sw1 |
SW1 |
PIN_H5 |
sw3 |
SW2 |
PIN_H6 |
sw4 |
SW3 |
PIN_G4 |
LED1[0] |
LEDG0 |
PIN_J1 |
LED1[1] |
LEDG1 |
PIN_J2 |
LED1[2] |
LEDG2 |
PIN_J3 |
LED1[3] |
LEDG3 |
PIN_H1 |
LED2[0] |
LEDG4 |
PIN_F2 |
LED2[0] |
LEDG5 |
PIN_E1 |
LED2[1] |
LEDG6 |
PIN_C1 |
LED2[2] |
LEDG7 |
PIN_C2 |
2.2.5 实验结果
将程序下载到板子上,拨动开关为00、10,可观察到亮起等为LDEG0(第一组第0个)和LEDG6(第二组第2个)。
2.3 4-16译码器,数码管显示值0-F
2.3.1 程序:4-16译码器输出共阳极数码管编码
程序中的parameter C0-Cf是共阳极数码管显示0-F的16进制编码。
1. module decoder(
2. input [3:0] data_in,
3. output reg [7:0]data_out
4. );
5. parameter C0=8'hc0,
6. C1=8'hf9,
7. C2=8'ha4,
8. C3=8'hb0,
9.
10. C4=8'h99,
11. C5=8'h92,
12. C6=8'h82,
13. C7=8'hf8,
14.
15. C8=8'h80,
16. C9=8'h90,
17. Ca=8'h88,
18. Cb=8'h83,
19.
20. Cc=8'hc6,
21. Cd=8'ha1,
22. Ce=8'h86,
23. Cf=8'h8e;
24.
25. always @(data_in)
26. begin
27.
28. case(data_in)
29. 4'b0000:begin data_out=C0; end
30. 4'b0001:begin data_out=C1; end
31. 4'b0010:begin data_out=C2; end
32. 4'b0011:begin data_out=C3; end
33. 4'b0100:begin data_out=C4; end
34. 4'b0101:begin data_out=C5; end
35. 4'b0110:begin data_out=C6; end
36. 4'b0111:begin data_out=C7; end
37. 4'b1000:begin data_out=C8; end
38. 4'b1001:begin data_out=C9; end
39. 4'b1010:begin data_out=Ca; end
40. 4'b1011:begin data_out=Cb; end
41. 4'b1100:begin data_out=Cc; end
42. 4'b1101:begin data_out=Cd; end
43. 4'b1110:begin data_out=Ce; end
44. 4'b1111:begin data_out=Cf; end
45. endcase
46. end
47. endmodule
2.3.2 bdf文件
图2- 4 十六位译码器bdf图
2.3.3 RTL图
图2- 5 十六位译码器RTL图顶层
图2- 6 十六位译码器+输出共阴极编码
双击顶层RTL图的decoder,显示出4-16译码输出共阴极编码的RTL图。
将Decoder0展开,可以看到译码输出后,使用逻辑或将译码器的16个输出整合成8位输出。
例如图中红线,当data_in==4'b0100时,根据程序,data_out应为C4=8'h99。从RTL中可以看出,WideOr0-6=1001100,则data_out[7..0]={WideOr0-6,1'h1}=8'b10011001=8'h99。和程序中输出一致。
2.3.5 配置管脚
图2- 7 pin planner中配置管脚情况
2.3.6 实验结果
将SW4的拨码开关拨至1,其他为0,数码管的输出为4.
实验3:计数器波形仿真和signalTap
3.1 实验内容
· 设计0-17计数器,当计数值为17时,OV输出为1,其他输出为0
· 当技术值为0-8时,OV输出0,9-17时,OV输出为1
· 学会signaltap的使用
3.2 0-17计数器
3.2.1 0-17计数器代码
1. module counter17(
2. input rst,
3. input clk,
4. output reg[4:0] counter_output,
5. output ov
6. );
7. parameter COUNT_NUM=17;
8. assign ov=(counter_output==17)?1:0;
9. always @(posedge clk or negedge rst)
10. begin
11. if(!rst)
12. begin
13. counter_output<=4'd0;
14. end
15. else
16. begin
17. if(counter_output<COUNT_NUM)
18. begin counter_output<=counter_output+1'b1; end
19. else
20. begin counter_output<=4'b0; end
21. end
22. end
23. endmodule
3.2.2 bdf文件
图3- 1 0-17计数器bdf图
3.2.3 RTL图
图3- 2 0-17计数器RTL顶层图(含输入输出)
图3- 3 0-17计数器RTL图
3.2.4 vwf波形
图3- 4 0-17计数器vwf波形
由图可以看出,当计数值为17时,OV输出为1,其他输出为0
3.2.5 signaltap波形
signaltap使用流程
· 菜单栏选择新建文件,选择signaltap
· setup页面添加采样时钟,即为fpga的输入时钟
· 分析/编译后添加待观察信号
· 编译,并将程序下载到开发板上。因为改变观察信号就改变了电路
· 运行得出波形如下
图3- 5 0-17计数器signaltap波形
可以看出,和vwf文件中的仿真波形一致
3.3 0-17计数器,0-8时OV输出0,9-17输出1
3.3.1 计数器程序
计数器在0-8时输出0,9-17时输出1
1. module counter20(
2. input rst,
3. input clk,
4. output reg[4:0] counter_output,
5. output ov
6. );
7. parameter COUNT_NUM=17;
8. assign ov=(counter_output>8)?1:0;
9. always @(posedge clk or negedge rst)
10. begin
11. if(!rst)
12. begin
13. counter_output<=4'd0;
14. end
15. else
16. begin
17. if(counter_output<COUNT_NUM)
18. begin counter_output<=counter_output+1'b1; end
19. else
20. begin counter_output<=4'b0; end
21. end
22. end
23. endmodule
3.3.2 bdf文件
图3- 6 计数器bdf图
3.3.3 RTL图
图3- 7 顶层RTL图
图3- 8 计数器RTL图
此计数器RTL图与前一个计数器的基本一致,除了OV输出条件值不同。
3.3.4 vwf文件
图3- 9 计数器vwf波形
本实验中,0-8时刻OV为0,9-17时刻为1。
3.3.5 signaltap波形
图3- 10 计数器signaltap波形
signaltap的波形与vwf仿真波形一致。
3.3.6 思考题:LED灯的状态
当时钟是50MHz,把OV接到LED上,LED常亮。因为虽然OV输出1是周期性的,但周期过小,根据视觉残留效应,LED灯看起来并没有变化。
实验4:时间基准电路和带使能的多周期计数器
4.1 时间基准电路介绍及实验内容
1.时间基准电路介绍
· 定时发出窄脉冲
2.典型情况时序
· 每T时间,生成一个宽度为P时间的脉冲
· 电路的工作时钟周期为P
· 使用一个计数器实现该时序
3.本实验设计目标
* 设计时间基准电路和带使能的多周期计数器
* 时间基准电路生成同步时间基准信号
* 本质上是两级计数器级联的电路结构:第一级计数器生成时间基准信号,第二级计数器用时间基准信号作为计数使能
4.实验内容
· 第一个实验是第一级计数器计数范围为25000000,第二级计数器计数范围为0-15。将计数器0-15计数值经过译码,在DE0的数码管上显示为0-9-a-f的十六进制数
· 第二个实验是修改时间基准发生器,设计使用两个数码管计时,范围0-9.9,精度为0.1。并给计时器增加清零和暂停功能
4.2 signaltap分段触发
signaltap的分段触发是一种高级触发方式。具体操作见0.2节。
4.2.1 操作过程
· 选择触发信号en_out,查看en_out改变时其他信号的值
· 如图选中segmented模式,6段8样点
· 如图每次抓取触发事件附近的波形样点,抓取多次
图4- 1 signaltap设置
4.2.2 分段触发的捕获原理
· 一次填充一段数据RAM
· 多次填充
· 全部RAM被填充后,由JTAG送PC机
4.3 计数器显示十六进制数字
4.3.1 模块代码
本文件包含的模块有第一级0.5计数器,第二级0-15计数器和十六进制译码器
(1) 0.5s计数器
1. // clock frequency is 50Mhz, accuracy is 0.1s, 10hz.50M/10=5M, 23bit
2. module cnt_sync(
3. input clk,
4. output reg [31:0] CNTVAL,
5. output OV
6. );
7. parameter MAX_VAL=25_000_000;
8. always @(posedge clk)
9. if(CNTVAL>=MAX_VAL)begin CNTVAL<=0; end
10. else begin CNTVAL<=CNTVAL+1'b1; end
11.
12. assign OV=(CNTVAL==MAX_VAL)?1:0;
13. endmodule
(2) 0-15计数器
1. module cnt_en(
2. input clk,
3. input en,
4. output reg[3:0] CNTVAL,
5. output OV
6. );
7. always @(posedge clk)
8. if(en)
9. begin
10. if(CNTVAL>=15)begin CNTVAL<=0; end
11. else begin CNTVAL<=CNTVAL+1'b1; end
12. end
13. else
14. begin
15. CNTVAL<=CNTVAL;
16. end
17. assign OV=(CNTVAL==15)?1:0;
18. endmodule
(3) 十六进制译码器
1. module decoder(
2. input [3:0] data_in,
3. output reg [7:0]data_out
4. );
5. parameter C0=8'hc0,
6. C1=8'hf9,
7. C2=8'ha4,
8. C3=8'hb0,
9.
10. C4=8'h99,
11. C5=8'h92,
12. C6=8'h82,
13. C7=8'hf8,
14.
15. C8=8'h80,
16. C9=8'h90,
17. Ca=8'h88,
18. Cb=8'h83,
19.
20. Cc=8'hc6,
21. Cd=8'ha1,
22. Ce=8'h86,
23. Cf=8'h8e;
24.
25. always @(data_in)
26. begin
27.
28. case(data_in)
29. 4'b0000:begin data_out=C0; end
30. 4'b0001:begin data_out=C1; end
31. 4'b0010:begin data_out=C2; end
32. 4'b0011:begin data_out=C3; end
33. 4'b0100:begin data_out=C4; end
34. 4'b0101:begin data_out=C5; end
35. 4'b0110:begin data_out=C6; end
36. 4'b0111:begin data_out=C7; end
37. 4'b1000:begin data_out=C8; end
38. 4'b1001:begin data_out=C9; end
39. 4'b1010:begin data_out=Ca; end
40. 4'b1011:begin data_out=Cb; end
41. 4'b1100:begin data_out=Cc; end
42. 4'b1101:begin data_out=Cd; end
43. 4'b1110:begin data_out=Ce; end
44. 4'b1111:begin data_out=Cf; end
45. endcase
46. end
47.
48.
49. endmodule
4.3.2 bdf文件
图4- 2 计数器显示十六进制译码bdf图
4.3.3 RTL图
图4- 3 顶层RTL图
图4- 4 0.5s计数器RTL图
图4- 5 0-15计数器RTL图
图4- 6 十六进制译码器+数码管显示RTL图
4.3.4 vwf文件
图4- 7 vwf波形
可以看出vwf文件1ms内各项输出基本无变化,因此要使用signaltap分段触发。
4.3.5 signaltap波形
图4- 8 signaltap波形
使用了分段触发方式,可以观察到在en_out上升沿时各信号改变情况。
4.4 0-9.9计时器
· 设计使用两个数码管计时,范围0-9.9,精度为0.1
· 给计时器增加清零(rst)和暂停(stop)功能
4.4.1 模块代码
使用模块包括0.1s计数器和1s计数器,10s计数器,两个数码管显示分别从0到9
(1) 0.1s计数器
注意事项:
· 0.1s计数器
· 按下<
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。