Vivado 时序逻辑 计数器

Vivado 摸鱼记录 Day_3 ╮( ̄▽ ̄)╭

1. review

        已经学习过组合逻辑电路 译码器Vivado 3-8译码器 4-16译码器-CSDN博客

        以及Vivado使用流程Vivado 使用流程 二选一数据选择器-CSDN博客

2. 时序逻辑计数器

2.1 分析

        时序逻辑对比组合逻辑,增加了clk,即时钟信号。

        以led每500ms亮灭为例,学习时序逻辑语法。

2.2 design sources

module led_500ms(input clk , input reset_n , output reg led);

             / /led每秒交替闪烁500ms    //使用D触发器4位

            //50MHz  20ns   500ms/20ns = 25000000 25个4位D触发器

            reg [24:0] counter ;

    always@(posedge clk or negedge reset_n) //计数counter

            if(!reset_n)

                counter <= 0;

            else if(counter == 25000000-1)

                counter <= 0;

            else

                counter <= counter + 1'd1;

      

    always@(posedge clk or negedge reset_n)//led 

            if(!reset_n)

                led <= 0;

            else if(counter == 25000000-1)

                led <= !led;     

            //else led <= led;

endmodule

        always 是并行的 所以可以分开写  

               分开写方便修改 counter / led

        reg 在always@块中,被赋值对象类型为reg

        posedge 上升沿  

        negedge 下降沿        

        //else led <= led;  

                对于时序逻辑无else默认保持

                组合逻辑不可无else

        25000000-1 对于计数器:0-1 1-2 2-3 3-0 0-3是四位计数器 故需要减一

                   //此处可用 parameter 后续摸鱼记录会写滴

2.3 simulation sources

`timescale 1ns / 1ns

module led_500ms_tb();

            reg clk , reset_n  ;

            wire led ;

            led_500ms led_500ms2( .clk(clk) , .reset_n(reset_n) , .led(led) );

    

            initial clk = 1 ;//初始化时钟高电平    

            always #10 clk = ~clk ;  //50MHz 10ns翻转一次

            initial

                begin

                        reset_n = 0 ;

                        #201 ;

                        reset_n = 1 ;

                        #2000000000;

                        $stop;

                end

        

endmodule

        initial clk = 1 ;//初始化时钟高电平    

        always #10 clk = ~clk ;  //50MHz 10ns翻转一次          //初始化时钟

        led_500ms led_500ms2( ... );  //一定要记得写红色的名字鸭!!

                     //布吉岛是谁每次只记得改完括号参数就报错T_T

2.4 simulation

2.4.1 counter == 25000000

2.4.2 counter == 25000000 -1

        所以计数器这里要注意-1

        //对于parameter 下次摸鱼再写╮( ̄▽ ̄)╭

  • 28
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Vivado是Xilinx公司开发的一款设计自动化软件工具,它主要用于FPGA(Field-Programmable Gate Array)和ASIC(Application-Specific Integrated Circuit)的设计和编程。在Vivado中,你可以创建和配置各种数字逻辑模块,包括计数器。 28进制计数器是一种计数模数为28的计数器,它通常用于序列生成、脉冲分频或时序控制等应用中。在Vivado的HDL(Hardware Description Language)如Verilog或VHDL中,你可以定义一个具有28个状态的同步或异步计数器,每一步代表28的某个幂次。 要创建一个28进制计数器,你需要执行以下步骤: 1. **模块定义**:在HDL文件中,使用`reg`或`integer`类型定义一个数组表示计数器的状态,并声明它是可修改的(mutable)。 ```verilog module binary_counter_28 ( input clk, // 时钟输入 input reset, // 复位信号 output reg [27:0] count // 输出的28进制计数值 ); ``` 2. **计数逻辑**:编写计数逻辑,当没有复位信号或复位信号为低时,时钟上升沿会驱动计数器向前递增,直到最大值后回零。 ```verilog always @(posedge clk or posedge reset) begin if (reset) begin count <= 0; // 当复位时,清零计数器 else if (posedge clk) begin if (count < 28'd27) // 防止溢出 count <= count + 1; end end ``` 3. **配置和验证**:在Vivado环境中,将此HDL模块拖放到设计图(Design Block Diagram)中,设置适当的接口约束和参数,然后进行功能仿真和硬件综合。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值