实验内容 1
使用Veriog - HDL 语言,DE0 FPGA 开发板 按照如下要求设计一个计数器电路 。
功能描述
在 DE0 开发板的 最右侧 的 HEX LED 数码管上,进行计数并用十进制数进行显示。计数器特征如下:
只能使用一个50MHz的时钟信号,不要有计数器分频的信号作为时钟
该计数器在电路复位后会循环的从0值递增计数到最大值,计数最大值是一个循环变化的过程,计数器复位之后,第一次计数最大值是6,然后是7、8、9,然后计数最大值又变成6,如此往复循环, 计数数值变化的时间间隔是1秒 ,计数过程如下所示:
0 1 … 6 | 0 1 … 7 | 0 1 … 8 | 0 1 … 9 | 0 1 … 6 | …… |
---|
人工绘制的电路结构RTL设计图
顶层BDF图如下:
1.div模块为分频器用于将50MHz时钟信号分频产生1s时钟信号在clk_div输出。
2.count模块为产生符合技术要求的计数器。
3.decoder_hex模块为4-7译码器,译码使在数码管上显示对应字符。
div模块人工绘制的RTL图:
Quartus扫描生成的电路RTL图
计数器的计数值的SignalTap截图
实验代码
******************分频器代码******************
module div(
clk , // clock
reset,
CNTVAL, // counter value
clk_div); // overflow
input clk;
input reset;
output [32-1:0] CNTVAL;
output clk_div;
parameter MAX_VAL = 50_000_000; //50MHz下为1s
reg [32-1:0] CNTVAL;
reg clk_div;
always @ (posedge clk)
begin
if (!reset)
begin
CNTVAL <= 0;
end
else
begin
if(CNTVAL >= MAX_VAL)
CNTVAL <= 0;
else
CNTVAL <= CNTVAL + 1'b1;
end
end
always @ (CNTVAL) begin
if(CNTVAL == MAX_VAL)
clk_div = 1'b1;
else
clk_div = 1'b0;
end
endmodule
******************计数器代码******************
module count(
clk,
cnt,
OV);
input clk,rst;
output reg[3:0] cnt;
output OV;
reg[1:0] state,next_state;
reg[3:0] cnt_temp;
parameter s0=2'b00,s1=2'b01,s2=2'b11,s3=2'b10;
always@( next_state or rst)
begin
if(rst)
begin
state=s0;
cnt=0;
end
else
begin
state=next_state;
cnt=cnt_temp;
end