通过verilog实现模可变计数器的设计

这篇具有很好参考价值的文章主要介绍了通过verilog实现模可变计数器的设计。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

实验要求:

        

(一)实验目的

(1)掌握组合逻辑电路和时序电路的 FPGA实现方法;

(2)熟悉EDA开发板和开发软件的使用方法;

(3)学习静态数码管的使用和7段数码显示译码器设计;

(4)掌握时钟在时序电路中的作用;

(5)掌握分频电路的实现方法。

(二)实验要求

设计BCD计数器,可任选模的大小(最大模值至少3位),实验要求:

(1)计数结果用3位数码管显示,显示BCD码;

(2)给出此项设计的仿真波形;

(3)选择实验电路验证此计数器的功能。

(4)设计模值可变的输入端口,通过输入模值和设置信号改变计数器模值

(5)设置涉及1个开关和一个按键,开关作为使能控制,按键作为异步清0。(6)带有进位输出,并进位输出用LED灯显示

        波形仿真应能观察到复位、使能、模值进位输出、设置模值。

        在实验室用开发板下载测试,下载测试现象与仿真相吻合。

        按键能复位,使能无效时计数暂停,能切换模值。

        为缩短仿真时间,仿真和下载测试时对50MHz系统时钟的分频系数可不同。

使用vivado软件

可实现0-1024任意模

代码如下

//源文件
    module CNT(
    input CLK,          // 时钟输入
    input SW1,          // 开关输入,用于计数器使能控制
    input KEY1,      	// 按键输入,用于计数器异步清零
    input [9:0] M_SET,  // 模数设置输入
 
    output reg [9:0] cnt_count,
    output reg [10:0] display_segout,
    output reg LED_OUT          //输出,用于显示进位状态
);
reg [6:0] BCD_OUT0;  // BCD计数结果输出  
reg [6:0] BCD_OUT1; // BCD计数结果输出  
reg [6:0] BCD_OUT2; // BCD计数结果输出  

wire [9:0] M;       // 计数器模数
wire [3:0] bw;
wire [3:0] sw;
wire [3:0] gw;

assign M[0]=M_SET[0];
assign M[1]=M_SET[1];
assign M[2]=M_SET[2];
assign M[3]=M_SET[3];
assign M[4]=M_SET[4];
assign M[5]=M_SET[5];
assign M[6]=M_SET[6];
assign M[7]=M_SET[7];
assign M[8]=M_SET[8];
assign M[9]=M_SET[9];

reg [19:0]count=0; 
reg [30:0]count2=0; 
reg [2:0] sel=0; 
parameter T1MS=50000;
//多位数码管显示
always@(posedge CLK) 
     begin 
        count<=count+1; 
        if(count==T1MS) 
        begin 
            count<=0; 
            sel<=sel+1; 
            if(sel==3) 
            sel<=0; 
         end 
     end
仿真
//wire clk1;
//assign clk1=CLK;
//板子计数频率
reg clk1;
always @(posedge CLK)
	begin count2=count2+1;
		if(count2/10000000%2==1)	begin clk1=1'b1; count2=0;end
		else clk1=1'b0;
	end
板子数码管显示
always@(posedge CLK) 
 begin 
    case(sel) 
        0:display_segout<={4'b0111,BCD_OUT0};
        1:display_segout<={4'b1011,BCD_OUT1};
        2:display_segout<={4'b1101,BCD_OUT2};
        default:display_segout<=11'b1111_1111111; 
    endcase 
 end
 //计数器逻辑
always @(negedge clk1 or posedge KEY1)
begin
    if(KEY1 == 1'b0)   // 异步清零
        cnt_count <= 10'd0;
    else if(SW1 == 1'b1)   // 使能控制
        begin
            if(cnt_count<M)
                begin
                    cnt_count<=cnt_count+10'd1;
                    LED_OUT<=1'b0;
                 end
            else
                begin 
                    cnt_count<=10'd0;
                    LED_OUT<=1'b1;
                 end
        end
end

assign bw =cnt_count/100;
assign sw =cnt_count%100/10;
assign gw =cnt_count%10;

always @(posedge clk1 or negedge KEY1)
    begin
        if(!KEY1)
            begin
                BCD_OUT0<=7'b0000001;
                BCD_OUT1<=7'b0000001;
                BCD_OUT2<=7'b0000001;
            end
         else
            begin
				case (gw)
						0:BCD_OUT0<=7'b0000001; 1:BCD_OUT0<=7'b1001111;
						2:BCD_OUT0<=7'b0010010; 3:BCD_OUT0<=7'b0000110;
						4:BCD_OUT0<=7'b1001100; 5:BCD_OUT0<=7'b0100100;
						6:BCD_OUT0<=7'b0100000; 7:BCD_OUT0<=7'b0001111;
						8:BCD_OUT0<=7'b0000000; 9:BCD_OUT0<=7'b0000100; 
						default: BCD_OUT0<=7'b0000001;    
				endcase
				case (sw)
						0:BCD_OUT1<=7'b0000001; 1:BCD_OUT1<=7'b1001111;
						2:BCD_OUT1<=7'b0010010; 3:BCD_OUT1<=7'b0000110;
						4:BCD_OUT1<=7'b1001100; 5:BCD_OUT1<=7'b0100100;
						6:BCD_OUT1<=7'b0100000; 7:BCD_OUT1<=7'b0001111;
						8:BCD_OUT1<=7'b0000000; 9:BCD_OUT1<=7'b0000100; 
						default: BCD_OUT1<=7'b0000001;        
				endcase
				case (bw)
						0:BCD_OUT2<=7'b0000001; 1:BCD_OUT2<=7'b1001111;
						2:BCD_OUT2<=7'b0010010; 3:BCD_OUT2<=7'b0000110;
						4:BCD_OUT2<=7'b1001100; 5:BCD_OUT2<=7'b0100100;
						6:BCD_OUT2<=7'b0100000; 7:BCD_OUT2<=7'b0001111;
						8:BCD_OUT2<=7'b0000000; 9:BCD_OUT2<=7'b0000100; 
					default : BCD_OUT2<=7'b0000001;     
				endcase
			end 
	end

endmodule
//仿真文件
    `timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2023/03/16 21:54:56
// Design Name: 
// Module Name: sim_CNT
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//
`timescale 1ns/1ps

module sim_CNT();
reg SW1,KEY1;
reg [9:0]M_SET;
wire [9:0] cnt_count;
wire [10:0] display_segout;   
wire LED_OUT;

reg clk1;

initial
    begin
	   clk1= 1'b0;
	   SW1 = 1'b0;
	   #2 KEY1 = 1'b1;
	   M_SET =10'b0000001111;
	   #2 KEY1 = 1'b0;
	   #2 KEY1 = 1'b1; SW1 = 1'b1;    //计数使能信号有效,且不复位 
    end
always
    begin
	   #10 clk1 = ~clk1;
    end
CNT uu1(clk1,SW1,KEY1,M_SET,cnt_count,display_segout,LED_OUT);

endmodule

前任栽树,后人乘凉,希望你们不要简单的cv喔大家有什么问题可以私聊我哦。文章来源地址https://www.toymoban.com/news/detail-449948.html

到了这里,关于通过verilog实现模可变计数器的设计的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【FPGA】Verilog:升降计数器 | 波纹计数器 | 约翰逊计数器 | 实现 4-bit 升降计数器的 UP/DOWN

    目录 Ⅰ. 理论部分 0x00 升降计数器(UP DOWN Counter) 0x01 波纹计数器(Ripple Counter)

    2024年02月05日
    浏览(40)
  • Verilog基础之十、计数器实现

    目录 一、前言 二、工程设计 2.1 设计代码 2.2 综合结果 ​2.3 仿真结果     计数器是较为基础的逻辑,很多其他逻辑可依靠计数器实现,如控制器,分频。原理为通过统计时钟脉冲的个数来输出计数值。 工程设计以计数20的计数器为例 测试代码 综合后的网表可知,6位的计

    2024年02月09日
    浏览(39)
  • verilog手撕代码5——计数器(置位、加减、环形、扭环形、格雷码计数器实现)

    2023.5.12 编写一个十六进制计数器模块,计数器输出信号递增每次到达0,给出指示信号 zero ,当置位信号 set 有效时,将当前输出置为输入的数值 set_num 。 注意 :这里zero=1和num=0是同一拍输出的,按道理如果根据num=0,然后去输出zero=1应该延迟一拍。所以这里考虑将number延迟一

    2024年02月07日
    浏览(44)
  • Verilog数字系统设计——10进制计数器,具有异步复位功能

    编程实现10进制计数器,具有异步复位功能,十位和个位用8421BCD码表示,各端口定义如下图所示: 仔细考虑端口定义中每个端口的含义; 要求完成程序编辑、编译、时序仿真; 实验提交Verilog设计文件(.v文件)、仿真波形截图以及对于第3个步骤所提出问题的回答,文件打包

    2024年02月11日
    浏览(27)
  • Verilog语言实现FPGA上的计数器

    Verilog语言实现FPGA上的计数器 计数器是数字电路中经常使用的基本元素之一,它用于生成指定脉冲数量或者指定计数范围内的计数信号。在现代数字电路设计中,FPGA(Field Programmable Gate Array)作为一种可编程逻辑器件被广泛应用,可以通过Verilog语言来实现计数器模块。 在V

    2024年02月05日
    浏览(35)
  • verilog中几种实现计数器的方法

    module counter ( input clk, output reg [3:0] count ); always @(posedge clk) begin if (count == 4’hF) begin count = 4’h0; end else begin count = count + 4’b1; end end endmodule integer      i ; reg [3:0]    counter2 ; initial begin     counter2 = \\\'b0 ;     for (i=0; i=10; i=i+1) begin         #10 ;         counter2 = coun

    2024年02月03日
    浏览(34)
  • 【FPGA】Verilog:时序电路设计 | 自循环移位寄存器 | 环形计数 | 扭环计数 | 约翰逊计数器

    前言: 本章内容主要是演示Vivado下利用Verilog语言进行电路设计、仿真、综合和下载 示例:计数器   ​​ 功能特性: 采用 Xilinx Artix-7 XC7A35T芯片  配置方式:USB-JTAG/SPI Flash 高达100MHz 的内部时钟速度  存储器:2Mbit SRAM   N25Q064A SPI Flash(样图旧款为N25Q032A) 通用IO:Switch :

    2024年02月10日
    浏览(59)
  • 【FGPA】Verilog:移位寄存器 | 环形计数器 | 4bit移位寄存器的实现 | 4bit环形计数器的实现

      目录 Ⅰ. 理论部分 0x00 移位寄存器(Shift Register) 0x01 环形计数器(Ring Counter)

    2024年02月05日
    浏览(30)
  • FPGA开发] 使用Verilog实现一个简单的计数器

    计数器是数字电路中常见的元件之一,它能够按照一定的规律进行计数。在FPGA开发中,我们可以使用硬件描述语言Verilog来实现一个简单的计数器。本文将为您详细介绍如何使用Verilog编写一个基于FPGA的计数器,并提供相应的源代码。 首先,我们需要定义计数器的功能和规格

    2024年02月03日
    浏览(45)
  • 基于FPGA的四位数码管显示按键计数器设计(verilog编程)

    软件:Vivado 2022.2 硬件:BASYS 3 设计描述:通过开发板上的四个按键,按下一次记数加一,分别由四个数码管从左到右分别显示四个按键记数情况。 例: 1.初始值为0000,意为无记数 2.当按下第一个按键,记数加一,数码管显示1000 3.再次按下一第一个按键,记数加一,数码管显

    2024年02月08日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包