实验1:项目创建、编译和下载
学生实验:用1个拨码开关控制所有的LED灯亮灭
bdf图:
实验效果:
实验2:FPGA译码器组合逻辑
学生实验:1、放置2个2-4译码器模块,则总共有2组SW, 每组2个,2组LED,每组4个,每组 SW分别控 制其对应的LED组。
bdf图:
实验效果:
• 2、参照代码,设计一个3-8译码器,完成类似 的拨码开关实验。注意代码中的信号宽 度设定。
代码:
module rtl_module(IN,OUT);
input [3-1:0]IN;
output reg [8-1:0]OUT;
always @(IN) begin
case(IN)
3'b000: OUT = 8'b00000001;
3'b001: OUT = 8'b00000010;
3'b010: OUT = 8'b00000100;
3'b011: OUT = 8'b00001000;
3'b100: OUT = 8'b00010000;
3'b101: OUT = 8'b00100000;
3'b110: OUT = 8'b01000000;
3'b111: OUT = 8'b10000000;
endcase
end
endmodule
实验效果:
• 3、自行查阅手册中的7段译码器管脚对应关系, 用4个拨码开关控制一个7段译码器的 数字,从 0-9-A-F,共16个数字和字母。
代码:
module dec_4to16(
IN ,
OUT );
input [4-1:0] IN;
output [8-1:0] OUT;
reg [8-1:0] OUT;
always @ (IN) begin
case(IN)
4'b0000: OUT = 7'b1000000;
4'b0001: OUT = 7'b1111001;
4'b0010: OUT = 7'b0100100;
4'b0011: OUT = 7'b0110000;
4'b0100: OUT = 7'b0011001;
4'b0101: OUT = 7'b0010010;
4'b0110: OUT = 7'b0000010;
4'b0111: OUT = 7'b1111000;
4'b1000: OUT = 7'b0000000;
4'b1001: OUT = 7'b0010000;
4'b1010: OUT = 7'b0001000;
4'b1011: OUT = 7'b0000011;
4'b1100: OUT = 7'b1000110;
4'b1101: OUT = 7'b0100001;
4'b1110: OUT = 7'b0000110;
4'b1111: OUT = 7'b0001110;
endcase
end
endmodule
实验3:计数器波形仿真和signalTap
学生实验:
1、参照代码,设计一个0-17的计数器,当 计数值为17的时候,OV输出1,其他输出0, 注意设定合理的信号位宽。
代码:
module cnt_0to17(
CLK ,
CNTVAL,
OV );
input CLK;
output [4:0] CNTVAL;
output OV;
reg [4:0] CNTVAL;
reg OV;
always @ (posedge CLK) begin
if(CNTVAL >= 17)
CNTVAL <= 0;
else
CNTVAL <= CNTVAL + 1'b1;
end
always @ (CNTVAL) begin
if(CNTVAL ==17)
OV = 1'b1;
else
OV = 1'b0;
end
endmodule
RTL Viewer:
仿真图像:
signaltap的图像:
2、针对以上计数器,修改输出逻辑,当计 数值为0-8时,OV输出0,9-17时OV输出1
用SignalTap验证
尝试并思考,如果时钟是50MHz,把OV接 到一个LED上,能看见什么现象,为什么?
代码:
module cnt_0to17(
CLK ,
CNTVAL,
OV );
input CLK;
output [4:0] CNTVAL;
output OV;
reg [4:0] CNTVAL;
reg OV;
always @ (posedge CLK) begin
if(CNTVAL >= 17)
CNTVAL <= 0;
else
CNTVAL <= CNTVAL + 1'b1;
end
always @ (CNTVAL) begin
if(CNTVAL >=9)
OV = 1'b1;
else
OV = 1'b0;
end
endmodule
RTL Viewer:
仿真图像:
signaltap的图像:
如果时钟是50MHz,把OV接 到一个LED上,由于频率太高,会看不出灯在闪烁。
实验4:时间基准电路和带使能的多周期计数器
1、参照代码,把后级计数器的计数范围改为0-15。
代码:
module cnt_en_0to15(
CLK ,
CNTVAL,
EN ,
OV );
input CLK;
input EN;
output [4-1:0] CNTVAL;
output OV;
reg [4-1:0] CNTVAL;
reg OV;
always @ (posedge CLK) begin
if(EN) begin
if(CNTVAL >= 15)
CNTVAL <= 0;
else
CNTVAL <= CNTVAL + 1'b1;
end
else
CNTVAL <= CNTVAL ;
end
always @ (CNTVAL) begin
if(CNTVAL == 15)
OV = 1'b1;
else
OV = 1'b0;
end
endmodule
2、把计数器的0-15计数值经过译码,在DE0 的 HEX LED上显示成0-9-A-F的十六 进制数 。
bdf图:
实验效果:
3、修改时间基准发生器,设计一个使用2个HEX LED,精度为0.1秒,范围为0-9.9秒的计时秒表。
4、自行设计上面计时器的附加控制功能(清零、暂 停)。
bcd图:
实验效果:
实验5:多周期时序逻辑 移位寄存电路
学生实验:
编译下载电路观察现象
拨动SW0开关,观察LED的闪烁变换情况
设计新的功能 – 在原有的电路基础上,添加方向选择功能。
– SW0仍然是移位寄存器组的输入 – 使用SW1开关,控制移位寄存的方向
– 从实验现象上应当能够看到,SW1可以控制LED闪烁的 移动方向,以及控制SW0值的对LED组的输入位置(即 从LED组的最左边或是最右边)
bcd图:
实验效果:
实验6:计数器、ROM和DDS
学生实验1:
电路的工作时钟是fsys = 50MHz, 拨动开关,观察丌同频率的 正弦波
– 参考设计中,计数器和ROM 地址 都是 7 比特,连接关系如上图所示
– 根据理论分析和实验结果,回答以下问题 – 请回答,你能得到的正弦波频率和计数器增量值的对应关系是什么?
设输出正弦波频率为f1,电路系统时钟为 fsys, 计数器步进增量为 CNT • 请给出 f1 和 fsys 以及 CNT 关系的数学表达式 – 请回答,你能得到的最低频率的正弦波是多少?
增量为1时:
增量为2时:
增量为4时:
由波形可以看出计数增量越大,产生的正弦波波形的频率就越高。
当增量为1时,正弦波的频率为50Mhz/128。
表达式的关系为f1=fsys*CNT/128。
学生实验2:
时钟频率保持fsys = 50MHz 丌变,
修改电路,把计数器的计数值和输入的计数增量信号都改为9比特, 计数值的高7位连接ROM的地址线,低2位悬空。如上图所示。
– 把9比特的计数器增量输入信号连接到9个拨码开关上 – 根据理论分析和实验结果,回答以下问题 – 请回答,你能得到的正弦波频率和计数器增量值的对应关系是什么?
设输出正弦波频率为f1,电路系统时钟为 fsys, 计数器步进增量为 CNT
请给出 f1 和 fsys 以及 CNT 关系的数学表达式
– 请回答,在这种连接方式下,你能得到的最低频率的正弦波是多少?
增量为1时:
增量为2时:
增量为4时:
表达式的关系为f1=fsys*CNT/512.