6 Verilog进阶篇:时序逻辑2

本文详细介绍了使用Verilog进行时序逻辑设计的多个案例,包括2/4/8分频时钟分频器、自动贩售机状态机设计以及奇数分频器的实现,涵盖了不同场景下的Verilog代码实现和状态转移逻辑分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

VL13 时钟分频(偶数)

描述

请使用D触发器设计一个同时输出2/4/8分频的50%占空比的时钟分频器

注意rst为低电平复位

信号示意图:

波形示意图:

输入描述:

输入信号 clk rst 
类型 wire

输出描述:

输出信号 clk_out2 clk_out4 clk_out8
类型  wire

题意整理

对于偶数分频电路,在不考虑时钟同步时钟延迟的问题时,直接使用D触发器级联来实现

题解主体

级联D触发器,可以得到状态转换:

关键在于,上升沿才能触发翻转,但是一个周期只有一个上升沿,因此周期翻倍

clkin

clkout2

clkout4

clkout8

0

0

0

0

1

1

1

1

0

1

1

1

1

0

1

1

0

0

1

1

1

1

0

1

0

1

0

1

1

0

0

1

根据激励方程和输出方程以及思路整理,关键电路如下:

将电路转换成Verilog代码描述如下

   //2 分频

   reg                  clk_div2 ;

   always @(posedge clk_in or negedge rst) begin

      if (!rst) begin

         clk_div2     <= 'b0 ;

      end

      else begin

         clk_div2     <= ~clk_div2 ;

      end

   end

   assign       clk_out2 = clk_div2 ;

   //4 分频

   reg                  clk_div4 ;

   always @(posedge clk_out2 or negedge rst) begin

      if (!rst) begin

         clk_div4     <= 'b0 ;

      end

      else begin

         clk_div4     <= ~clk_div4 ;

      end

   end

   assign clk_out4      = clk_div4 ;

       //8 分频

   reg                  clk_div8 ;

   always @(posedge clk_out4 or negedge rst) begin

      if (!rst) begin

         clk_div8     <= 'b0 ;

      end

      else begin

         clk_div8     <= ~clk_div8 ;

      end

   end

   assign clk_out8      = clk_div8 ;

因此实现方式为如下的电路,综合得到:

`timescale 1ns/1ns


module even_div
    (
    input     wire rst ,
    input     wire clk_in,
    output    wire clk_out2,
    output    wire clk_out4,
    output    wire clk_out8
    );


   //2 分频
   reg                  clk_div2 ;
   always @(posedge clk_in or negedge rst) begin
      if (!rst) begin
         clk_div2     <= 'b0 ;
      end
      else begin
         clk_div2     <= ~clk_div2 ;
      end
   end
   assign       clk_out2 = clk_div2 ;


   //4 分频
   reg                  clk_div4 ;
   always @(posedge clk_out2 or negedge rst) begin
      if (!rst) begin
         clk_div4     <= 'b0 ;
      end
      else begin
         clk_div4     <= ~clk_div4 ;
      end
   end
   assign clk_out4      = clk_div4 ;

	//8 分频
   reg                  clk_div8 ;
   always @(posedge clk_out4 or negedge rst) begin
      if (!rst) begin
         clk_div8     <= 'b0 ;
      end
      else begin
         clk_div8     <= ~clk_div8 ;
      end
   end
   assign clk_out8      = clk_div8 ;

endmodule

VL14 自动贩售机1

描述

题目描述:   

设计一个自动贩售机,输入货币有三种,为0.5/1/2元,饮料价格是1.5元,要求进行找零,找零只会支付0.5元。

ps:

投入的货币会自动经过边沿检测并输出一个在时钟上升沿到1,在下降沿到0的脉冲信号

注意rst为低电平复位

信号示意图:

d1   0.5元

d2   1元

d3   2元

out1 饮料

out2 零钱

波形示意图:

对应的激励源:

输入描述:

输入信号 clk rst d1 d2 d3 
类型 wire

输出描述:

输出信号  out1 [1:0]out2
类型  reg

题解主体

1、确定题目要求

首先根据信号端口图:

考虑状态转移,需要考虑的是有三输入二输出,存在状态0 0.5 1 1.5 2 2.5 3 七个状态,

这样输出信号的特性应该为: out1饮料为一位,out2找零为2位(0 1 2 3个0.5元)

因此先做转移表格:(需要注意的是,0.5/1/2是不会同时给信号的)

现态

d1

d2

d3

现态值

现态代号

次态值

次态代号

次态值

次态代号

次态值

次态代号

0

S0

0.5

S1

1

S2

2

O2=1

S4

0.5

S1

1

S2

1.5

O2=0

S3

2.5

O2=2

S5

1

S2

1.5

O2=0

S3

2

O2=1

S4

3

O2=3

S6

1.5

S3

2

S4

2.5

S5

3

S6

蓝色格子代表输出

注意没有写输入为0,对于输入为0非蓝色格子状态保持,对于蓝色格子,状态转移至S0

2、画出状态转移

3、按照状态转移写出三段式状态机

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值