学生实验
仿照本实验,请完成以下任务
• 1、将后级计数器的计数范围设置为0-15。
• 2、把计数器的0-15计数值经过译码,在DE0 的HEX LED上显示成0-9-A-F的十六 进制数
• 3、修改时间基准发生器,设计一个使用2个HEX,LED,精度为0.1秒,范围为0-9.9秒的计时秒表。
• 4、自行设计上面计时器的附加控制功能(清零、暂停)。
verilog代码如下:
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;
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 cnt_en_0to9
////////////////////////////////////////////////////////////////////////////////
module cnt_en_0to15(
CLK , // clock
CNTVAL, // counter value
EN ,
OV ); // overflow
input CLK;
input EN;
output [4-1:0] CNTVAL;
output OV;
reg [4-1:0] CNTVAL;
reg OV;
always @ (posedge CLK) begin
if(EN) begin // work enable
if(CNTVAL >= 15)
CNTVAL <= 0;
else
CNTVAL <= CNTVAL + 1'b1;
end
else
CNTVAL <= CNTVAL ; // hold same value
end
always @ (CNTVAL) begin
if(CNTVAL == 15)
OV = 1'b1;
else
OV = 1'b0;
end
endmodule // module cnt_en_0to9
////////////////////////////////////////////////////////////////////////////////
module cnt_0to9(
CLK , // clock
CNTVAL, // counter value
OV ); // overflow
input CLK;
output [4-1:0] CNTVAL;
output OV;
reg [4-1:0] CNTVAL;
reg OV;
always @ (posedge CLK) begin
if(CNTVAL >= 9)
CNTVAL <= 0;
else
CNTVAL <= CNTVAL + 1'b1;
end
always @ (CNTVAL) begin
if(CNTVAL == 9)
OV = 1'b1;
else
OV = 1'b0;
end
endmodule // module cnt_0to9
////////////////////////////////////////////////////////////////////////////////
bdf原理图:
RTL Viewer:
编译下载后可以得到0-15数码管显示:
其中,A~F我用小数点提醒,且当计数到F时,LED5亮一次。
下面进行秒表的设计:
首先编写Verilog代码如下:
module cnt_sync(
CLK , // clock
OUT, // counter value
OV ); // overflow
input CLK;
output [32-1:0] OUT;
output OV;
reg [32-1:0] OUT;
reg OV;
parameter MAX_CNT=5000_000;
always @(posedge CLK)
begin
if(OUT<MAX_CNT)
OUT<=OUT+1'b1;
else
OUT<=0;
end
always @(OUT)
begin
if(OUT==MAX_CNT)
OV=1'b1;
else
OV=1'b0;
end
endmodule //module cnt_sync
/////////////////////////////
module CNT_en_0to9(
CLK,
EN,CLR,STOP,
OUT,
OV);
input wire CLK;
input wire EN,CLR,STOP;
output reg [4-1:0] OUT;
output reg OV;
always@ (posedge CLK)
begin
if(CLR)
OUT<=4'b0000;
else begin
if(!STOP) begin
if(EN==1&&OUT<9)
OUT<=OUT+1'b1;
else if(EN==1&&OUT==9)
OUT<=1'b0;
else if(EN==0)
OUT<=OUT;
end
else if(STOP)
OUT<=OUT;
end
end
always @ (OUT)
begin
if(OUT==9)
OV=1'b1;
else
OV=1'b0;
end
endmodule //module CNT_en_0to9
///////////////////////////
module bcd4to8(
IN,
OUT);
input [4-1:0] IN;
output [8-1:0] OUT;
reg [8-1:0] OUT;
always @ (IN) begin
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 bcd4to8
/////////////////////////////
module bcd4to82(
IN,
OUT);
input [4-1:0] IN;
output [8-1:0] OUT;
reg [8-1:0] OUT;
always @ (IN) begin
case (IN)
4'b0000:OUT=8'b01000000;
4'b0001:OUT=8'b01111001;
4'b0010:OUT=8'b00100100;
4'b0011:OUT=8'b00110000;
4'b0100:OUT=8'b00011001;
4'b0101:OUT=8'b00010010;
4'b0110:OUT=8'b00000010;
4'b0111:OUT=8'b01111000;
4'b1000:OUT=8'b00000000;
4'b1001:OUT=8'b00010000;
endcase
end
endmodule
例化创建符号symbol,创建BDF,画电路原理图如下:
编译,分配引脚,将不用的引脚分配为三态。查看RTL Viewer:
编译,下载,秒表设计成功
当SW1设为高电平时,秒表暂停,效果如下:
当SW0设置为1时,秒表清零,效果如下:
验证了实验的正确性。