计数器 FPGA 电路实验 作业

实验一
1.设计功能描述

在 DE0 开发板上,设计一个变换计数最大值的循环计数器:在电路复位后会循环的从0值递增计数到最大值,第一次计数最大值是6,然后是7、8、9,然后计数最大值又变成6,如此往复循环; 计数数值以十进制数在最右侧的 HEX LED 数码管上显示,变化的时间间隔是1秒 ,复位时,数码管熄灭。
2.手工绘制的RTL图
计数器 FPGA 电路实验 作业_第1张图片

3.Quartus Ⅱ9.0 编译生成的RTL电路图

计数器 FPGA 电路实验 作业_第2张图片

(1)时间基准电路

计数器 FPGA 电路实验 作业_第3张图片

(2)计数器模块

计数器 FPGA 电路实验 作业_第4张图片

(3)数码管译码模块

计数器 FPGA 电路实验 作业_第5张图片

4.程序源代码

///////////////时间基准电路/////////////
module cnt_sync(  
  CLK   ,    
  CNTVAL,     
  OV    );   
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 counter(                     //对1s基本信号计数
EN,                                 //计数使能控制
CLK,
COU,
RST);
input RST, EN, CLK;
output reg [3:0] COU;               
reg [1:0] M;
reg [3:0] MAX = 4'b0110;

always @ (posedge CLK)
    if (RST == 1)                  
        if (EN == 1)
            if (COU != MAX)
            begin
                COU <= COU + 1'b1;
                M <= M;
            end
            else
            begin
                COU <= 4'b0000;
                M <= M + 1'b1;
            end
        else 
            COU <= COU;
    else                               //清零
        begin
        M <= 2'b00;
        COU <= 4'b0000;
        end
always @ (COU) 
    case (M)                         //计数最值控制
        2'b00 : MAX = 4'b0110;
        2'b01 : MAX = 4'b0111;
        2'b10 : MAX = 4'b1000;
        2'b11 : MAX = 4'b1001;
    endcase
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 = 8'b11111111;
 else
  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 dec_4to8;

5.Signal Tap 分析

计数器 FPGA 电路实验 作业_第6张图片

实验内容二
1、设计要求

设计一个变换计数最大值的循环计数器在 DE0 开发板的从左到右的 4个HEX LED 数码管上,进行计数并用十进制数进行显示:左1 LED,显示 0、1、2 ~6 ,然后熄灭;左2 LED,显示 0、1、2 ~7 ,然后熄灭;左3 LED,显示 0、1、2 ~8 ,然后熄灭;最右侧 LED,显示 0、1、2 ~9 ,然后熄灭
然后再开始左1 LED, 显示 0、1、2~6 如此一直循环;所有情况下,计数数值变化的时间间隔是1秒,复位时,所有数码管熄灭,复位后,重新开始计数显示。

2.手工绘制RTL图
计数器 FPGA 电路实验 作业_第7张图片

3.Quartus Ⅱ9.0 编译生成的RTL电路图

计数器 FPGA 电路实验 作业_第8张图片

(1)时间基准电路

计数器 FPGA 电路实验 作业_第9张图片

(2)循环计数模块

计数器 FPGA 电路实验 作业_第10张图片

(3)计数值译码显示模块

计数器 FPGA 电路实验 作业_第11张图片

4.程序源代码

//////////////////////时间基准电路/////////////////////// 
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 
///////////////循环计数模块/////////////////////////
module counter(   //对1s信号计数
EN,
RST,
CLK,
M,
COU);
input RST,EN, CLK;
output reg [3:0] COU;
output reg [1:0] M;
reg [3:0] MAX = 4'b0110;

always @ (posedge CLK)
if (RST == 1)
    if (EN == 1)
        if (COU != MAX)
        begin
            COU <= COU + 1'b1;
            M <= M;
        end
        else
        begin
            COU <= 4'b0000;
            M <= M + 1'b1;
        end
    else 
        COU <= COU;
else
    begin
        COU <= 4'b0000;
        M <= 2'b00;
    end
always @ (COU) 
    case (M)
        2'b00 : MAX = 4'b0110;
        2'b01 : MAX = 4'b0111;
        2'b10 : MAX = 4'b1000;
        2'b11 : MAX = 4'b1001;
    endcase
endmodule
///////////////////计数值译码显示模块///////////////////////
module dec_seg(                             //显示译码
M,
COU_IN,
SEG0,
SEG1,
SEG2,
SEG3);
input [1:0] M;
input [3:0] COU_IN;
output reg [7:0] SEG0;
output reg [7:0] SEG1;
output reg [7:0] SEG2;
output reg [7:0] SEG3;
reg [7:0] SEG_data [3:0];

always @ (COU_IN)
case(COU_IN)                                //系统输出编码表
    4'b0000 : SEG_data[M] = 8'b1100_0000;
    4'b0001 : SEG_data[M] = 8'b1111_1001;
    4'b0010 : SEG_data[M] = 8'b1010_0100;
    4'b0011 : SEG_data[M] = 8'b1011_0000;
    4'b0100 : SEG_data[M] = 8'b1001_1001;
    4'b0101 : SEG_data[M] = 8'b1001_0010;
    4'b0110 : SEG_data[M] = 8'b1000_0010;
    4'b0111 : SEG_data[M] = 8'b1111_1000;
    4'b1000 : SEG_data[M] = 8'b1000_0000;
    4'b1001 : SEG_data[M] = 8'b1001_0000;
    4'b1010 : SEG_data[M] = 8'b1000_1000;
    4'b1011 : SEG_data[M] = 8'b1000_0011;
    4'b1100 : SEG_data[M] = 8'b1100_0110;
    4'b1101 : SEG_data[M] = 8'b1010_0001;
    4'b1110 : SEG_data[M] = 8'b1000_0110;
    4'b1111 : SEG_data[M] = 8'b1000_1110;
endcase

always @ (M)
case (M)         //根据当前的计数值COU选择显示的数码管,并关闭其他数码管
    2'b00 : begin SEG0 = SEG_data[M];SEG3 = 8'b1111_1111;   
                  SEG1 = 8'b1111_1111; SEG2 = 8'b1111_1111; end                                                                                             
    2'b01 : begin SEG1 = SEG_data[M];SEG0 = 8'b1111_1111;
                  SEG2 = 8'b1111_1111; SEG3 = 8'b1111_1111; end
    2'b10 : begin SEG2 = SEG_data[M];SEG1 = 8'b1111_1111;
                  SEG0 = 8'b1111_1111; SEG3 = 8'b1111_1111; end
    2'b11 : begin SEG3 = SEG_data[M];SEG0 = 8'b1111_1111;
                  SEG1 = 8'b1111_1111; SEG2 = 8'b1111_1111; end
endcase
endmodule

5.Signal Tap 分析

5.Signal Tap 分析

6.视频链接

视频链接

你可能感兴趣的:(计数器 FPGA 电路实验 作业)