实验报告1 简单分频器
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程名称:FPGA指导老师:_竺老师_______成绩:__________________
实验名称:简单分频器的设计实验类型:_______同组学生姓名:__俞杰草______
一、实验目的和要求(必填)二、实验内容和原理(必填)
三、主要仪器设备(必填)四、操作方法和实验步骤
五、实验数据记录和处理六、实验结果与分析(必填)
七、讨论、心得
一.实验目的
a)熟悉Xilinx ISE软件,学会设计,仿真,综合和下载。
b)熟悉实验板电路设定频率的方法。
二.实验内容
根据实验板上晶振的输入频率50MHz,如果直接用这么高的时钟频率来驱动LED的闪烁,人眼将无法分辨。因此本实验着重介绍如何通过分频计数器的方式将50MHz的输入频率降低为人眼可分辨的频率(10Hz以下),并在实验板的LED2~LED5上显示出来。
三.实验记录
【实验现象】
当将rst_n信号对应的开关拨下,led0熄灭,其他所有led亮。
当将rst_n信号对应的开关往上拨,有7盏led亮,1盏led灭,且灭的led从led0向led7,再跳回led0不断循环往复的移动。
【主要程序段分析】
reg[22:0]cnt;
always@(posedge clk)
if(rst_n)cnt<=23'd0;
else cnt<=cnt+1'b1;//带复位键的位宽为24位的分频计数器,以降低闪烁频率reg[7:0]led;
always@(posedge clk)
if(rst_n)
led<=8'b00000001;//按键复位
else if((cnt==23'h7fffff)&&(led==8'b10000000))
led<=8'b00000001;//循环一周后从D5开始下一周的循环
else if(cnt==23'h7fffff)
led<=led<<1;//左移一位,右端补零
assign led_d2=~led[2];
assign led_d4=~led[4];
assign led_d3=~led[3];
assign led_d5=~led[5];
assign led_d0=~led[0];
assign led_d1=~led[1];
assign led_d6=~led[6];
assign led_d7=~led[7];
四.实验思考题
1.若要LED实现1Hz的闪烁频率,分频计数器应当如何改写。
【主要程序段的改写】
reg[25:0][22:0]cnt;
always@(posedge clk)
if(rst_n)cnt<=26'd023'd0;
else if(cnt==26'h2FAF080)cnt=26'd0;
else cnt<=cnt+1'b1;//带复位键的位宽为26位的分频计数器,以降低闪烁频率reg[7:0]led;
always@(posedge clk)
if(rst_n)
led<=8'b00000001;//按键复位
else if((cnt==26'h2FAF08023'h7fffff)&&(led==8'b10000000))
led<=8'b00000001;//循环一周后从D5开始下一周的循环
else if(cnt==26'h2FAF08023'h7fffff)
led<=led<<1;//左移一位,右端补零
【分析】
因为是1Hz->1s;1/50MHz->20ns;易知:(50*106)10=(2FAF080)16,可以推出需要26位的分频器,因而要将分频信号cnt设为26位,并在cnt==26'h2FAF080时进行移位操作。
【实验现象】
当拨下rst_n对应的开关时,除了led0,其他led均点亮。
当将rst_n向上拨,电路正常工作,走马灯中灭的那盏灯的移位速率变为1s移位一次,说明程序修改成功。
【实验仿真】
仿真程序
module test;
//Inputs
reg rst_n;
reg clk;
//Outputs
wire[7:0]led1;
//Instantiate the Unit Under Test(UUT)
freq_divider uut(
.rst_n(rst_n),
.clk(clk),
.led1(led1)
);
initial begin
//Initialize Inputs
rst_n=0;
clk=0;
#100rst_n=1;
#500rst_n=0;
#100rst_n=1;
end
always#10clk=~clk;//因为是20ns一个周期,因而始终应该10ns翻转一次endmodule
【仿真结果】
可以看出每过1秒,走马灯向前挪一格(注:仿真时程序没有将led取反,因而是如图所示高电平部分的移动)
【仿真收获】
1.仿真时长的设定:
2.仿真程序编写中,发现了仿真的输出是不可以用reg类型的变量的,只能用wire类型的变量。因而需要在always块外设置一组wire类型参数led1[7:0],其值等于在always 块之内的led[7:0]组。
2.设计2个灯同时走的走马灯实验
【主要程序段】
reg[22:0]cnt;
always@(posedge clk)