verilog-HDL

目录

 

用户自定义元件

 层次化设计方法

模块例化方法

生成语句


用户自定义元件

 Verilog HDL定义的基元都具有固定的功能。为了应用方便,Verilog还支持用户自定义原语(User-Defined Primitive,简称UDP),即允许设计者根据需要自己规划所需要的功能电路。

   UDP是以真值表/状态表为基础,通过将真值表/状态表描述的逻辑关系映射到存储器中来实现功能电路。  

具体的语法格式为:
primitive <UDP名>(输出信号,输入信号,...);<输出/输入信号声明>initial <输出信号=初值>;table<真值表/状态表>;...endtable
endprimitive

  应用UDP既可以描述组合逻辑电路,也可以描述时序逻辑电路。用UDP描述组合逻辑电路时,真值表必须按输入/输出的顺序排列。

用UDP描述2选一数据选择器。primitive mux2to1_pr(D0,D1,A0,y);output y;input D0,D1;input A0;table// D1,D0,A0 : y?  0   0 : 0;?  1   0 : 1;0  ?   1 : 0;1  ?   1 : 1;?  ?   x : x;endtableendprimitive

 层次化设计方法

   设计者从现有的元件库中选择适合的元器件来设计功能模块,然后由功能模块组成子系统,再由子系统构成更高一级的子系统,逐级向上直到实现整个系统。  从系统顶层开始,把系统分解为功能模块,然后把 每个功能模块再分解为下一层次的模块,用一系列分层次的模块来表示复杂的数字系统,逐层描述设计思想并进行仿真验证,直到可以用元件库中的元器件实现为止。

   在复杂数字系统设计过程中,通常是将以上两种设计方法相结合,兼有以上两种方法的优点。在高层系统中用自顶而下的设计方法实现,而使用自底而上的方法从库元件或以往设计库中调用已有的单元电路来设计功能模块。

  在EDA设计中,对于系统的顶层设计模块,通常采用结构化描述方式,即在顶层电路分别例化各功能模块,描述模块之间的连接关系。而对于低层模块,可以采用数据流描述或者行为描述方式, 有利于定义和重构模块的功能。

模块例化方法

名称关联方式的语法格式为:  .子模块端口 1(实例端口名), …, .子模块端口 n(实例端口名)

  位置关联(in-order)方式不需要写出子模块定义时的端口名称,只需要把实例模块的端口名按子模块定义时的端口顺序排放就能自动映射到子模块的对应端口。

 `include "full_adder.v"              // 文件包含指令module adder4bits (A,B,S,CO);input   [3:0] A,B;output [3:0] S;output CO;wire C1,C2,C3;full_adder FA1(.a(A[0]),.b(B[0]),.ci(0), .sum(S[0]),.co(C1));full_adder FA2(.a(A[1]),.b(B[1]),.ci(C1),.sum(S[1]),.co(C2));full_adder FA3(.a(A[2]),.b(B[2]),.ci(C2),.sum(S[2]),.co(C3));full_adder FA4(.a(A[3]),.b(B[3]),.Cci(C3),.sum(S[3]),.co(CO));endmodule

文件包含指令的语法格式为 `include “<被包含的模块文件名>”

  使用文件包含指令应注意以下三点:   (1) 一条“`include”只能包含一个文件。有多个文件包含时,可以用多条“`include”描述;   (2) 被包含模块需要写出完整的文件名信息,包括文件类型名;   (3) 如果被包含的文件不在当前工程目录中时,需要指明文件的完整路径,如“c:/intelFPGA/18.1/full_adder.v”。

   需要说明的是,当被包含的文件处于当前工程目录中时,文件包含指令的描述实际上是多余的,可以删掉,因为Quartus Prime编译时会自动根据例化语句的表述,在当前工程目录中找到被例化的模块文件。但是,在例2-24代码中添加文件包含语句的好处是,能够使模块之间的相关关系更为清晰。

生成语句

  在数字系统设计中,有时需要编写结构相同但参数不同的语句或者模块。当语句或者模块很多时,采用逐行列写的方法既不简洁,而且效率很低。   generate语句配合循环语句、条件语句和分支语句可编写参数化的例化语句、赋值语句或者复制模块等操作,用于生成模块、线网/变量、参数定义语句、连续赋值语句、行为语句、DUP以及任务和函数等语法结构。 generate语句有 generate for、generate if 和 generate case 三种应用形式。

  generate for语句用于复制语句或者模块,每次循环生成一个实例。在应用generate for语句时,需要配套使用Verilog-2001标准中新增关键词genvar定义的索引(index)变量。

 应用generate for语句的语法格式为genvar 索引变量;generate for (索引变量=初值; 索引变量≤终值;索引变量=索引变量±常数)begin: 块名  // 关键词begin和end,以及块名都不能省略语句;...;endendgenerate

  generate if语句将模块的参数作为条件表达式,用来产生满足条件的语法结构。

module bin2gray #(parameter N=8)(input [N-1:0] bin_code,output wire [N-1:0] gray_code);// 根据转换公式描述assign gray_code[N-1] = bin_code[N-1];genvar i;generate for (i=N-2;i>=0; i=i-1 )begin: BIN2GRAYassign gray_code[i] = bin_code[i+1]^bin_code[i];endendgenerate
endmodule
module MUX2to1a (D0,D1,sel,y);input D0,D1;input sel;output y;assign y =  sel? D1:D0;
endmodule
module MUX2to1b (D0,D1,sel,y);input D0,D1;input sel;output reg y;always @(D0,D1,sel)case (sel)0: y = D0;1: y = D1;default: y = D0; endcase
endmodule

   generate_case语句与generate_if语句的功能相同,根据模块的参数作为判断条件,用来生成满足条件的语法结构。

 // 例化选择
module MUX2to1_tst (D0,D1,sel,y);input D0,D1;input sel;output y;parameter MUX_CASE=1;  // 设置为行为描述generate    // 分支生成case ( MUX_CASE )   // synopsys full_case0: MUX2to1a U_MUX2to1a (.D0(D0), .D1(D1),.sel(sel),.y(y));1: MUX2to1b U_MUX2to1b (.D0(D0), .D1(D1),.sel(sel),.y(y));endcaseendgenerate
endmodule

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

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

相关文章

机器学习(二)——线性回归模型、多分类学习(附核心思想和Python实现源码)

目录 关于1. 基本形式2. 线性回归2.1 单变量线性回归2.2 多元线性回归2.2 对数线性回归 3. 对数几率回归4. 线性判别分析5. 多分类学习5.1 拆分策略 6. 类别不平衡问题X 案例代码X.1 源码X.2 数据集&#xff08;糖尿病数据集&#xff09;X.3 模型效果 关于 本文是基于西瓜书&a…

跳表原理笔记

课程地址 跳表是一种基于随机化的有序数据结构&#xff0c;它提出是为了赋予有序单链表以 O(logn) 的快速查找和插入的能力 创建 首先在头部创建一个 sentinel 节点&#xff0c;然后在 L1 层采用“抛硬币”的方式来决定 L0 层的指针是否增长到 L1 层 例如上图中&#xff0c;L…

wpf 制作丝滑Flyout浮出侧边栏Demo (Mahapps UI框架)

Flyout 属性 CloseButtonVisibility: 设置为 Collapsed&#xff0c;意味着关闭按钮不可见。TitleVisibility: 设置为 Collapsed&#xff0c;意味着标题不可见。IsPinned: 设置为 True&#xff0c;意味着这个 Flyout 会固定住&#xff0c;不会自动关闭。Opacity: 设置为 1&…

Redis常见面试题概览——针对实习面试

目录 1. Redis基础2. Redis数据类型3. Redis多机与分布式4. Redis事务5. Redis性能和优化6. Redis应用场景7. Redis三大生产问题8. Redis客户端和连接 以下是Redis常见面试题的概览&#xff1a; 1. Redis基础 什么是Redis&#xff1f;Redis与其他key-value存储有什么不同&…

MySQL记录锁、间隙锁、临键锁(Next-Key Locks)详解

行级锁&#xff0c;每次操作锁住对应的行数据。锁定粒度最小&#xff0c;发生锁冲突的概率最低&#xff0c;并发度最高。 应用在InnoDB存储引擎中。InnoDB的数据是基于索引组织的&#xff0c;行锁是通过对索引上的索引项加锁来实现的&#xff0c;而不是对记录加的锁。 对于行…

GeoSever发布图层(保姆姬)

发布服务的具体步骤。 1. 安装 GeoServer 下载 GeoServer 安装包&#xff1a;GeoServer 官网按照安装说明进行安装&#xff0c;可以选择 Windows、Linux 或其他平台。 2. 启动 GeoServer 启动 GeoServer 通常通过访问 http://localhost:8080/geoserver 进行。默认用户名和密…

Hugging Face 两种加载模型的方式有什么区别

在 Hugging Face 上&#xff0c;这两种加载模型的方式有一些关键区别&#xff0c;并会影响后续的使用。 方式 1&#xff1a;使用 pipeline 高层次 API from transformers import pipelinepipe pipeline("text-generation", model"defog/sqlcoder-70b-alpha&q…

【LeetCode】【算法】139. 单词拆分

LeetCode 139. 单词拆分 题目 给你一个字符串s和一个字符串列表wordDict作为字典。如果可以利用字典中出现的一个或多个单词拼接出s则返回true。 注意&#xff1a;不要求字典中出现的单词全部都使用&#xff0c;并且字典中的单词可以重复使用。 示例&#xff1a; 输入: s “…

在离线环境中使用sealos工具快速部署一套高可用的k8s服务集群

文章目录 项目基础信息工具版本测试环境 下载资源文件下载sealos二进制命令文件下载k8s安装镜像和组件资源下载docker离线安装包下载Docker Registry容器镜像 NFS共享配置coredns服务的DNS解析配置安装配置sealos、k8s服务安装sealos工具导入k8s及相关组件镜像安装 K8s 集群部署…

交易所开发:构建安全、高效、可靠的数字资产交易平台

随着数字资产的不断发展&#xff0c;数字货币交易所作为连接数字资产与现实世界的重要桥梁&#xff0c;逐渐成为全球金融市场的核心组成部分。无论是比特币、以太坊等主流加密货币&#xff0c;还是各种基于区块链的资产&#xff0c;都需要通过交易所进行交换和流通。因此&#…

了解分布式数据库系统中的CAP定理

在分布式数据库系统的设计和实现中&#xff0c;CAP定理是一个至关重要的概念。CAP定理&#xff0c;全称为一致性&#xff08;Consistency&#xff09;、可用性&#xff08;Availability&#xff09;和分区容忍性&#xff08;Partition tolerance&#xff09;定理&#xff0c;由…

RabbitMQ应用问题

1. 幂等性保障 1.1 介绍 幂等性是数学和计算机科学中某些运算的性质, 它们可以被多次应⽤, ⽽不会改变初始应⽤的结果. 在应⽤程序中, 幂等性就是指对⼀个系统进⾏重复调⽤(相同参数), 不论请求多少次, 这些请求对系统的影响都是相同的效果. ⽐如数据库的 select 操作. 不同…

HTB:Sense[WriteUP]

目录 连接至HTB服务器并启动靶机 1.What is the name of the webserver running on port 80 and 443 according to nmap? 使用nmap对靶机TCP端口进行开放扫描 2.What is the name of the application that presents a login screen on port 443? 使用浏览器访问靶机80端…

【LeetCode每日一题】——802.找到最终的安全状态

文章目录 一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【题目提示】七【解题思路】八【时空频度】九【代码实现】十【提交结果】 一【题目类别】 图 二【题目难度】 中等 三【题目编号】 802.找到最终的安全状态 四【题目描述】 有一个有…

stm32使用串口的轮询模式,实现数据的收发

------内容以b站博主keysking为原型&#xff0c;整理而来&#xff0c;用作个人学习记录。 首先在STM32CubeMX中配置 前期工作省略&#xff0c;只讲重点设置。 这里我配置的是USART2的模式。 会发现&#xff0c;PA2和PA3分别是TX与RX&#xff0c;在连接串口时需要TX对RX&…

C++上机实验|继承与派生编程练习

1.实验目的 (1) 掌握派生与继承的概念与使用方法 (2) 运用继承机制对现有的类进行重用。 (3) 掌握继承中的构造函数与析构函数的调用顺序, (4) 为派生类设计合适的构造函数初始化派生类。 (5) 深入理解继承与组合的区别。 2.实验内容 设计一个人员类 person 和一个日期类 da…

【MySQL】 运维篇—故障排除与性能调优:案例分析与故障排除练习

理论知识及概念介绍 1. 故障排除的重要性 无论是电商平台、社交网络还是企业管理系统&#xff0c;数据库的稳定性和性能直接影响到用户体验和业务运作。因此&#xff0c;及时发现并解决数据库故障是确保系统高可用性和可靠性的关键。 2. 应用场景 电商平台&#xff1a;在大促…

【STL_list 模拟】——打造属于自己的高效链表容器

一、list节点 ​ list是一个双向循环带头的链表&#xff0c;所以链表节点结构如下&#xff1a; template<class T>struct ListNode{T val;ListNode* next;ListNode* prve;ListNode(int x){val x;next prve this;}};二、list迭代器 2.1、list迭代器与vector迭代器区别…

冒泡排序、选择排序、计数排序、插入排序、快速排序、堆排序、归并排序JAVA实现

常见排序算法实现 冒泡排序、选择排序、计数排序、插入排序、快速排序、堆排序、归并排序JAVA实现 文章目录 常见排序算法实现冒泡排序选择排序计数排序插入排序快速排序堆排序归并排序 冒泡排序 冒泡排序算法&#xff0c;对给定的整数数组进行升序排序。冒泡排序是一种简单…

如何高效集成每刻与金蝶云星空的报销单数据

每刻报销单集成到金蝶云星空的技术实现 在企业日常运营中&#xff0c;费用报销和付款申请是两个至关重要的环节。为了提升数据处理效率和准确性&#xff0c;我们采用了轻易云数据集成平台&#xff0c;将每刻系统中的报销单数据无缝对接到金蝶云星空的付款申请单中。本案例将详…