本帖最后由 WeTiGY 于 2016-11-25 23:13 编辑
实验五 74LS160计数器功能模块一、实验目的 1、学会用HDL语言设计时序电路; 2、用HDL语言设计74LS160计数器功能模块。 二、硬件需求 EDA/SOPC实验箱一台。 三、实验原理 计数器是最常用的寄存器逻辑电路,从微处理器的地址发生器到频率计都需要用到计数器。一般计数器可以分为两类:加法计数器和减法计数器。加法计数器每来一个脉冲计数值加1;减法计数器每来一个脉冲计数值减1。 下面将通过模仿中规模集成电路74LS160的功能,用HDL语言设计一个十进制可预置计数器。74LS160共有一个时钟输入端CLK,一个清除输入端CLR,两个计数允许信号P和T,4个可预置数据输入端D、C、B、A,一个置位允许端LOAD,4个计数输出端QD、QC、QB、QA,一个进位输出端RC,其工作模式及时序图如下表和图2-14所示。 注:进位输出端RC=Q3&!Q2&!Q1&Q0&T 四、实验内容 本实验要完成的任务就是实现中规模集成电路74LS160的功能,观察其工作时序,并下载到芯片中观察其实际工作过程。实验时为了便于观察,需经分频得到1Hz时钟,用拨挡开关的SW1A~SW4A作为计数器的输入D,按键F3和F4作为计数器的控制允许P和T信号,F2作为清除输入CLR,用按键开关模块的F1作为LOAD信号(注意:由于计数器采用的是1Hz时钟,而装载数据是在时钟信号的上升沿作用下进行,所以要想正确的加载预制数据,F1按键必须按住至少1s以上才可以),用七段数码管模块中的某一位作为计数器的输出Q指示,用led8作为计数器的输出翻转信号RC指示。 第一个是分频模块: - module divider_module
- (
- CLK,f_Out
- );
- input CLK;
- output f_Out;
-
- parameter T1s=26'd50_000_000;
- reg [25:0]Count1;
-
- always @ ( posedge CLK )
- if( Count1 == T1s)
- Count1 <= 26'd0;
- else
- Count1 <= Count1 + 1'b1;
-
- reg rf_Out;
- always @ ( posedge CLK )
- if( Count1 >= 26'd0 && Count1 <= 26'd25_000_000)
- rf_Out <= 1'b0;
- else
- rf_Out <= 1'b1;
- assign f_Out = rf_Out;
- endmodule
复制代码
第二个是数码管模块: - module hex_module
- (
- f_Out,hex,Q
- );
- input f_Out;
- input [3:0] Q;
- output [6:0] hex;
-
- reg [6:0] rhex;
- always@(posedge f_Out)
- begin
- case(Q)
- 4'd0 : rhex<=7'b0000001; //0
- 4'd1 : rhex<=7'b1111001; //1
- 4'd2 : rhex<=7'b0010010; //2
- 4'd3 : rhex<=7'b0000011; //3
- 4'd4 : rhex<=7'b1001100; //4
- 4'd5 : rhex<=7'b0100100; //5
- 4'd6 : rhex<=7'b0100000; //6
- 4'd7 : rhex<=7'b0001111; //7
- 4'd8 : rhex<=7'b0000000; //8
- 4'd9 : rhex<=7'b0000100; //9
-
- default: rhex<=7'b0110110; //F
- endcase
- end
- assign hex=rhex;
- endmodule
复制代码第三个是计数模块: - module count_module
- (
- f_Out,RSTn,P,T,LOAD,D,Q,RC
- );
- input f_Out,RSTn,P,T,LOAD;
- input [3:0] D;
- output [3:0] Q;
- output RC;
-
- reg [3:0] Q;
- reg RC;
- always@(posedge f_Out or negedge RSTn)
- if(!RSTn)
- Q<=4'd0;
- else if(!LOAD)
- Q<=D;
- else if(P&T)
- begin
- if(Q<4'd9)
- begin
- Q<=Q+1'b1;
- RC<=1'b0;
- end
- else
- begin
- Q<=4'd0;
- RC<=1'b1;
- end
- end
- else
- Q<=4'd0;
-
- endmodule
复制代码
第四个是顶层模块:- module top_module
- (
- CLK,RSTn,P,T,LOAD,D,RC,hex
- );
- input CLK,RSTn,P,T,LOAD;
- input [3:0] D;
- output [6:0] hex;
- output RC;
-
- wire f_out;
- divider_module u1
- (
- .CLK(CLK),
- .f_Out(f_Out)
- );
- wire [3:0] Q;
- count_module u2
- (
- .f_Out(f_Out),
- .RSTn(RSTn),
- .P(P),
- .T(T),
- .LOAD(LOAD),
- .D(D),
- .RC(RC),
- .Q(Q)
- );
-
- hex_module u3
- (
- .f_Out(f_Out),
- .Q(Q),
- .hex(hex)
- );
-
-
- endmodule
复制代码
注:使用20分频仿真
仿真图:
|