Verilog 入门(九)(建模实例)

文章目录

  • 建模的不同方式
  • 条件操作建模
  • 通用移位寄存器
  • 状态机建模
  • Moore 有限状态机建模
  • Mealy 型有限状态机建模

建模的不同方式

分别使用数据流方式、行为方式和结构方式对下图所示的电路进行建模:

在这里插入图片描述
数据流方式:使用连续赋值语句对电路建模

module Save_Mult_Df(A, C, ClkB, Z);
  input[0:7] A;
  input[0:3] C;
  input ClkB;
  output[0:11] Z;
  wire S1;

  assign Z = S1 * C;
  assign S1 = ClkB ? A : S1;
endmodule

行为方式:使用带有顺序程序块的 always 语句,将电路建模为顺序程序描述。

module Save_Mult_Df(A, C, ClkB, Z);
  input[0:7] A;
  input[0:3] C;
  input ClkB;
  output[0:11] Z;
  reg[0:11] Z;

  always@(A or C or ClkB) begin:SEQ
    reg[0:7] S1;
    if(ClkB)
      S1 = A;
    Z = S1 * C;
  end
endmodule

结构方式:是假定已存在 8 位寄存器和 8 位乘法器,将电路建模为线网表。

module Save_Mult_Df(A, C, ClkB, Z);
  input[0:7] A;
  input[0:3] C;
  input ClkB;
  output[0:11] Z;
  wire[0:7] S1, S3;
  wire[0:15] S2;

  Reg8 R1(.Din(A), .Clk(ClkB), .Dout(S1));
  Mult8 M1(.A(S1), .B({4'b0000, C}), .Z(Z));
endmodule

条件操作建模

在特定条件下发生的操作可以使用带有条件操作符的连续赋值语句,或在 always 语句中用 if 语句或 case 语句建模。如下面描述的一个算术逻辑电路:

module Simple_ALU(A, B, C, PM, ALU);
  input[0:3] A, B, C;
  input PM;
  output[0:3] ALU;

  assign ALU = PM ? A + B : A - B;
endmodule

多路选择开关也能够使用 always 语句建模。首先确定选线的值,然后,case 语句根据这个值选择相应的输入赋值到输出。

`timescale 1ns/1ns
module Multiplexer(Sel, A, B, C, D, Mux_Out);
  input[0:1] Sel;
  input A, B, C, D;
  output Mux_Out;
  reg Mux_Out;
  reg Temp;
  parameter MUX_DELAY = 15;

  always@(Sel or A or B or C or D)
    begin:P1
      case(Sel)
        0: Temp = A;
        1: Temp = B;
        2: Temp = C;
        3: Temp = D;
      endcase
      Mux_Out = #MUX_DELAY Temp
    end
endmodule

通用移位寄存器

通用串行输入、串行输出移位寄存器能够使用 always 语句块内的 for 循环语句建模。寄存器的数量被定义为参数,这样通用移位寄存器的数量在其他设计中被引用时,可以修改。

module Shift_Reg(D, Clock, Z);
  input D, Clock;
  output Z;
  parameter NUM_REG = 6;
  reg[1:NUM_REG] Q;
  integer P;

  always@(negedge Clock) begin
    // 寄存器右移一位
    for(P=1; P<NUM_REG; P=P+1)
      Q[P+1] = Q[P]
    // 加载串行数据
    Q[1] = D;
  end

  // 从最右端寄存器获取输出;
  assign Z = Q[NUM_REG];
endmodule

状态机建模

状态机通常可使用带有 always 语句的 case 语句建模。状态信息存储在寄存器中。case 语句的多个分支包含每个状态的行为。下面是表示状态机简单乘法算法的实例:

在这里插入图片描述

module Multiply(Mplr, Mcnd, Clock, Reset, Done, Acc);
  input[0:15] Mplr, Mcnd;
  input Clock, Reset;
  output Done;
  reg Done;
  output[31:0] Acc;
  reg[31:0] Acc;
  parameter INIT = 0, ADD = 1, SHIFT = 2;
  reg[0:1] Mpy_State;
  reg[31:0] Mcnd_Temp;

  initial Mpy_State = INIT;

  always@(negedge Clock) begin:PROCESS
    integer Count;
    case(Mpy_State)
      INIT:
        if(Reset)
          Mpy_State = INIT;
        else
          begin
            Acc = 0;
            Count = 0;
            Mpy_State = ADD;
            Done = 0;
            Mcnd_Temp[15:0] = Mcnd;
            Mcnd_Temp[31:16] = 1'd0;
          end
      ADD:
        begin
          if(Mplr[Count])
            Acc = Acc + Mcnd_Temp
            Mpy_State = SHIFT;
          end
      SHIFT:
        begin
          Mcnd_Temp = {Mcnd_Temp[30:0], 1'b0};
          Count = Count + 1;
          if(Count == 16)
            begin
              Mpy_State = INIT;
              Done = 1;
            end
          else
            Mpy_State = ADD;
        end
    endcase
  end
endmodule

Moore 有限状态机建模

Moore 有限状态机(FSM)的输出只依赖于状态而不依赖其输入。这种类型有限状态机的行为能够通过使用带有在状态值上转换的 case 语句的 always 语句建模。

在这里插入图片描述

module Moore_FSM(A, Clock, Z);
  input A, Clock;
  output Z;
  reg Z;

  parameter STO = 0, ST1 = 1, ST2 = 2, ST3 = 3;
  reg[0:1] Moore_State;

  always@(negedge Clock)
    case(Moore_State)
      ST0: begin
        Z = 1;
        if(A)
          Moore_State = ST2;
      end

      ST1: begin
        Z = 0;
        if(A)
          Moore_State = ST3;
      end

      ST2: begin
        Z = 0;
        if(~A)
          Moore_State = ST1;
        else
          Moore_State = ST3;
      end

      ST3: begin
        Z = 1;
        if(A)
          Moore_State = ST0;
      end
    endcase
endmodule

Mealy 型有限状态机建模

在 Mealy 型有限状态机中,输出不仅依赖机器的状态而且依赖于它的输入。

在这里插入图片描述

module Mealy_FSM(A, Clock, Z);
  input A, Clock;
  output Z;
  reg Z;

  parameter STO = 0, ST1 = 1, ST2 = 2, ST3 = 3;
  reg[1:2] P_State, N_State;

  always@(negedge Clock)
    P_State = N_State;

  always@(P_State or A) begin:COMB_PART
    case(P_State)
      ST0:
        if(A) begin
          Z = 1;
          N_State = ST3;
        end
        else
          Z = 0;

      ST1:
        if(A) begin
          Z = 0;
          N_State = ST0;
        end
        else
          Z = 1;

      ST2:
        if(~A)
          Z = 0;
        else begin
          Z = 1;
          N_State = ST1;
        end

      ST3:
        begin
          Z = 0;
          if(~A)
            N_State = ST2;
          else
            N_State = ST1;
        end
    endcase
  end
endmodule

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/212948.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【ArcGIS Pro微课1000例】0043:深度学习--框架库安装

ArcGIS Pro 中的所有深度学习地理处理工具都要求安装支持的深度学习框架库。 文章目录 深度学习框架库下载深度学习框架库安装注意事项深度学习框架库下载 由于是python开发,可以采用安装包与Pip两种方式安装,本文讲解采用安装包安装。 点击深度学习框架库下载,打开网站,…

二叉树链式结构的实现和二叉树的遍历以及判断完全二叉树

二叉树的实现 定义结构体 我们首先定义一个结构来存放二叉树的节点 结构体里分别存放左子节点和右子节点以及节点存放的数据 typedef int BTDataType; typedef struct BinaryTreeNode {BTDataType data;struct BinaryTreeNode* left;struct BinaryTreeNode* right; }BTNode;…

【数电笔记】20-有约束的逻辑函数化简

目录 说明&#xff1a; 约束项和约束条件 1. 引例 1.1 引例中的约束项 1.2 引例中的约束条件 利用约束项 / 约束条件化简逻辑函数 1. 例1 2. 例2 3. 例3 4. 例4 说明&#xff1a; 笔记配套视频来源&#xff1a;B站&#xff1b;本系列笔记并未记录所有章节&#xff0…

HTTPS安全防窃听、防冒充、防篡改三大机制原理

前言 本文内容主要对以下两篇文章内容整理过滤&#xff0c;用最直观的角度了解到HTTPS的保护机制&#xff0c;当然啦&#xff0c;如果想要深入了解HTTPS&#xff0c;本文是远远不够的&#xff0c;可以针对以下第一个链接中的文章拓展板块进行学习&#xff0c;希望大家通过本文能…

css如何设置文本添加下划线

css文本添加下划线 text-decoration: underline;text-decoration相关属性参数 参数描述none默认。定义标准的文本。underline定义文本下的一条线。overline定义文本上的一条线。line-through定义穿过文本下的一条线。blink定义闪烁的文本。inherit规定应该从父元素继承 text-…

人体姿态估计算法

人体姿态估计算法 1 什么是人体姿态估计2 基于经典传统和基于深度学习的方法2.1 基于经典传统的人体姿态估计算法2.2 基于深度学习的人体姿态估计算法OpenPoseAlphaPose (RMPE) 3 算法应用4 Paper 人体姿态估计在现实中的应用场景很丰富&#xff0c;如下 动作捕捉&#xff1a;三…

非常好的简历精选7篇

想要打造一份令人眼前一亮的简历&#xff0c;赢得招聘方的青睐&#xff1f;参考这7篇精选的“非常好的简历”案例&#xff01;无论是应届毕业生还是职场人士&#xff0c;都能从中借鉴灵感&#xff0c;提升简历质量。让求职之路更加顺畅&#xff0c;轻松斩获心仪职位&#xff01…

跨境独立站和传统外贸的差异

跨境独立站和传统外贸主要在以下几个方面存在区别&#xff1a; 交易形式&#xff1a;传统外贸主要涉及线下交易&#xff0c;买卖双方需要经过面谈、磋商、签订合同等环节。而跨境独立站则主要通过线上平台进行交易&#xff0c;买卖双方可以通过平台发布产品、协商价格、完成支…

linux 内核regulator

问题 在sys文件系统下没有生成cpu 调频的相关节点。 日志对比 [ 3.588745] cpu cpu4: Looking up cpu-supply from device tree [ 3.588753] cpu cpu4: Failed to get reg [ 3.588791] cpu cpu4: Looking up cpu-supply from device tree [ 3.588808] Failed to i…

【数电笔记】18-卡诺图化简

目录 说明&#xff1a; 用卡诺图化简逻辑函数 1. 公式法化简与卡诺图化简对比 2. 化简依据 3. 化简规律 3.1 两个小方块相邻 3.2 四个小方块相邻 3.3 八个小方块相邻 4. 卡诺图化简法步骤 4.1 例1 4.2 例2 5. 画卡诺圈规则 5.1 例1 6. 特殊情况 6.1 例1 6.2 例…

【LeetCode刷题笔记】103. 二叉树的锯齿形层序遍历

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; 更多算法知识专栏&#xff1a;算法分析&#x1f525; 给大家跳段街舞感谢…

linux安装镜像cento7

点击创建新的虚拟机 点击典型&#xff0c;下一步 浏览&#xff0c;centos7下载文件的位置 找到位置后&#xff0c;效果如下图所示 下一步&#xff0c;填写用户名和密码&#xff0c;再点击下一步 给虚拟机起名字&#xff0c;默认就行&#xff1b;虚拟机安装路径&#xff0c;默认…

JavaSE自定义验证码图片生成器

设计项目的时候打算在原有的功能上补充验证码功能&#xff0c;在实现了邮箱验证码之后想着顺便把一个简单的图片验证码生成器也实现一下&#xff0c;用作分享。 注意&#xff0c;实际开发中验证码往往采用各种组件&#xff0c;通过导入依赖来在后端开发时使用相关功能&#xf…

组件的props属性

目录 1&#xff1a;使用props的作用&#xff1a; 2&#xff1a;props自定义属性的用法&#xff1a; 3&#xff1a;集合v-bind使用自定义属性&#xff1a; 4&#xff1a;props自定义属性是只读的&#xff1a; 5&#xff1a;default默认值&#xff1a; 6&#xff1a;type值类…

Unity版本使用情况统计(更新至2023年10月)

本期UWA发布的内容是第十三期Unity版本使用统计&#xff0c;统计周期为2023年5月至2023年10月&#xff0c;数据来源于UWA网站&#xff08;www.uwa4d.com&#xff09;性能诊断提测的项目。希望给Unity开发者提供相关的行业趋势&#xff0c;了解近半年来哪些Unity版本的使用概率更…

C/C++,树算法——Ukkonen的“后缀树“构造算法的源程序

1 文本格式 // A C program to implement Ukkonens Suffix Tree Construction // And then build generalized suffix tree #include <stdio.h> #include <string.h> #include <stdlib.h> #define MAX_CHAR 256 struct SuffixTreeNode { struct Suffix…

Python Locals:引领代码风潮,变量管理新尝试

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 在Python中&#xff0c;locals()函数是一个强大的工具&#xff0c;它使程序员能够访问和操作当前作用域内的局部变量。本文将深入探讨locals()函数的功能、应用和重要性。 动态变量赋值和操作 locals()函数让我…

[数据结构]HashSet与LinkedHashSet的底层原理学习心得

我们区分list和set集合的标准是三个&#xff1a;有无顺序&#xff0c;可否重复&#xff0c;有无索引。 list的答案是&#xff1a;有顺序&#xff0c;可重复&#xff0c;有索引。这也就是ArrayList和LinkedList的共性 set的答案是&#xff1a;顺序内部再区分,不可以重复&#xf…

分享几个国内免费使用的 gpt 网站

可放心阅读点击&#xff0c;无邀请链接、邀请码等 今天主要分享几个个免费的GPT网站。 1、思默问答&#xff08;SiteSMO&#xff09; AI写作生成器_智能写作_问答助手 - 思默问答 算是国内比较早的AI应用网站&#xff0c;支持问答&#xff0c;画图等&#xff0c;所有的问答…

visual Studio MFC 平台实现图像增强中的线性变换(负变换)和非线性变换(对数与幂律)

MFC 实现数字图像处理中的图像增强操作 本文使用visual Studio MFC 平台实现图像增强中典型的三种图像增强的方法中的两大类&#xff0c;包括线性变换–>负变换&#xff0c;非线性变换–>对数变换和幂律变换&#xff1b;其中第三大类分段式变换可以参考MFC实现图像增强–…