数电实验报告3.2-二十九进制计数器-分频器
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
<时序逻辑电路设计实验>实验报告
学生姓名:李旭文超周
班级学号:1138033 1138019
指导老师:潘秀琴
<实验报告内容>
一、实验名称:时序逻辑电路设计实验
二、实验学时:5学时
三、实验目的:
1、初步掌握用Verilog HDL 语言设计时序逻辑电路的基本思路和方法,并对同步二进制加法计数器、加减可控计数器、任意进制计数器(以60进制计数器为例)等进行逻辑电路设计和功能仿真。
2、初步学习分析分频电路设计的思路,并进行功能仿真。(选做)
四、实验内容
1、假设现有同步十进制加法计数器(出了具有数据输入、时钟控制、状态输出之外,还具有异步清零、同步置数功能),用Verilog HDL设计二十九进制计数器,并进行功能仿真。
2、用同步二进制加法计数器设计一分频电路,并进行功能仿真,分析经过分频后所得到信号频率和输入时钟信号频率之间的关系。在此基础上进一步分析输入信号为8MHZ时,要想得到2分频、4分频输出信号的设计该如何实现给出具体实现方法(选作)
五、实验原理
计数器是最常用的时序逻辑电路,从计算机的微处理器地址发生器到频率计都需要用到计数器。常见计数器有加法计数器和减法计数器。加法计数器时根据二进制加法原理,每来一个脉冲计数值加1;减法计数器根据二进制减法原理每来一个脉冲计数器值减1。同一计数器兼具有加法和减法功能,成为加减可控计数器或可逆计数器。
任意进制计数器设计是完成用现有进制计数构成所需要容量的计数器设计任务,其实现方法有置零法、置数法,并行进位和串行进位法,具体实现原理参见本课程第六章相关内容。
六、实验步骤
1、实验前准备(预习)
(1)认真阅读实验目的、内容及要求,清楚本实验要干什么
(2)根据要求复习及查阅相关学习资料,整理完成本实验任务的基本思路(3)设计完成本实验的实现方案
2、编程、调试及功能实现
(1)逻辑功能代码编写:根据确定的实现方案,在软硬件实验环境下,用VerilogHDl语言进行可编程逻辑电路功能设计,完成程序代码编写。
(2)逻辑功能检查:认真分析所编写代码是否能够实现实验任务所要求的功能,
如果有不符合的地方,对代码逻辑电路功能描述进行修改,确认正确进入下一步。
(3)编译并进行代码修改和完善:对编写完成的代码进行编译,并对编译过程中出现的错误进行语法修改,直至编译完全通过。
(4)功能仿真:建立波形文件,对所涉及时序电路进行功能仿真,认真分析时序所描述的功能与所要求的功能是否符合,如果不符合重复本部分(2)规定的内容或者程序中变量端口模块的定义应用是否正确等内容,直至功能仿真完全正确。
七、实验结果:
29进制计数器
分频器:文本输入
波形图
八、心得体会
更加熟悉掌握用Verilog HDL 语言设计时序逻辑电路的基本思路和方法并初步学习分析分频电路设计的思路和进行功能仿真。
九、附录:<程序代码>
1.二十九进制
module counter_29(clk,r,cout1,cout2,cin1,cin2,ld,c);//cin输入,cout输出
input clk,r,ld;//r清零,ld同步预置
input [3:0]cin1,cin2;
output [3:0]cout1,cout2;
output c;//进位输出
reg [3:0]cout1,cout2;
reg c;
always@(posedge clk)
if(r) {cout1,cout2,c}<={4'b0000,4'b0000,1'b0};
else if(ld) {cout1,cout2,c}<={cin1,cin2,1'b0};
else if(cout1==9 && cout2==2) {cout1,cout2,c}<={4'b0000,4'b0000,1'b1};
else if(c==1'b1) {cout1,c}<={cout1+1,1'b0};
else if(cout1==4'b1001) {cout1,cout2}<={4'b0000,cout2+1};
else cout1<=cout1+1;
endmodule
2.分频器:
//clk为输入时钟,rst为复位信号,clk_out为输出分频时钟,div_num为分频数目,多少分频就把div_num赋多少值。
module fenpinqi(clk,r,baud_count);
parameter div_num=8;
input clk,r;
output [3:0] baud_count;
reg [3:0] baud_count;
always @(posedge clk)
begin
if (r)
begin
baud_count<=0;
end
else
begin
if (baud_count==div_num-1)
begin
baud_count<=0;
end
else
begin
baud_count<=baud_count+1; end
end
end
endmodule