一、实验内容1
1、设计功能描述
在 DE0 开发板上,设计一个变换计数最大值的循环计数器:在电路复位后会循环的从0值递增计数到最大值,第一次计数最大值是6,然后是7、8、9,然后计数最大值又变成6,如此往复循环; 计数数值以十进制数在最右侧的 HEX LED 数码管上显示,变化的时间间隔是1秒 ,复位时,数码管熄灭。
2、电路设计思路RTL电路图
设计电路主要有三部分组成:第一部分是时间基准电路模块,用以产生定时1秒的时钟使能信号,即1秒计一个数;第二部分是计数器模块,该模块有两个计数器组成,一个计数器进行循环主计数,另一个循环计数改变计数模值;第三部分是计数值译码显示电路。
3、Quartus Ⅱ 8.1 编译生成RTL电路图
4、Verilog HDL 模块代码
1秒时间基准电路模块/
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
///变模(6~9)循环计数模块
module cnt_cycle(
EN ,
RST ,
CNT); //计数值输出
input EN;
input RST;
output [4-1:0] CNT;
parameter CNT_VAL_MIN=6; //计数最小模值为6
parameter CNT_VAL_MAX=9; //计数最大模值为9
reg [4-1:0] CNT;
reg [4-1:0] CNT_VAL=CNT_VAL_MIN;
always @ (posedge EN or posedge RST)begin
if(RST)begin //异步高电平复位
CNT <= 0;
CNT_VAL <= CNT_VAL_MIN;
end
else begin
if(CNT >= CNT_VAL)begin
CNT <= 0;
CNT_VAL <= CNT_VAL + 1'b1;
if(CNT_VAL >= CNT_VAL_MAX)
CNT_VAL <= CNT_VAL_MIN;
end
else CNT <= CNT + 1'b1;
end
end
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 =