HDLBits: 在线学习Verilog(Problem 120-126)

简介: HDLBits: 在线学习Verilog(Problem 120-126)

这几天在刷HDLBits,参考的是HDLBits中文导学专栏:HDLBits中文导学,刷到120题的时候发现缺少了中间的120题到126题的解析,就打算自己边写边记录一下。也方便其他的同学进行参考。

Problem 120 Simple FSM 1s

牛刀小试

一个很简单的状态机的题目,给定一个输入,两种状态,一个输出。注意复位的时候复位成B状态,复位采用同步复位。

image.png

解答与分析

这里我们采用三段式的写法来描述这个简单的状态机。

三段式状态机基本格式是:

  • 采用组合逻辑判断状态转移条件
  • 状态触发器实现
  • 描述输出逻辑(既可以用组合电路输出,也可以用时序电路输出)

状态转移条件:根据输入信号以及当前的状态确定次态。

always @(*) begin
        case(state)
            B:next_state=in?B:A;
            A:next_state=in?A:B;
        endcase
    end

状态触发器实现,在时钟边沿实现状态寄存器的跳变以及状态复位

always @(posedge clk) begin
        if(reset) state<=B;
        else    state<=next_state;
    end

输出逻辑,根据当前状态实现输出

assign out=state?1:0;


Problem 121 Simple FSM 2

牛刀小试

一个很简单的状态机的题目,给定两个输入,两种状态,一个输出。两种状态分别为开,关。复位的时候复位成OFF状态。复位采用异步复位,OFF状态输出0,ON状态输出1。

image.png

解答与分析

状态转移条件:根据输入信号以及当前的状态确定次态。

always @(*) begin
        case(state)
            OFF:next_state=j?ON:OFF;
            ON:next_state=k?OFF:ON;
        endcase
    end

状态触发器实现,在时钟边沿实现状态寄存器的跳变以及状态复位

always @(posedge clk, posedge areset) begin
        if(areset)  state<=OFF;
        else    state<=next_state;
    end

输出逻辑,根据当前状态实现输出

assign out=state?1:0;


Problem 122 Simple FSM 1s

牛刀小试

image.png

跟上题类似,只是复位方式不同而已,不再赘述。

Problem 123 Simple state transitions 3

牛刀小试

image.png

如图所示,一共有A,B,C,D四种状态。需要在满足特定输出的情况下进行状态转移和输出,state、next_state此时作为输入输出信号而不是内部信号。

解答与分析

如图所示,一共有A,B,C,D四种状态。状态转移逻辑和输出也很清晰的告诉了我们了。我们只要用状态机进行实现就可以了。

状态转移条件:根据输入信号以及当前的状态确定次态。

always @(*) begin
        case(state)
            A:next_state=in?B:A;
            B:next_state=in?B:C;
            C:next_state=in?D:A;
            D:next_state=in?B:C;
        endcase
    end

输出逻辑,根据当前状态实现输出

assign out=(state==D)?1:0;

Problem 124 Simple one-hot state transitions 3

牛刀小试

v2-49d8b9778406837a95229aa706abd4e0_720w.jpg

解答与分析

独热码状态机的正确写法。独热码状态机仅使用单bit表示状态,是否处在某一状态仅跟一个bit有关,而下个状态的转移也仅与一个bit有关。与其他bit无关。因此我们要按下面的写法写状态转移条件。

状态转移条件:根据输入信号以及当前的状态确定次态。

assign next_state[A] = state[A]&(in == 0) | state[C] & (in == 0);
    assign next_state[B] = state[A]&in | state[B]&in | state[D]&in;
    assign next_state[C] = state[B]&(in == 0) | state[D]&(in == 0);
    assign next_state[D] = state[C] & in;

输出逻辑,根据当前状态实现输出

assign out=(state[D])?1:0;

Problem 125 Simple FSM 3

牛刀小试

同样是一道状态机的题目,给定一个输入,四种状态,一个输出。复位采用异步复位,复位成A状态。D状态输出1,其他状态输出0

image.png

解答与分析

状态转移条件:根据输入信号以及当前的状态确定次态。

always @(*) begin
        case(state)
            A:next_state=in?B:A;
            B:next_state=in?B:C;
            C:next_state=in?D:A;
            D:next_state=in?B:C;
        endcase
    end

状态触发器实现,在时钟边沿实现状态寄存器的跳变以及状态复位

always @(posedge clk, posedge areset) begin
        if(areset)  state<=A;
        else    state<=next_state;
    end

输出逻辑,根据当前状态实现输出

assign out=(state==D)?1:0;

Problem 126 Simple FSM 3s

牛刀小试

v2-3be0c396e66bd5b6e03a4823fb52b120_720w.jpg

解答与分析

跟上题类似,只是复位方式不同而已,不再赘述。直接给出代码

module top_module(
    input clk,
    input in,
    input reset,
    output out); //
    reg [1:0] state,next_state;
    parameter A=0,B=1,C=2,D=3;
    always @(*) begin
        case(state)
            A:next_state=in?B:A;
            B:next_state=in?B:C;
            C:next_state=in?D:A;
            D:next_state=in?B:C;
        endcase
    end
    always @(posedge clk) begin
        if(reset) state<=A;
        else    state<=next_state;
    end
    assign out=(state==D)?1:0;
endmodule


目录
相关文章
|
大数据
数学建模1:lingo软件求解优化模型
数学建模1:lingo软件求解优化模型
140 0
|
算法
Numbers on Whiteboard (codeforces1430)(数学分析)
Numbers on Whiteboard (codeforces1430)(数学分析)
51 0
|
7月前
|
监控 算法 数据处理
【学习笔记】Verilog之五:任务、函数及其他
在Verilog HDL中,任务(tasks)和函数(functions)增强了代码的可读性和重用性。任务是仅在仿真环境中使用的可封装代码,不可综合为硬件电路。任务定义包括标识符、输入/输出声明和实现代码,调用时需提供参数列表。函数与任务类似,但返回单个值,不包含时序控制,并且可以互相调用。函数定义包括返回值范围、输入声明、变量声明和执行代码。系统任务和函数如 `$display` 和 `$fopen` 提供了显示信息、文件I/O等便利功能,用于仿真控制和调试。禁止语句和命名事件则帮助控制代码执行和事件同步。
|
机器学习/深度学习 存储 自然语言处理
机器学习面试笔试知识点-贝叶斯网络(Bayesian Network) 、马尔科夫(Markov) 和主题模型(T M)1
机器学习面试笔试知识点-贝叶斯网络(Bayesian Network) 、马尔科夫(Markov) 和主题模型(T M)
214 0
机器学习面试笔试知识点-贝叶斯网络(Bayesian Network) 、马尔科夫(Markov) 和主题模型(T M)1
|
机器学习/深度学习 自然语言处理 算法
机器学习面试笔试知识点-贝叶斯网络(Bayesian Network) 、马尔科夫(Markov) 和主题模型(T M)2
机器学习面试笔试知识点-贝叶斯网络(Bayesian Network) 、马尔科夫(Markov) 和主题模型(T M)
82 0
|
算法
Plant(快速幂+数学分析(没想到吧,数学无处不在))
Plant(快速幂+数学分析(没想到吧,数学无处不在))
77 0
|
机器学习/深度学习 开发框架 编解码
动手学强化学习(三):动态规划算法 (Dynamic Programming)
动态规划(dynamic programming)是程序设计算法中非常重要的内容,能够高效解决一些经典问题,例如背包问题和最短路径规划。动态规划的基本思想是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到目标问题的解。动态规划会保存已解决的子问题的答案,在求解目标问题的过程中,需要这些子问题答案时就可以直接利用,避免重复计算。本章介绍如何用动态规划的思想来求解在马尔可夫决策过程中的最优策略。
284 0
动手学强化学习(三):动态规划算法 (Dynamic Programming)
|
决策智能
运筹优化学习17:马尔科夫决策规划--例题及Matlab、Lingo和Cplex的建模实现
运筹优化学习17:马尔科夫决策规划--例题及Matlab、Lingo和Cplex的建模实现
运筹优化学习17:马尔科夫决策规划--例题及Matlab、Lingo和Cplex的建模实现
practice2-基础算法2
快速学习practice2-基础算法2
practice2-基础算法2
|
算法 测试技术
环状序列(算法竞赛入门经典二)
环状序列(算法竞赛入门经典二)