您的位置:首页 > 其它

计数器 FPGA 电路实验 作业

2017-02-18 21:41 399 查看
实验一

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;
end
always @ (COU)
case (M)                         //计数最值控制
2'b00 : MAX = 4'b0110;
2'b01 : MAX = 4'b0111;
2'b10 : MAX = 4'b1000;
2'b11 : MAX = 4'b1001;
endcase
endmodule
////////////////数码显示管译码/////////////////////
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;
endcase
end
endmodule // module dec_4to8;


5.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    );  // overflow
input 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;
end

always @ (CNTVAL) begin
if(CNTVAL == MAX_VAL)
OV = 1'b1;
else
OV = 1'b0;
end
endmodule
///////////////循环计数模块/////////////////////////
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;
end
always @ (COU)
case (M)
2'b00 : MAX = 4'b0110;
2'b01 : MAX = 4'b0111;
2'b10 : MAX = 4'b1000;
2'b11 : MAX = 4'b1001;
endcase
endmodule
///////////////////计数值译码显示模块///////////////////////
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;
endcase

always @ (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; end
endcase
endmodule


5.Signal Tap 分析



6.视频链接

视频链接
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: