verilog 介绍(附状态机实例)

news2024/11/23 7:14:58

author: hjjdebug
date: 2024年 10月 12日 星期六 15:02:56 CST
description: verilog 介绍(附状态机实例)

初学者可以把菜鸟教程中的verilog 当参考手册.
但那里介绍的太多了,精简入门(或者入门后的概括)看看本博就够了.

1. 什么是HDL ?

HDL, hardware description language, 硬件描述语言
其分为两部分:
a. 逻辑功能设计.
用HDL 语言在不同层次描述对数字电路的功能、结构和行为进行描述.

b. 电路实现
通过综合工具将逻辑设计转化为门级电路网表,再将其与某种工艺的
基本元件逐一对应起来,再通过布局,布线工艺转换为电路的布局,布线

美国,中国,日本多使用verilog, 欧洲多使用vhdl

2. verilog 是什么?

verilog 是一种类C 语言, 它的词法和语法借鉴了C, 减小了它的入门门槛.
但verilog 是硬件描述语言,数字电路是它的基础,运算是并行的,这是与C不同之处.


1. 基础知识:(词法)


1.1: 逻辑值, 0,1,X,Z(低,高,不定,高阻)

1.2: 数据的表示方式:
表示方式是<位宽’类型数值>
常见类型: b,d,h (二进制,十进制,16进制)
例如:
4’b0101
4’d9
4’hb
16’b0101_1010_0101_1010 = 16’h5a5a

1.3: 标识符
标识符用来表示模块名,端口名,信号名

1.4: 数据类型(3种), 寄存器类型,线网类型,参数类型(非线路类型)

1.4.1: reg 关键字说明寄存器类型.
该类型代表一个抽象的数据存储单元.
通过赋值语句可以改变寄存器中储存的值.
它可以在 always 语句和 initial 语句中被赋值.
如果该过程语句描述的是时序逻辑,即 always 语句带有时钟信号,则该寄存器变量对应为寄存器;
如果该过程语句描述的是组合逻辑,即 always 语句不带有时钟信号,则该寄存器变量对应为硬件连线;
寄存器类型的缺省值是 x(未知状态)
reg [31:0] delay_cnt; //位宽32位的寄存器

1.4.2: wire 关键字说明线网类型
它代表元件间的物理连线。它的值由驱动元件的值决定
如果没有驱动元件连接到线网,线网的缺省值为 z(高阻态)
wire[7:0] data; // 8bits 数据

1.4.3: 由parameter 关键字说明的变量是参数类型
参数类型实际上是定义一个常数.
例:
parameter DATA_WITH = 8; //跟c语言中的宏类似
外部调用模块时,还可以传递参数.

类型后边跟一个标识符,说明这个变量时什么类型.

1.5: 注释
与c 一样, //注释单行, /* */注释多行

1.6: 运算符
与c 一致.
算术运算符: ±*/%
关系运算符: >,=,<,>=,<=,==,!=
逻辑运算符: &&,||,!
条件运算符: ?:
位运算符: ~,^,&,|
移位运算符: <<,>>

新增一条强势组合操作符,拼接运算符
例如: c={a,b} 把a,b 拼成c信号

1.7: 关键字.
关键字用来表示特定的意义,指导编译程序完成特定功能. 掌握常用关键字即可.


2. 常用关键字介绍


if - else 语句
if - else if -else 语句
for 语句
while 语句
以上与c 一致

case 语句
c 中是switch … case 形如: switch(var) case val1: do1;break…;default: do_defaut;
v 中是case … endcase 形如: case(var) val1: do1; val2:do2; default: do_default; endcase;

与c不同的地方
c 用{} 表示语句块, v用begin, end 表示语句块
c 用 = 直接给变量赋值,v 叠加了assign 或者 always 关键字给变量赋值
assign 用于简单的组合逻辑赋值语句
always 即可用于组合逻辑,此时功能与assign 一样, 也可用于时序逻辑.
always 语句常常带有敏感信号列表,带begin,end 语句块,看起来像一个c中的无名函数
= 是阻塞赋值, 用在组合电路中
<=是非阻塞赋值, 用在时序带路中
always 语句块, 其内部可以认为是顺序执行的,而always 块与块之间是并行执行的.

注: 硬件语句一定要注意语法的完整性,有if一定要跟else, 有case 一定要有default,不能有不周全的地方.
否则可能会有glitch 毛刺的产生.


3. 模块化设计


一个模块对应一种功能,上层模块调用下层模块.
每调用一次模块,需要先对模块实例化.

模块相当于c++中的类, 模块的参数相当于带参对象的构造函数


4.实战: 4位密码锁设计

当然,改成8位也是很简单的.


状态机的编写
典型的状态机例子就是一个密码锁. 它有10个按键输入
假如实现4位密码锁,其密码是1217,输入正确开锁,不正确不开锁.

c语言的状态机只需要一个switch-case 块.

v语言常用三段式状态机. 因为它有组合逻辑部分和时序逻辑部分,需要区别对待.
基本格式是:
第一个 always 语句实现同步状态跳转;(时序电路), 在时钟上升沿把下一状态付给当前状态
第二个 always 语句采用组合逻辑判断状态转移条件;//类似于c语言的switch-case块, 找到下一个状态
第三个 always 语句描述状态输出(可以用组合电路输出,也可以时序电路输出)。对应moore 和 mealy状态机

代码:

module Cipher(
	input sys_clk,
	input reset,
	input key0,
	input key1,
	input key2,
	input key3,
	input key4,
	input key5,
	input key6,
	input key7,
	input key8,
	input key9,
	output reg result
);

//parameter define
parameter S0 = 3'b000 ;
parameter S1 = 3'b001 ;
parameter S2 = 3'b010 ;
parameter S3 = 3'b011 ;
parameter S4 = 3'b100 ;

//reg define, 当前状态和下一状态,3bits
reg [2:0] curr_st;
reg [2:0] next_st;

//main code

//状态机的第一段采用同步时序描述状态转移
always @(posedge sys_clk or negedge reset) 
begin
	if (!reset)
		curr_st <= S0;
	else
		curr_st <= next_st;
end

//状态机的第二段根据当前状态及输入采用组合逻辑判断状态转移条件
//按键低有效
always @(
	negedge key1,
	negedge key2,
	negedge key3,
	negedge key4,
	negedge key5,
	negedge key6,
	negedge key7,
	negedge key8,
	negedge key9
) 
begin
	case (curr_st)
		S0: 
		begin
			if(key1 == 1'b0) next_st = S1;
			else next_st = S0;
		end
		S1: 
		begin
			if(key2 == 1'b0) next_st = S2;
			else next_st = S0;
		end
		S2: 
		begin
			if(key1 == 1'b0) next_st = S3;
			else next_st = S0;
		end
		S3: 
		begin
			if(key7 == 1'b0) next_st = S4;
			else next_st = S0;
		end
		default: 
			next_st = S0;
	endcase
end

//状态机的第三段描述状态输出(这里采用时序电路输出)
always @(posedge sys_clk or negedge reset) 
begin
	if (!reset)
		result <= 1'b0;
	else if (curr_st == S4)
		result <= 1'b1;
	else
		result <= 1'b0;
end

endmodule

测试代码:(test_bench)

//时间精度/显示精度
`timescale 1ns/1ns
module tb_basic();

//regeister and wire
reg sys_clk;
reg reset;
reg key0;
reg key1;
reg key2;
reg key3;
reg key4;
reg key5;
reg key6;
reg key7;
reg key8;
reg key9;
wire result;


//initial, 输入信号激励及仿真命令
initial
begin
	$dumpfile("basic.vcd");
	$dumpvars(0,u_Cipher);
	sys_clk = 1'b1;
	reset = 1'b0;
	key0=1'b1;
	key1=1'b1;
	key2=1'b1;
	key3=1'b1;
	key4=1'b1;
	key5=1'b1;
	key6=1'b1;
	key7=1'b1;
	key8=1'b1;
	key9=1'b1;
	#100;
	reset = 1'b1;
	key1=1'b0;  // 1 press
	#100;
	key1=1'b1;
	key2=1'b0; // 2 press
	#100;
	key2=1'b1;
	key1=1'b0; // 1 press
	#100;
	key1=1'b1; 
	key7=1'b0; // 7 press
	#100;
	//	$stop;
	$finish;
end

//时钟激励, 25M 时钟
always #20 sys_clk=~sys_clk;

Cipher u_Cipher(
	.sys_clk(sys_clk),
	.reset(reset),
	.key0(key0),
	.key1(key1),
	.key2(key2),
	.key3(key3),
	.key4(key4),
	.key5(key5),
	.key6(key6),
	.key7(key7),
	.key8(key8),
	.key9(key9),
	.result(result)
);
endmodule

仿真结果:
在这里插入图片描述
测试输入密码1217, 给出了结果result=1. 测试通过.

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

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

相关文章

FPM工具制作RPM包

文章目录 一、fpm工具介绍1、什么是fpm?2、fpm技术分析3、fpm应用场景4、fpm与rpmbuild的区别 二、fpm安装及构建操作1、安装fpm工具1.1、安装ruby环境1.2、Ruby Gems源更换为国内的源1.3、删除官方源1.4、查看当前源列表1.5、安装fpm版本1.5.1、报错解决 2、fpm常用参数 三、…

Kaggle竞赛——森林覆盖类型分类

目录 1. 竞赛简要2. 数据分析2.1 特征类型统计2.2 四个荒野区域数据分析2.3 连续特征分析2.4 离散特征分析2.5 特征相关性热图2.6 特征间的散点关系图 3. 特征工程3.1 特征组合3.2 连续特征标准化 4. 模型搭建4.1 模型定义4.2 绘制混淆矩阵和ROC曲线4.3 模型对比与选择 5. 测试…

详解安卓和IOS的唤起APP的机制,包括第三方平台的唤起方法比如微信

网页唤起APP是一种常见的跨平台交互方式&#xff0c;它允许用户从网页直接跳转到移动应用程序。 这种技术广泛应用于各种场景&#xff0c;比如让用户在浏览器中点击链接后直接打开某个应用&#xff0c;或者从网页引导用户下载安装应用。实现这一功能主要依赖于URL Scheme、Univ…

线性代数 行列式

一、行列式 1、定义 一个数学概念&#xff0c;主要用于 线性代数中&#xff0c;它是一个可以从方阵&#xff08;即行数和列数相等的矩阵&#xff09;形成的一个标量&#xff08;即一个单一的数值&#xff09; 2、二阶行列式 &#xff0c;像这样将一个式子收缩称为一个 2*2 的…

校车购票微信小程序的设计与实现(lw+演示+源码+运行)

摘 要 由于APP软件在开发以及运营上面所需成本较高&#xff0c;而用户手机需要安装各种APP软件&#xff0c;因此占用用户过多的手机存储空间&#xff0c;导致用户手机运行缓慢&#xff0c;体验度比较差&#xff0c;进而导致用户会卸载非必要的APP&#xff0c;倒逼管理者必须改…

基于深度学习的细粒度图像分析综述【翻译】

&#x1f947; 版权: 本文由【墨理学AI】原创首发、各位读者大大、敬请查阅、感谢三连 &#x1f389; 声明: 作为全网 AI 领域 干货最多的博主之一&#xff0c;❤️ 不负光阴不负卿 ❤️ 文章目录 基础信息0 摘要1 INTRODUCTION2 识别与检索 RECOGNITION VS. RETRIEVAL3 问题和…

腾讯云视立方TRTCCalling Web 相关

基础问题 什么是 TRTCCalling&#xff1f; TRTCCalling 是在 TRTC 和 TIM 的基础上诞生的一款快速集成的音视频的解决方案。支持1v1和多人视频/语音通话。 TRTCCalling 是否支持接受 roomID 为字符串? roomID 可以 string&#xff0c;但只限于数字字符串。 环境问题 Web …

QD1-P24 CSS 组合选择器

本节学习&#xff1a;CSS 组合选择器 本节视频 https://www.bilibili.com/video/BV1n64y1U7oj?p24 组合选择器是使用多个基础选择器组合在一起来选择更具体的目标元素的方法。以下是几种常见的组合选择器&#xff1a; 下面四个选择器是本节学习内容 后代选择器&#xff08;De…

在线Ipv4转Ipv6工具

具体请前往&#xff1a;Ipv4到Ipv6在线转换工具--可将Ipv4换算为Ipv6地址和Ipv6的缩写格式

.NET 通过C#设置Excel工作表的页面设置

Excel文件数据准备就绪并需要以报告形式呈现时&#xff0c;调整Excel文件的页面设置变得尤为重要&#xff0c;不仅关乎文档的专业外观&#xff0c;还直接影响到打印或电子分享时的可读性和实用性。通过C#来自动化这一过程&#xff0c;不仅可以节省大量手动配置的时间&#xff0…

yum仓库安装rabbitmq

yum仓库安装rabbitmq 1、配置yum仓库 vim /etc/yum.repos.d/rabbitmq.repo # In /etc/yum.repos.d/rabbitmq.repo## ## Zero dependency Erlang ##[rabbitmq_erlang] namerabbitmq_erlang baseurlhttps://packagecloud.io/rabbitmq/erlang/el/7/$basearch repo_gpgcheck1 gpg…

C++调试方法(Vscode)(一) ——本地调试

初学者在调试一段代码的时候&#xff0c;经常出于不明原因&#xff0c;写出bug&#xff0c;导致程序崩溃。但是定位崩溃的地方时&#xff0c;往往采用简单而朴素的方法&#xff1a;即采用cout或者printf进行输出。这种方式既原始&#xff0c;又低效。一个合格的工程师应该是通过…

龙信科技:引领电子物证技术,助力司法公正

文章关键词&#xff1a;电子数据取证、电子物证、手机取证、计算机取证、云取证、介质取证 在信息技术飞速发展的今天&#xff0c;电子物证在司法领域扮演着越来越重要的角色。苏州龙信信息科技有限公司&#xff08;以下简称“龙信科技”&#xff09;作为电子数据取证领域的先…

电脑健康检查用什么软件好 电脑健康状况检查工具在哪里

随着信息技术的日益发展&#xff0c;电脑已成为人们生活和工作不可或缺的重要工具。但是长时间使用电脑也会给电脑自身带来一些隐患&#xff0c;影响电脑的运行效率和使用寿命。因此&#xff0c;定期对电脑进行健康检查尤为重要&#xff0c;这样才能发现和解决潜在的问题。关于…

创建XGBoost模型(回归任务)MATLAB

代码如下&#xff1a; % 导入数据 data readtable(data.xlsx);% 假设最后一列是目标值&#xff0c;前面列为特征 X data{:, 1:end-1}; % 特征 y data{:, end}; % 目标值% 划分训练集和测试集 cv cvpartition(height(data), HoldOut, 0.2); XTrain X(training(cv)…

kali系统网络配置

一、查看网络接口名称 ifconfig #网络接口配置网络接口名称为eth0&#xff0c;下面的lo为环回地址的网络接口。 二、配置网络接口文件 sudo vim /etc/network/interfaces在文件interfaces中加入以下信息&#xff08;本文采用静态IP地址&#xff09;&#xff0c;为表示与ifa…

5G RedCap:轻量级的5G,工业物联网的理想技术

随着工业物联网&#xff08;IIoT&#xff09;在制造、能源、物流等领域的深入应用&#xff0c;对无线通信技术的需求越来越多样化。5G技术为工业物联网带来了超高速、低延迟和海量连接的能力&#xff0c;但对于某些工业应用场景&#xff0c;完整的5G功能可能显得过于复杂或昂贵…

【CSS in Depth 2 精译_048】7.2 CSS 响应式设计中的媒体查询原则(中):页面断点(breakpoint)样式的添加

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 【第七章 响应式设计】&#xff08;概述&#xff09; 7.1 移动端优先设计原则&#xff08;上篇&#xff09; 7.1.1 创建移动端菜单&#xff08;下篇&#xff09;7.1.2 给视口添加 meta 标签&#xf…

嵌入式AI-STM32部署卷积神经网络的哈利波特魔法棒方案项目

项目标题-电子法棒-卷积神经网络轨迹识别方案 基于STM32部署卷积神经网络控制设备方案-AI项目-STM32部署卷积神经网络方案-红外信号复制方案-轨迹识别 先了解一下背景&#xff0c;STM32是一款微控制器&#xff0c;做AI一般都是拥有算力的微处理器&#xff0c;量产非常昂贵&am…

RTKLIB学习记录【postpos、execses_b、execses_r】

本文主要记录对RTKLIB源码中postpos、execses_b、execses_r 函数的源码解读&#xff0c;不涉及其中的天线、星历等文件读取的内容&#xff0c;且为个人理解&#xff0c;如果有误&#xff0c;欢迎交流讨论。 一、postpos 函数部分 /rxn2rtkp函数 → postpos函数传递参数&#x…