FPGA实验4: 时间基准电路和带使能的多周期计数器

来源:互联网 发布:linux系统iso镜像下载 编辑:程序博客网 时间:2024/05/23 15:29

说明:

  • 实验一:设计时间基准电路和带使能的多周期计数器,要求后级计数器的计数范围改为0-15,再将计数器的0-15计数值经过译码,在DE0 的 HEX LED上显示成0-9-A-F的十六 进制数

1、 例化的子模块代码

// 时间基准计数器 module cnt_sync(  CLK   ,   // clock  CNTVAL,   // counter value  OV    );  // overflowinput 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;endalways @ (CNTVAL) begin  if(CNTVAL == MAX_VAL)    OV = 1'b1;  else    OV = 1'b0;endendmodule   // 0-15计数器module cnt_en_0to15(  CLK   ,   // clock  CNTVAL,   // counter value  EN    ,  OV    );  // overflowinput 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 valueendalways @ (CNTVAL) begin  if(CNTVAL == 15)    OV = 1'b1;  else    OV = 1'b0;endendmodule  // 7段译码器module bcd7seg (Y,A);  input [3:0] A ; wire [3:0] A ; output [6:0] Y ; wire [6:0] Y ; assign Y =~Y_r; reg [6:0] Y_r;      always @(A)begin         Y_r = 7'b1111111;         case (A )                 4'b0000: Y_r = 7'b0111111; // 0                 4'b0001: Y_r = 7'b0000110; // 1                 4'b0010: Y_r = 7'b1011011; // 2                 4'b0011: Y_r = 7'b1001111; // 3                 4'b0100: Y_r = 7'b1100110; // 4                 4'b0101: Y_r = 7'b1101101; // 5                 4'b0110: Y_r = 7'b1111101; // 6                 4'b0111: Y_r = 7'b0000111; // 7                 4'b1000: Y_r = 7'b1111111; // 8                 4'b1001: Y_r = 7'b1101111; // 9                 4'b1010: Y_r = 7'b1110111; // A                 4'b1011: Y_r = 7'b1111100; // b                 4'b1100: Y_r = 7'b0111001; // c                 4'b1101: Y_r = 7'b1011110; // d                 4'b1110: Y_r = 7'b1111001; // E                 4'b1111: Y_r = 7'b1110001; // F                 default: Y_r = 7'b0000000;             endcase     end endmodule  // bcd7seg (Y,A)

2、原理图
这里写图片描述

3、RTL图

这里写图片描述

这里写图片描述

4、DE0开发板结果显示
链接:0-15计数器——7段译码管显示
http://v.youku.com/v_show/id_XMzE3Njk4NDI4NA==.html?spm=a2hzp.8244740.0.0

  • 实验二:修改时间基准发生器,设计一个使用2个HEX LED,精度为0.1秒,范围为0-9.9秒的计时秒表,再在上面计时器的附加控制功能(清零、暂停)

1、 例化的子模块代码

//生成0.1S时钟module cnt_sync_1(  CLK   ,   // clock  CNTVAL,   // counter value  OV    );  // overflowinput CLK;output [32-1:0] CNTVAL;output OV;parameter MAX_VAL = 5_000_000;reg [32-1:0] CNTVAL;reg OV;always @ (posedge CLK) begin  if(CNTVAL >= MAX_VAL)    CNTVAL <= 0;  else    CNTVAL <= CNTVAL + 1'b1;endalways @ (CNTVAL) begin  if(CNTVAL == MAX_VAL)    OV = 1'b1;  else    OV = 1'b0;endendmodule  //生成1S时钟module cnt_sync_2(  CLK   ,   // clock  CNTVAL,   // counter value  OV    );  // overflowinput 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;endalways @ (CNTVAL) begin  if(CNTVAL == MAX_VAL)    OV = 1'b1;  else    OV = 1'b0;endendmodule  // module cnt_en_0to9计数器module cnt_en_0to9(  CLK   ,   // clock  CNTVAL,   // counter value  reset,    //清零  EN    ,   //使能(暂停)  OV    );  // overflowinput CLK,reset;input EN;output [4-1:0] CNTVAL;output OV;reg [4-1:0] CNTVAL;reg OV;always @ (posedge CLK) begin    if(reset)    CNTVAL <= 0;    else begin  if(EN==0) begin  // work enable    if(CNTVAL >= 9)      CNTVAL <= 0;    else      CNTVAL <= CNTVAL + 1'b1;  end  else    CNTVAL <= CNTVAL ;  // hold same valueendendalways @ (CNTVAL) begin  if(CNTVAL == 9)    OV = 1'b1;  else    OV = 1'b0;endendmodule   // module cnt_en_0to9//显示7段译码器(带小数点)module bcd7seg (Y,A);  input [3:0] A ; wire [3:0] A ; output [7:0] Y ; wire [7:0] Y ; assign Y =~Y_r; reg [7:0] Y_r;      always @(A)begin         Y_r = 8'b1111111;         case (A )                 4'b0000: Y_r = 8'b10111111; // 0                 4'b0001: Y_r = 8'b10000110; // 1                 4'b0010: Y_r = 8'b11011011; // 2                 4'b0011: Y_r = 8'b11001111; // 3                 4'b0100: Y_r = 8'b11100110; // 4                 4'b0101: Y_r = 8'b11101101; // 5                 4'b0110: Y_r = 8'b11111101; // 6                 4'b0111: Y_r = 8'b10000111; // 7                 4'b1000: Y_r = 8'b11111111; // 8                 4'b1001: Y_r = 8'b11101111; // 9                 4'b1010: Y_r = 8'b11110111; // A                 4'b1011: Y_r = 8'b11111100; // b                 4'b1100: Y_r = 8'b10111001; // c                 4'b1101: Y_r = 8'b11011110; // d                 4'b1110: Y_r = 8'b11111001; // E                 4'b1111: Y_r = 8'b11110001; // F                 default: Y_r = 8'b10000000;             endcase     end endmodule  // bcd7seg (Y,A)

2、原理图

这里写图片描述

3、RTL图

这里写图片描述

这里写图片描述

4、DE0开发板结果显示
链接:0-9.9秒表计时器
http://v.youku.com/v_show/id_XMzE3NzAwMTA0MA==.html?spm=a2hzp.8244740.0.0

原创粉丝点击