第一部分作业
总体思路:先设计一个合适频率的时间基准模块,用溢出信号作为是使能信号输入,再设计符合显示要求的计数器,再设计数码管显示模块,显示出来。
人工绘制RTL图:
计数部分
时间基准部分
quartus生成RTL结构图
总体结构:
计数部分:
时间基准部分
数码管显示部分
SignalTap截图
视频链接:
代码:
////////////////计数程序///////////////////////
module jishu(
CLK , // 时钟
CNTVAL, // 输出
rst , //复位
en ); //使能
input CLK,rst;
input en;
output [4-1:0] CNTVAL;
reg [4-1:0] max=6;//计数最大值
reg [4-1:0] CNTVAL;
always @ (posedge CLK or posedge rst ) begin
if(rst) begin //高电平复位
CNTVAL <= 0;
max<=6; //复位同时从计数最大值从6开始
end
else begin
if(en)begin //使能信号低电平有效,低电平时输出值保持不变
if(CNTVAL >= max) begin //超出计数最大值,从零重新开始
CNTVAL <= 0;
if(max<9) //计数最大值从6开始递增,直到9
max<=max+1'b1;
else
max<=6;
end
else
CNTVAL <= CNTVAL + 1'b1;
end
else CNTVAL <= CNTVAL ;
end
end
endmodule
////////////////数码管显示///////////////////////
module shumaguan (
bcd,
seg);
input [3:0]bcd;//实际输出数值
output seg;
reg [7:0]seg; //各个引脚对应的高低电平
always @(bcd) begin
case (bcd)
4'b0000: seg = 8'h C0;
4'b0001: seg = 8'h F9; //1
4'b0010: seg = 8'h A4; //2
4'b0011: seg = 8'h B0; //3
4'b0100: seg = 8'h 99; //4
4'b0101: seg = 8'h 92; //5
4'b0110: seg = 8'h 82; //6
4'b0111: seg = 8'h F8; //7
4'b1000: seg = 8'h 80; //8
4'b1001: seg = 8'h 90; //9
endcase
end
endmodule
//////////////////// 时间基准模块/////////////////////////
module cnt_sync(
CLK , // clock
CNTVAL, // counter value
OV ); // overflow
input CLK;
output [32-1:0] CNTVAL;
output OV;
parameter MAX_VAL = 25_000_000;//可以控制溢出信号的输出频率=50000000/MAX_VAL
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
第二部分作业
总体思路:
先设计一个合适频率的时间基准模块,用溢出信号作为是使能信号输入,再设计符合一个计数周期为34的计数器(因为数码管显示周期为34),再设计数码管显示模块,显示出对应的结果。
人工绘制RTL图:
计数部分
时间准基部分
quartus生成RTL结构图
总体结构:
计数部分:
时间准基部分:
数码管显示部分:
1.最左边的数码管
2.左边第二个数码管
3.左边第三个数码管
4.最右边的数码管
SignalTap截图
视频链接:http://www.miaopai.com/show/7raWeMNB7vNCY6ebutoyVQ__.htm
module jishu0_34(
rst ,
en ,
CLK ,
CNTVAL);
input CLK,en,rst;
output CNTVAL;
reg [6-1:0] CNTVAL=0;
always @ (posedge CLK or posedge rst ) begin
if (rst)
CNTVAL<=63;
else begin
if(en) begin
if(CNTVAL <33)
CNTVAL <= CNTVAL + 1'b1;
else
CNTVAL <= 0;
end
else
CNTVAL <= CNTVAL;
end
end
endmodule///////////////////////////////////////////////
module cnt_sync(
CLK , // 时钟
CNTVAL, // 输出
OV ); // 溢出信号
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 shumaguan9 (
bcd,
seg);
input [5:0]bcd;//实际计数数值
output seg;
reg [7:0]seg; //各个引脚对应的高低电平
always @(bcd) begin // 计数到24时数码管显示0到9,否则数码管不亮
case (bcd)
6'b011000: seg = 8'h C0; //0
6'b011001: seg = 8'h F9; //1
6'b011010: seg = 8'h A4; //2
6'b011011: seg = 8'h B0; //3
6'b011100: seg = 8'h 99; //4
6'b011101: seg = 8'h 92; //5
6'b011110: seg = 8'h 82; //6
6'b011111: seg = 8'h F8; //7
6'b100000: seg = 8'h 80; //8
6'b100001: seg = 8'h 90; //9
6'b100010: seg = 8'h FF;
default seg = 8'h FF;
endcase
end
endmodule
/////////////////////////////////////////////////////
module shumaguan8 (
bcd,
seg);
input [5:0]bcd;//实际计数数值
output seg;
reg [7:0]seg; //各个引脚对应的高低电平
always @(bcd) begin //计数值为15时数码管显示0到8,否则数码管不亮
case (bcd)
6'b001111: seg = 8'h C0; //0
6'b010000: seg = 8'h F9; //1
6'b010001: seg = 8'h A4; //2
6'b010010: seg = 8'h B0; //3
6'b010011: seg = 8'h 99; //4
6'b010100: seg = 8'h 92; //5
6'b010101: seg = 8'h 82; //6
6'b010110: seg = 8'h F8; //7
6'b010111: seg = 8'h 80; //8
default seg = 8'h FF;
endcase
end
endmodule
module shumaguan7 (
bcd,
seg);
input [5:0]bcd;//实际计数数值
output seg;
reg [7:0]seg; //各个引脚对应的高低电平
always @(bcd) begin //计数值为7时数码管显示0到7,否则数码管不亮
case (bcd)
6'b000111: seg = 8'h C0; //0
6'b001000: seg = 8'h F9; //1
6'b001001: seg = 8'h A4; //2
6'b001010: seg = 8'h B0; //3
6'b001011: seg = 8'h 99; //4
6'b001100: seg = 8'h 92; //5
6'b001101: seg = 8'h 82; //6
6'b001110: seg = 8'h F8; //7
default seg = 8'h FF;
endcase
end
endmodule
module shumaguan6(
bcd,
seg);
input [5:0]bcd;//实际计数数值
output seg;
reg [7:0]seg; //各个引脚对应的高低电平
always @(bcd) begin // 计数值为0时数码管显示0到6,否则数码管不亮
case (bcd)
6'b000000: seg = 8'h C0;//0
6'b000001: seg = 8'h F9;//1
6'b000010: seg = 8'h A4;//2
6'b000011: seg = 8'h B0;//3
6'b000100: seg = 8'h 99;//4
6'b000101: seg = 8'h 92;//5
6'b000110: seg = 8'h 82;//6
default seg = 8'h FF;
endcase
end
endmodule