实验二 异步清零和同步使能的4位计数器
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
西南科技大学
实验报告FPGA现代数字系统设计
实验题目:含异步清零和同步使能的4位加法计数器专业班级:
学生姓名:
学生学号:
实验时间:
指导教师:
实验二含异步清0和同步使能的4位加法计数器
一、实验目的:
学习时序电路的设计、仿真和硬件测试,进一步熟悉VHDL技术。
二、原理说明:
图2.1是一含计数使能、异步复位和计数值并行预置功能4位加法计数器,例2.1是其VHDL描述。由图2-1所示,
4位锁存器;
rst是异步清0信号,高电平有效;
clk是锁存信号;
D[3..0]是4位数据输入端。
ENA是使能信号,当ENA为'1'时,多路选择器将加1器的输出值加载于锁存器的数据端;当ENA为'0'时将"0000"加载于锁存器。
图2-1含计数使能、异步复位和计数值并行预置功能4位加法计数器
三、实验内容:
1、在QuartusII上对例2-1进行编辑、编译、综合、适配、仿真。说明例中各语句
的作用,详细描述示例的功能特点,给出其所有信号的时序仿真波形。
【例2-1】
module CNT4B(CLK,RST,ENA,CLK_1,RST_1,ENA_1,OUTY,COUT);//端口声明
input CLK,RST,ENA;
output CLK_1,RST_1,ENA_1;
output[3:0] OUTY;
output COUT;
reg[3:0] OUTY;
reg COUT;//寄存器变量OUTY,位宽为1
wire CLK_1;
wire RST_1;
wire ENA_1;
assign CLK_1 = CLK;
assign RST_1 = RST;
assign ENA_1 = ENA;
always@(posedge CLK or negedge RST) /*当CLK上升沿或者RST上升沿时,触发always模块执行*/
begin
if(!RST)
begin
OUTY<=4'b0000;
COUT<=1'b0;/*当复位信号等于0时,计数OUTY、COUT置0*/
end
else
if(ENA) /*当使能信号为1时,计数器计数工作*/
begin
OUTY<=OUTY+1;
COUT<=OUTY[0] & OUTY[1] & OUTY[2] & OUTY[3]; /*计数显示*/
end
end
endmodule
2保存计数器程序为CNT4B.vhd,进行功能仿真、全编译、时序仿真,如出现错误请按照错误提示进行修改,保证设计的正确性。
3锁定引脚
pin location DE2上的名称
ENA PIN_N25SW[0]
CLK PIN_G26KEY0
RST PIN_N23KEY1
OUTY[0]PIN_AC21LEDR[7]
OUTY[1]PIN_AA14LEDR[8]
OUTY[2]PIN_Y13LEDR[9]
OUTY[3]PIN_AA13LEDR[10]
COUT PIN_Y12LEDG[8]
CLK_1PIN_AE22LEDG[0]
RST_1PIN_AF22LEDG[1]
ENA_1PIN_AE23LEDR[0]
4下载
采用JATG方式进行下载,通过ENA,CLK,RST输入,观察的LEDR[0],LEDR[7],LEDR[8],LEDR[9],LEDR[10],LEDG[0],LEDG[1],LEDG[8]亮灭验证计数器的
逻辑功能。
5使用SIGNALTAP II对CNT4B计数器中的COUT, OUTY进行实时测试。
四、实验结果与分析
功能仿真:
时序编译:
时序仿真:
下载情况:
最终结果:
五、思考题
1、改写例2-1,用两个always语句实现模块功能?
答:module CNT4B(CLK,RST,ENA,CLK_1,RST_1,ENA_1,OUTY,COUT);
input CLK,RST,ENA;
output CLK_1,RST_1,ENA_1;
output[3:0] OUTY;
output COUT;
reg[3:0] OUTY;
reg COUT;
wire CLK_1;
wire RST_1;
wire ENA_1;
assign CLK_1 = CLK;
assign RST_1 = RST;
assign ENA_1 = ENA;
always@(posedge CLK or negedge RST)
begin
if(!RST)
begin
OUTY<=4'b0000;
COUT<=1'b0;
end
else
OUTY= OUTY+1;
always@(OUTY)
if(ENA)
begin
OUTY<=OUTY+2’b1;
COUT<=OUTY[0] & OUTY[1] & OUTY[2] & OUTY[3];
end
end
assign COUT<=OUTY[0] & OUTY[1] & OUTY[2] & OUTY[3];
endmodule