实验报告1 简单分频器

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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)

相关文档
最新文档