当前位置: 首页 > article >正文

Verilog基础(一):基础元素

verilog基础

我先说,看了肯定会忘,但是重要的是这个过程,我们知道了概念,知道了以后在哪里查询。语法都是术,通用的概念是术。所以如果你有相关的软件编程经验,那么其实开启这个学习之旅,你会感受到熟悉,也会感受到别致。


入门

- 如何开始

欢迎来到二进制的世界,数字逻辑的入门一开始可能有难度,因为你需要学习新的概念,新的硬件描述语言(HDL – Hardware Description Language)例如 verilog,几个新的仿真软件和一块FPGA的板子.但是这能帮你更加深刻的理解计算机的运作原理.

设计电路需要如下几个步骤:

  1. 编写HDL(verilog)代码
  2. 编译代码生成电路
  3. 模拟电路并修复错误

下面,我们来个简单的例子,请把one的输出设为1:

  • Module Declaration
module top_module(output one);
  • Solution
module top_module( output one );

    assign one = 1;

endmodule
- 输出0

建立一个没有输入,输出为常数0的电路.

本系列题使用verilog-2001 ANSI-style 的端口声明语法,因为它更容易阅读并减少了拼写错误.如果愿意,可以使用旧的verilog-1995语法.例如,下面的两个模块声明是可接受的和等效的:

module top_moduel(zero);
	output zero;
	//verilog-1995
endmodule

module top_module(output zero);
//verilog-2001
endmodule
  • Module Declaration
module top_module(
    output zero
);
  • Solution
module top_module(
    output zero
);// Module body starts after semicolon
	assign zero=0;
endmodule

Verilog 语言

基础元素

- wire类型

创建一个具有一个输入和一个输出的模块,其行为想一条"线"(Wire)。

与物理线不同但十分相似,Verilog中的线(和其他信号)是定向的。

这意味着信息只在一个方向上流动,从(通常是一个)源流向汇点(该源通常也被称为驱动程序将值驱动到wire上)。

在verilog"连续赋值"(assign left_side=right_side;)中,右侧的信号值被驱动到左侧的"线"上

请注意:赋值是"连续的"(Continuous Assignments),因为如果右侧的值发生更改,分配也会一直持续,因此左侧的值将随之改变。(这里与其他语言有很大区别)。 连续分配不是一次性事件,其产生的变化是永久的。

想要真正理解为啥会这样,你首先要明白,你并不是在编写程序,你其实是在用代码"画"电路!
因此输入端的电平高低的变化必然会影响到wire的另一端,你可以想像真的有一根电线连接两个变量。

模块(module)上的端口(port)也有一个方向(通常是输入 – input或输出 – output)。

输入端口由来自模块外部的东西驱动,而输出端口驱动外部的东西。从模块内部查看时,输入端口是驱动程序或源,而输出端口是接收器。

下图说明了电路的每个部分如何对应Verilog代码的每个部分。

  • 模块和端口声明创建电路的黑色部分。
  • 您的任务是通过添加一个assign语句来创建一条线(绿色)。
  • 盒子外的部件不是您的问题,但您应该知道,通过将测试激励连接到top_module上的端口来测试电路。

除了连续赋值之外,Verilog还有另外三种用于程序块(Procedural block)的赋值类型,其中两种是可综合的。在开始使用Procedural block之前,我们不会使用它们.

  • Module Declaraction
module top_module( input in, output out );
  • Solution
module top_module( input in, output out );
    assign out = in;
endmodule

这里的 Module Declaraction 和 Solution就像是对应C里面的声明和定义实现

- Four wires

创建一个具有3个输入和4个输出的模块,这些输入和输出的行为如下:

A ->W
B -> X
B -> Y
C -> Z

下图说明了电路的每个部分如何对应Verilog代码的每个部分.模块外部有三个输入端口和四个输出端口.

当您有多个assign语句时,它们在代码中的出现顺序并不重要.与编程语言不同,assign语句(“连续赋值”)描述事物之间的连接,而不是将值从一个事物复制到另一个事物的操作.

可能现在应该澄清的一个潜在的困惑来源是:这里的绿色箭头表示电线之间的连接,但不是wire本身.

模块本身已经声明了7条线(名为A、B、C、W、X、Y和Z).这是因为input与output被声明为了wire类型.因此,assign语句不会创建wire,而是描述了在已存在的7条线之间创建的连接.

  • Module Declaraction
module top_module(
	input a,b,c;
	output w,x,y,z
);
  • Solution
module top_module( 
    input a,b,c,
    output w,x,y,z );
    assign w=a;
	assign x=b;
	assign y=b;
	assign z=c;
endmodule
- 反转器 (Inveter)

创建实现非门的模块.

这个电路和电线相似,但有点不同.当把电线从进线连接到出线时,我们要实现一个反相器(非门),而不是一根


http://www.kler.cn/a/532971.html

相关文章:

  • 录音质检,只质检录音,没有显卡的服务器配置分析
  • Java/Kotlin HashMap 等集合引发 ConcurrentModificationException
  • 刷题记录 动态规划-7: 63. 不同路径 II
  • 【R语言】R语言安装包的相关操作
  • 【1】快手面试题整理
  • Pandoc, Zotero, JabRef 管理论文引用,生成参考文献 | 撰写论文 paper
  • 用C语言实现一个Shell:Tutorial - Write a Shell in C
  • C语言:深入了解指针2(超详细)
  • LLMs瞬间获得视觉与听觉感知,无需专门训练:Meta的创新——在图像、音频和视频任务上实现最优性能。
  • 基于 Java 开发的 MongoDB 企业级应用全解析
  • ZOMI - AISystem AI Infra 分享
  • 【Rust自学】20.1. 最后的项目:单线程Web服务器
  • 基于python热门歌曲采集分析系统
  • 【力扣】53.最大子数组和
  • open-webui启动报错:OSError: [WinError 1314] 客户端没有所需的特权。
  • AI Block Blast Solver:提升游戏体验的智能助手
  • Innodb为何能干掉MyISAM
  • 编程AI深度实战:大模型哪个好? Mistral vs Qwen vs Deepseek vs Llama
  • Leetcode - 周赛434
  • 《深度洞察ICA:人工智能信号处理降维的独特利器》
  • DeepSeek-R1:通过强化学习提升大型语言模型推理能力的探索
  • 猫眼前端开发面试题及参考答案
  • Redis真的是单线程的吗?
  • Spring Bean 的生命周期介绍
  • SQL注入漏洞之绕过[前端 服务端 waf]限制 以及 防御手法 一篇文章给你搞定
  • 从Transformer到世界模型:AGI核心架构演进