首页 > 学院 > 开发设计 > 正文

计数器 FPGA 电路实验 作业

2019-11-08 02:42:13
字体:
来源:转载
供稿:网友

实验一 1.设计功能描述

在 DE0 开发板上,设计一个变换计数最大值的循环计数器:在电路复位后会循环的从0值递增计数到最大值,第一次计数最大值是6,然后是7、8、9,然后计数最大值又变成6,如此往复循环; 计数数值以十进制数在最右侧的 HEX LED 数码管上显示,变化的时间间隔是1秒 ,复位时,数码管熄灭。 2.手工绘制的RTL图 这里写图片描述

3.Quartus Ⅱ9.0 编译生成的RTL电路图

总体结构图

(1)时间基准电路

时间基准电路模块

(2)计数器模块

计数器模块

(3)数码管译码模块

数码管显示译码模块

4.程序源代码

///////////////时间基准电路/////////////module cnt_sync( CLK , CNTVAL, OV ); input CLK; output [32-1:0] CNTVAL; output OV; parameter MAX_VAL = 25_000_000;reg [32-1:0] CNTVAL; reg OV; always @ (posedge CLK) begin if(CNTVAL >= MAX_VAL) CNTVAL <= 0; else CNTVAL <= CNTVAL + 1'b1; end always @ (CNTVAL) begin if(CNTVAL == MAX_VAL) OV = 1'b1; else OV = 1'b0; end endmodule //////////////计数器模块///////////////// module counter( //对1s基本信号计数EN, //计数使能控制CLK,COU,RST);input RST, EN, CLK;output reg [3:0] COU; reg [1:0] M;reg [3:0] MAX = 4'b0110;always @ (posedge CLK) if (RST == 1) if (EN == 1) if (COU != MAX) begin COU <= COU + 1'b1; M <= M; end else begin COU <= 4'b0000; M <= M + 1'b1; end else COU <= COU; else //清零 begin M <= 2'b00; COU <= 4'b0000; endalways @ (COU) case (M) //计数最值控制 2'b00 : MAX = 4'b0110; 2'b01 : MAX = 4'b0111; 2'b10 : MAX = 4'b1000; 2'b11 : MAX = 4'b1001; endcaseendmodule ////////////////数码显示管译码///////////////////// module dec_4to8(IN , //计数值输入RST ,OUT);input [4-1:0] IN ;input RST ;output [8-1:0] OUT ;reg [8-1:0] OUT ;always @ (IN) begin if(RST) OUT = 8'b11111111; else case(IN) 4'b0000: OUT = 8'b11000000; 4'b0001: OUT = 8'b11111001; 4'b0010: OUT = 8'b10100100; 4'b0011: OUT = 8'b10110000; 4'b0100: OUT = 8'b10011001; 4'b0101: OUT = 8'b10010010; 4'b0110: OUT = 8'b10000010; 4'b0111: OUT = 8'b11111000; 4'b1000: OUT = 8'b10000000; 4'b1001: OUT = 8'b10010000; endcaseendendmodule // module dec_4to8;

5.Signal Tap 分析

Signal Tap 分析

实验内容二 1、设计要求

设计一个变换计数最大值的循环计数器在 DE0 开发板的从左到右的 4个HEX LED 数码管上,进行计数并用十进制数进行显示:左1 LED,显示 0、1、2 ~6 ,然后熄灭;左2 LED,显示 0、1、2 ~7 ,然后熄灭;左3 LED,显示 0、1、2 ~8 ,然后熄灭;最右侧 LED,显示 0、1、2 ~9 ,然后熄灭 然后再开始左1 LED, 显示 0、1、2~6 如此一直循环;所有情况下,计数数值变化的时间间隔是1秒,复位时,所有数码管熄灭,复位后,重新开始计数显示。

2.手工绘制RTL图 手工绘制图

3.Quartus Ⅱ9.0 编译生成的RTL电路图

总图

(1)时间基准电路

时间基准电路

(2)循环计数模块

循环计数模块

(3)计数值译码显示模块

计数值译码显示模块

4.程序源代码

//////////////////////时间基准电路/////////////////////// module cnt_sync( CLK , // clock CNTVAL, // counter value OV ); // overflowinput CLK;output [32-1:0] CNTVAL;output OV;parameter MAX_VAL = 50_000_000;reg [32-1:0] CNTVAL;reg OV;always @ (posedge CLK) begin if(CNTVAL >= MAX_VAL) CNTVAL <= 0; else CNTVAL <= CNTVAL + 1'b1;endalways @ (CNTVAL) begin if(CNTVAL == MAX_VAL) OV = 1'b1; else OV = 1'b0;endendmodule ///////////////循环计数模块/////////////////////////module counter( //对1s信号计数EN,RST,CLK,M,COU);input RST,EN, CLK;output reg [3:0] COU;output reg [1:0] M;reg [3:0] MAX = 4'b0110;always @ (posedge CLK)if (RST == 1) if (EN == 1) if (COU != MAX) begin COU <= COU + 1'b1; M <= M; end else begin COU <= 4'b0000; M <= M + 1'b1; end else COU <= COU;else begin COU <= 4'b0000; M <= 2'b00; endalways @ (COU) case (M) 2'b00 : MAX = 4'b0110; 2'b01 : MAX = 4'b0111; 2'b10 : MAX = 4'b1000; 2'b11 : MAX = 4'b1001; endcaseendmodule///////////////////计数值译码显示模块///////////////////////module dec_seg( //显示译码M,COU_IN,SEG0,SEG1,SEG2,SEG3);input [1:0] M;input [3:0] COU_IN;output reg [7:0] SEG0;output reg [7:0] SEG1;output reg [7:0] SEG2;output reg [7:0] SEG3;reg [7:0] SEG_data [3:0];always @ (COU_IN)case(COU_IN) //系统输出编码表 4'b0000 : SEG_data[M] = 8'b1100_0000; 4'b0001 : SEG_data[M] = 8'b1111_1001; 4'b0010 : SEG_data[M] = 8'b1010_0100; 4'b0011 : SEG_data[M] = 8'b1011_0000; 4'b0100 : SEG_data[M] = 8'b1001_1001; 4'b0101 : SEG_data[M] = 8'b1001_0010; 4'b0110 : SEG_data[M] = 8'b1000_0010; 4'b0111 : SEG_data[M] = 8'b1111_1000; 4'b1000 : SEG_data[M] = 8'b1000_0000; 4'b1001 : SEG_data[M] = 8'b1001_0000; 4'b1010 : SEG_data[M] = 8'b1000_1000; 4'b1011 : SEG_data[M] = 8'b1000_0011; 4'b1100 : SEG_data[M] = 8'b1100_0110; 4'b1101 : SEG_data[M] = 8'b1010_0001; 4'b1110 : SEG_data[M] = 8'b1000_0110; 4'b1111 : SEG_data[M] = 8'b1000_1110;endcasealways @ (M)case (M) //根据当前的计数值COU选择显示的数码管,并关闭其他数码管 2'b00 : begin SEG0 = SEG_data[M];SEG3 = 8'b1111_1111; SEG1 = 8'b1111_1111; SEG2 = 8'b1111_1111; end 2'b01 : begin SEG1 = SEG_data[M];SEG0 = 8'b1111_1111; SEG2 = 8'b1111_1111; SEG3 = 8'b1111_1111; end 2'b10 : begin SEG2 = SEG_data[M];SEG1 = 8'b1111_1111; SEG0 = 8'b1111_1111; SEG3 = 8'b1111_1111; end 2'b11 : begin SEG3 = SEG_data[M];SEG0 = 8'b1111_1111; SEG1 = 8'b1111_1111; SEG2 = 8'b1111_1111; endendcaseendmodule

5.Signal Tap 分析

5.Signal Tap 分析

6.视频链接

视频链接


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表