Verilog流水灯实验报告.pptx
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
学海无 涯
流水灯实验报告
实验二 流水灯
一、 实验目的
学会编写一个简单的流水灯程序并掌握分频的方法。熟悉 Modelsim 仿真软件的使用。
二、 实验要求
用 Quartus 编写流水灯程序,在 Modelsim 软件中进行仿真。
三、 实验仪器和设备
1、 硬件:计算机 2、 软件:Quartus、Modelsim、(UE)
图 4 流水灯仿真结果
//模块名与文件名一致。定义端口列表, //输入线型
output reg );
clk_4
//输出定义为寄存器型
reg[3:0] cnt;
//中括号定义位宽,定义中间变量 cnt
always@(posedge clk)
if(rst_n==0)
cnt
<=
else if(cnt==3)
(二)流水灯 1、编写分频程序。
图 3 分频仿真结果 2
学海无涯
3、 编写测试程序。 3、进行仿真,为了节约时间和方便观察波形,将计数器值分别改为 24、49 跳转。波 形如图 4 所示。
七、 实验参考程序
(一) 时钟分频 1、程序文件 module div_clk( input wire clk, input wire rst_n,
output reg[3:0] led );
reg[25:0] cnt;
reg
clk_4;
always@(posedge clk) if(rst_n==0)
学海无 涯
//当计数器为 1 时,时钟跳变为 1 //当计数器为 3 时,时钟跳变为 0
//模块名与文件名一致。定义端口列表, //输入线型 //中括号定义位宽,定义中间变量 cnt
clk rst_n clk_4
图 1 四分频原理图
(二)流水灯设计思路 1、实现 4 盏 LED 灯依次隔 1s 亮灭,即周期为 1s; 2、计算出频率f 为 1/T=1Hz; 3、设置计数器cnt,当检测到 clk 上升沿时开始计数,当 cnt 计数到 24_999_999 时, clk_4 跳变为 1,LED 灯亮起,当 cnt 计数 49_999_999 时,clk_4 置 0,LED 灯熄灭。 4、给 LED 赋初值 4’b0001,第一盏灯亮。 5、利用位拼接,实现循环。 (三)设计框图
4'b0001 4'b0010 4'b0100 4'b1000 相当于把低三位左移,并最高位放在最低位。 用位拼接可写为:
led<={led[2:0], led[3]}; 低三位 最高位
六、 实验方法和步骤
(一)时钟分频 1、 编写分频程序。 2、 编写测试程序。 3、 进行仿真,波形如图 3 所示。
= 1;
always #5 clk=~clk;
div_clk div_clk_inst( .clk(clk), .rst_n(rst_n),
.clk_4(clk_4) );
endmodule (二) 流水灯
1、 程序文件
module LSD(
input
wire
input
wire
clk, rst_n,
reg rst_n; reg cnt; wire led;
initial begin clk = 0; rst_n = 0; #100 rst_n = 1; end
always #5 clk=~clk;
LSD LSD_inst( .clk(clk), .rst_n(rst_n),
if(rst_n==0)
clk_4 <=
0;
else if(cnt==24_999_999)
clk_4 <=
1;
else if(cnt==49_999_999)
clk_4 <=
0;
else clk_4 =
clk_4;
//异步复位 //复位为 0.clk_4 为 0 //当计数器为 24999999 时,时钟跳变为 1 //当计数器为 49999999 时,时钟跳变为 0
四、 实验内容
1、 将时钟周期进行分频。 2、 编写 Verilog 程序实现 LED 等依次亮灭,用 Modelsim 进行仿真,绘制波形图。
五、 实验设计
(一)分频原理 已知时钟周期f 为 50MHz,周期 T 为 1/f,即 20ns。若想得到四分频计数器,即周期为 80ns 的时钟,需要把时钟进行分频。即每四个时钟周期合并为一个周期。原理图如图 1 所示。
4
学海无 涯
cnt
<=
0;
else if(cnt==49_999_999)
cnt
<=
0;
else
cnt
<=
cnt+1;
//复位为 0,计数器也为 0 //当计数器=49999999 时清零(可用 else if)
//计数器自加 1
always@(posedge clk or negedge clk)
cnt
<=
else
cnt
<=
0; 0; cnt+1;
//复位为 0,计数器也为 0 //当计数器=3 时清零(可用else if)
//计数器自加 1
always@(posedge cቤተ መጻሕፍቲ ባይዱk)
if(rst_n==0)
clk_4 <=
0;
else if(cnt==1)
//复位为 0.clk_4 为 0
3
clk_4 <=
1;
else if(cnt==3)
clk_4 <=
0;
endmodule 2、测试文件
`timescale 1ns/1ns
module tb_div_clk();
reg
clk;
reg
rst_n;
wire clk_4;
initial begin clk rst_n #100 rst_n end
= 0; = 0;
always@(posedge clk_4 or negedge clk_4) if(rst_n==0)
led
<=
4'b0001;
else
led
<=
{led[2:0],led[3]};//位拼接
endmodule 2、 测试文件 `timescale 1ns/1ns module LSD(); reg clk;
1
学海无 涯
clk LED
LED
FPGA
cnt
图 2 设计基本框图
(四)位拼接的用法 若输入 a=4'b1010,b=3'b101,c=4'b0101,想要使输出 d=5'b10001 用位拼接,符号“{ }”:d<={b[2:1],c[1],a[2:1]} 即把 b 的低 1~2 位 10,c 的低 1 位 0,a 的低 1~2 位 01 拼接起来,得到 10 0 01。 流水灯
流水灯实验报告
实验二 流水灯
一、 实验目的
学会编写一个简单的流水灯程序并掌握分频的方法。熟悉 Modelsim 仿真软件的使用。
二、 实验要求
用 Quartus 编写流水灯程序,在 Modelsim 软件中进行仿真。
三、 实验仪器和设备
1、 硬件:计算机 2、 软件:Quartus、Modelsim、(UE)
图 4 流水灯仿真结果
//模块名与文件名一致。定义端口列表, //输入线型
output reg );
clk_4
//输出定义为寄存器型
reg[3:0] cnt;
//中括号定义位宽,定义中间变量 cnt
always@(posedge clk)
if(rst_n==0)
cnt
<=
else if(cnt==3)
(二)流水灯 1、编写分频程序。
图 3 分频仿真结果 2
学海无涯
3、 编写测试程序。 3、进行仿真,为了节约时间和方便观察波形,将计数器值分别改为 24、49 跳转。波 形如图 4 所示。
七、 实验参考程序
(一) 时钟分频 1、程序文件 module div_clk( input wire clk, input wire rst_n,
output reg[3:0] led );
reg[25:0] cnt;
reg
clk_4;
always@(posedge clk) if(rst_n==0)
学海无 涯
//当计数器为 1 时,时钟跳变为 1 //当计数器为 3 时,时钟跳变为 0
//模块名与文件名一致。定义端口列表, //输入线型 //中括号定义位宽,定义中间变量 cnt
clk rst_n clk_4
图 1 四分频原理图
(二)流水灯设计思路 1、实现 4 盏 LED 灯依次隔 1s 亮灭,即周期为 1s; 2、计算出频率f 为 1/T=1Hz; 3、设置计数器cnt,当检测到 clk 上升沿时开始计数,当 cnt 计数到 24_999_999 时, clk_4 跳变为 1,LED 灯亮起,当 cnt 计数 49_999_999 时,clk_4 置 0,LED 灯熄灭。 4、给 LED 赋初值 4’b0001,第一盏灯亮。 5、利用位拼接,实现循环。 (三)设计框图
4'b0001 4'b0010 4'b0100 4'b1000 相当于把低三位左移,并最高位放在最低位。 用位拼接可写为:
led<={led[2:0], led[3]}; 低三位 最高位
六、 实验方法和步骤
(一)时钟分频 1、 编写分频程序。 2、 编写测试程序。 3、 进行仿真,波形如图 3 所示。
= 1;
always #5 clk=~clk;
div_clk div_clk_inst( .clk(clk), .rst_n(rst_n),
.clk_4(clk_4) );
endmodule (二) 流水灯
1、 程序文件
module LSD(
input
wire
input
wire
clk, rst_n,
reg rst_n; reg cnt; wire led;
initial begin clk = 0; rst_n = 0; #100 rst_n = 1; end
always #5 clk=~clk;
LSD LSD_inst( .clk(clk), .rst_n(rst_n),
if(rst_n==0)
clk_4 <=
0;
else if(cnt==24_999_999)
clk_4 <=
1;
else if(cnt==49_999_999)
clk_4 <=
0;
else clk_4 =
clk_4;
//异步复位 //复位为 0.clk_4 为 0 //当计数器为 24999999 时,时钟跳变为 1 //当计数器为 49999999 时,时钟跳变为 0
四、 实验内容
1、 将时钟周期进行分频。 2、 编写 Verilog 程序实现 LED 等依次亮灭,用 Modelsim 进行仿真,绘制波形图。
五、 实验设计
(一)分频原理 已知时钟周期f 为 50MHz,周期 T 为 1/f,即 20ns。若想得到四分频计数器,即周期为 80ns 的时钟,需要把时钟进行分频。即每四个时钟周期合并为一个周期。原理图如图 1 所示。
4
学海无 涯
cnt
<=
0;
else if(cnt==49_999_999)
cnt
<=
0;
else
cnt
<=
cnt+1;
//复位为 0,计数器也为 0 //当计数器=49999999 时清零(可用 else if)
//计数器自加 1
always@(posedge clk or negedge clk)
cnt
<=
else
cnt
<=
0; 0; cnt+1;
//复位为 0,计数器也为 0 //当计数器=3 时清零(可用else if)
//计数器自加 1
always@(posedge cቤተ መጻሕፍቲ ባይዱk)
if(rst_n==0)
clk_4 <=
0;
else if(cnt==1)
//复位为 0.clk_4 为 0
3
clk_4 <=
1;
else if(cnt==3)
clk_4 <=
0;
endmodule 2、测试文件
`timescale 1ns/1ns
module tb_div_clk();
reg
clk;
reg
rst_n;
wire clk_4;
initial begin clk rst_n #100 rst_n end
= 0; = 0;
always@(posedge clk_4 or negedge clk_4) if(rst_n==0)
led
<=
4'b0001;
else
led
<=
{led[2:0],led[3]};//位拼接
endmodule 2、 测试文件 `timescale 1ns/1ns module LSD(); reg clk;
1
学海无 涯
clk LED
LED
FPGA
cnt
图 2 设计基本框图
(四)位拼接的用法 若输入 a=4'b1010,b=3'b101,c=4'b0101,想要使输出 d=5'b10001 用位拼接,符号“{ }”:d<={b[2:1],c[1],a[2:1]} 即把 b 的低 1~2 位 10,c 的低 1 位 0,a 的低 1~2 位 01 拼接起来,得到 10 0 01。 流水灯