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:SEQreg[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:P1case(Sel)0: Temp = A;1: Temp = B;2: Temp = C;3: Temp = D;endcaseMux_Out = #MUX_DELAY Tempend
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:PROCESSinteger Count;case(Mpy_State)INIT:if(Reset)Mpy_State = INIT;elsebeginAcc = 0;Count = 0;Mpy_State = ADD;Done = 0;Mcnd_Temp[15:0] = Mcnd;Mcnd_Temp[31:16] = 1'd0;endADD:beginif(Mplr[Count])Acc = Acc + Mcnd_TempMpy_State = SHIFT;endSHIFT:beginMcnd_Temp = {Mcnd_Temp[30:0], 1'b0};Count = Count + 1;if(Count == 16)beginMpy_State = INIT;Done = 1;endelseMpy_State = ADD;endendcaseend
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: beginZ = 1;if(A)Moore_State = ST2;endST1: beginZ = 0;if(A)Moore_State = ST3;endST2: beginZ = 0;if(~A)Moore_State = ST1;elseMoore_State = ST3;endST3: beginZ = 1;if(A)Moore_State = ST0;endendcase
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_PARTcase(P_State)ST0:if(A) beginZ = 1;N_State = ST3;endelseZ = 0;ST1:if(A) beginZ = 0;N_State = ST0;endelseZ = 1;ST2:if(~A)Z = 0;else beginZ = 1;N_State = ST1;endST3:beginZ = 0;if(~A)N_State = ST2;elseN_State = ST1;endendcaseend
endmodule

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

viple模拟器使用(四):unity模拟器中实现两距离局部最优迷宫算法

名字解读 两距离&#xff1a;指的是左侧距离和右侧距离 局部最优&#xff1a;对当前状态来说最好的选择&#xff0c;至于整体能不能达到最优&#xff0c;是无法确定的。 从节点1到节点5&#xff0c;一共有3条路 第1条路线&#xff1a;1→2→4→5&#xff0c;对应的花销是&…

机器学习笔记 - 什么是模型量化压缩技术?

一、简述 我们都知道现实世界是连续的状态,而计算机世界是离散的状态,这是什么意思呢?我们看一下下图,最右边的马力欧(高清)的状态,可以想象现实世界是连续的状态,而电脑世界在图像上呈现的是一格一格子的状态(左图)是离散的状态。 所以在计算机世界如果想要…

51单片机应用从零开始(十)·指针

指针 C语言指针是一种保存变量地址的数据类型。它可以让程序直接访问内存中的数据&#xff0c;而不需要通过变量名来访问。指针变量存储的是一个地址&#xff0c;这个地址指向内存中的某个位置&#xff0c;该位置存储了一个值。 在C语言中&#xff0c;可以使用&运算符取得一…

【计算机网络笔记】物理层——数据通信基础

系列文章目录 什么是计算机网络&#xff1f; 什么是网络协议&#xff1f; 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能&#xff08;1&#xff09;——速率、带宽、延迟 计算机网络性能&#xff08;2&#xff09;…

绝地求生在steam叫什么?

绝地求生在Steam的全名是《PlayerUnknowns Battlegrounds》&#xff0c;简称为PUBG。作为一款风靡全球的多人在线游戏&#xff0c;PUBG于2017年3月23日正式上线Steam平台&#xff0c;并迅速成为一部热门游戏。 PUBG以生存竞技为核心玩法&#xff0c;玩家将被投放到一个辽阔的荒…

CRM简单小结

思想 对于三层架构&#xff0c;一个模块对应一个controller&#xff0c;controller实际就是Servlet&#xff1b;一张表对应一个domain类对应一个dao接口对应一个mapper文件&#xff1b;service层没有严格规定&#xff0c;如果两张表内容相近&#xff0c;用一个service接口也可以…

数据结构:图文详解双向链表的各种操作(头插法,尾插法,任意位置插入,查询节点,删除节点,求链表的长度... ...)

目录 一.双向链表的概念 二.双向链表的数据结构 三.双向链表的实现 节点的插入 头插法 尾插法 任意位置插入 节点的删除 删除链表中第一次出现的目标节点 删除链表中所有与关键字相同的节点 节点的查找 链表的清空 链表的长度 四.模拟实现链表的完整代码 前言&am…

检测下我的饺子皮擀的怎么样(圆度)

&#x1f604;&#x1f60a;&#x1f606;&#x1f603;&#x1f604;&#x1f60a;&#x1f606;&#x1f603; 各位老铁周末愉快。 快乐的时间做充实的事&#xff0c;好久没有吃饺子了&#xff0c;俗话说好吃不过饺子。 我个人觉得会包饺子不算本事&#xff0c;会擀饺子皮…

Linux 上的容器技术

容器实现封闭的环境主要要靠两种技术&#xff0c;一种是看起来是隔离的技术&#xff0c;称为 namespace&#xff08;命名空间&#xff09;。在每个 namespace 中的应用看到的&#xff0c;都是不同的 IP 地址、用户空间、进程 ID 等。另一种是用起来是隔离的技术&#xff0c;称为…

【csdn默认使用操作详解】

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

使用PCSS实现的实时阴影效果

PCSS的技术可以使得阴影呈现出近硬远软的效果&#xff0c;并且能够实时实现。 其核心理念是通过模拟光源的面积来产生更自然、更柔和的阴影边缘。 具体步骤&#xff1a; 1、生成shadowmap 2、在进行阴影的比较时候进行平均&#xff0c;并非之前的shadow map 或者之后完全的阴影…

YOLOv8创新魔改教程(二)如何添加注意力机制

YOLOv8创新魔改教程&#xff08;二&#xff09;如何添加注意力机制 &#xff08;一&#xff09;找代码 github找各种注意力机制的代码 &#xff08;二&#xff09;融合 1.创建文件 在ultralytics/nn/attention.py创建attention.py 文件 将找到的代码粘贴进来 2.修改task…

【计算机组成原理】存储器知识

目录 1、存储器分类 1.1、按存储介质分类 1.2、按存取方式分类 1.3、按信息的可改写性分类 1.4、按信息的可保存性分类 1.5、按功能和存取速度分类 2、存储器技术指标 2.1、存储容量 2.2、存取速度 3、存储系统层次结构 4、主存的基本结构 5、主存中数据的存放 5.…

prometheus|云原生|轻型日志收集系统loki+promtail的部署说明

一&#xff0c; 日志聚合的概念说明 日志------ 每一个程序&#xff0c;服务都应该有保留日志&#xff0c;日志的作用第一是记录程序运行的情况&#xff0c;在出错的时候能够记录错误情况&#xff0c;简单来说就是审计工作&#xff0c;例如nginx服务的日志&#xff0c;kuber…

C++-模板

目录 一.泛型编程 二.模板的分类 三.函数模板 1.函数模板的概念 2.函数模板格式 3.函数模板的原理 4.函数模板的实例化 a.隐式实例化 b.显式实例化 5.模板参数的匹配原则 四.类模板 1.类模板的定义格式 2.类模板的实例化 五.class和typename的区别 六.非类型模板…

docker配置redis插件

docker配置redis插件 运行容器redis_6390 docker run -it \ --name redis_6390 \ --privileged \ -p 6390:6379 \ --network wn_docker_net \ --ip 172.18.12.19 \ --sysctl net.core.somaxconn1024 \ -e TIME_ZONE"Asia/Shanghai" -e TZ"Asia/Shanghai"…

Nacos源码解读04——服务发现

Nacos服务发现的方式 1.客户端获取 1.1:先是故障转移机制判断是否去本地文件中读取信息&#xff0c;读到则返回 1.2:再去本地服务列表读取信息(本地缓存)&#xff0c;没读到则创建一个空的服务&#xff0c;然后立刻去nacos中读取更新 1.3:读到了就返回&#xff0c;同时开启定时…

Linux下activemq的安装与安装成功确认

一、下载 apache-activemq-5.14.0-bin.tar.gz 二、安装 将压缩包拷入linux内&#xff0c;进行解压tar -zxvf apache-activemq-5.14.0-bin.tar.gz&#xff0c;与redis、nginx不同的是&#xff0c;active解压不需要安装就可以直接启动&#xff01; 启动命令&#xff1a;./bin…

1949-2021年全国31省公路里程数据

1949-2021年全国31省公路里程数据 1、指标&#xff1a;公路里程 2、范围&#xff1a;包括31省 1978-2021年期间无缺失 3、来源&#xff1a;各省NJ、产业NJ、各省统计GB 4、指标解释&#xff1a;公路里程指报告期末公路的实际长度。 统计范围&#xff1a;包括城间、城乡间、乡…

Rocketmq架构

NameServer&#xff1a;作为注册中心&#xff0c;提供路由注册、路由踢出、路由发现功能&#xff0c;舍弃强一致&#xff0c;保证高可用&#xff0c;集群中各个节点不会实时通讯&#xff0c;其中一个节点下线之后&#xff0c;会提供另外一个节点保证路由功能。 Rocket mq name…