FPGA 电路开发入门实验(实验4:时间基准电路和带使能的多周期计数器)

学生实验

仿照本实验,请完成以下任务
• 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时,秒表清零,效果如下:
在这里插入图片描述
验证了实验的正确性。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值