锆石FPGA---verlog语法篇

本文介绍了Verilog HDL的基础语法、数据类型选择、latch产生、时序与组合逻辑的区别,以及状态机设计实例。通过模块化和不同描述方式展示了如何在实际项目中应用Verilog。涵盖了关键概念如reg、wire、latch、阻塞与非阻塞赋值,以及Mealy和Moore状态机的实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Verilog HDL

概述

Verilog vs VHDL

Verilog :快速入门
VHDL:入门时间长

数字逻辑

0 1 x z

数据类型

寄存器 线网 参数

  1. reg
  • 使用:always,initial
  • 综合: 时序-寄存器 组合-硬件连线 混合-锁存器
  1. wire
  • 默认为 z
  1. parameter

运算符

±*/%

> < =

! && ||

== !=

a ? b: c
& | ^ ~^ ^~

<< >>

{ 拼接} {2’d2{b}}

基础语法

可综合语句:可以生成电路
不可综合语句:用来仿真

可综合关键字:
module end module
input output inout
wire reg parameter
always assign
if else begin end case end case default
posedge negedge or 上升 下降

基本框架

例实现与门

module yumen(a,b,c)
  input a;
  input b;
  output c;
  
  assign c=a&b;
 endmodule

描述方式

分类:系统级、算法级、RTL级、门级、开关级

  1. 结构化描述
module example
(A,B,C,L);

input A;
input B;
input C;
output L;

wire AB,BC,AC;
and U1(AB,A,B);
and U2(BC,B,C);
and U3(AC,A,C);

or U4(L,AB,BC,AC);

endmodule
  1. 数据流描述
assign L=((!A)&B&C)|((!B)&A&C)|((!C)&B&A);
endmodule
  1. 行为描述
always@(A,C,B)
begin 
	case({A,B,C})
		3'b000: L=1'b0;
		3'b001: L=1'b0;
		3'b010: L=1'b0;
		3'b011: L=1'b1;
		
		
		3'b100: L=1'b0;
		3'b101: L=1'b1;
		3'b110: L=1'b1;
		3'b111: L=1'b1;
		default:L=1'bx;
	endcase
end
  1. 模块化设计
module Example_Module
(
	input a,
	input b,
	output c,
	output s
	
);

Example_yumen yumen_module
(
	.yumen_a(a),
	.yumen_b(b),
	.yumen_c(c)
);
Example_yihuo yihuo_module
(
	.yihuo_a(a),
	.yihuo_b(b),
	.yihuo_c(s)
);
endmodule

问题

  1. 数据类型选择
  • reg
  • wire
  1. latch的产生(保持不变)
  • 产生情况:if else缺省
  • 时序和组合区别
  1. 组合逻辑反馈环,导致不稳定,时序实现反馈
  • 表达式左右具有相同元素
  1. 阻塞赋值=、非阻塞<=
  • 阻塞:顺序执行 非阻塞:并行执行
  • 阻塞:同时改变 非阻塞:有时间延迟

状态机

  • 可以实现顺序时间,第一步、第二部、、、
  1. 分类
  • Mealy
  • Moore
  1. 组成
  • 时序逻辑:记忆当前状态
  • 组合逻辑:次态逻辑(确定下一个状态),输出逻辑(确定状态机输出)
  1. 设计步骤
  • 确定状态机类型
  • 列出状态机所有状态,编码
  • 列举状态图、状态表
  • 描述状态
  1. 状态编码
  • 二进制码:编码效率高,译码
  • 格雷码:高可靠性
  • one-hot:位数资源多,每一位表示一种状态
  1. 描述方式
  • 一段:可读性差
  • (二段):有毛刺
  • (三段)

案例:自动售货机

module  Example_State
(
	X,Z,CLK_50M,RST_N
);

input X;
input RST_N;
input CLK_50M;

output Z; 
//X表示是否投入一元  
//Z是否售出饮料

reg Z;
reg Z_N;

parameter S0=2'b00;
parameter S1=2'b01;
parameter S2=2'b10;

reg[1:0] FSM_CS; //current
reg[1:0] FSM_NS;//Next state

//时序逻辑
always @(posedge CLK_50M or negedge RST_N)
begin
	if(!RST_N)//low
		FSM_CS<=S0;
	else
		FSM_CS<=FSM_NS;
end
//组合逻辑(次态逻辑)
always @(*)
begin
	case(FSM_CS)
	S0:
	begin 
		if(X==1'b1)
			FSM_NS=S1;
		else
			FSM_NS=S0;
	end
	
	S1:
	begin 
		if(X==1'b1)
			FSM_NS=S2;
		else
			FSM_NS=S1;
	end
	
	S2:
	begin 
		if(X==1'b1)
			FSM_NS=S0;
		else
			FSM_NS=S2;
	end
	endcase
end

//组合逻辑(输出逻辑)

always @(posedge CLK_50M or negedge RST_N)
begin
	if(!RST_N)//low
		Z<=1'b0;
	else
		Z<=Z_N;
end

always@ (*)
begin
	if((FSM_CS==S2)&&(X==1'b1))
		Z_N=1'b1;
	else
		Z_N=1'b0;
end

endmodule		

波形图

### OmegaConf 配置管理简介 OmegaConf 是一个强大的 Python 库,用于处理复杂的配置文件。它支持多种数据结构(如字典、列表)以及 YAML 文件的解析和操作。以下是有关如何使用 OmegaConf 的详细介绍。 #### 创建配置对象 可以通过 `OmegaConf.create` 方法创建一个新的配置对象。该方法可以接受字典、YAML 字符串或其他兼容的数据结构作为输入[^1]。 ```python import omegaconf from omegaconf import OmegaConf config_dict = {"database": {"host": "localhost", "port": 6379}} config = OmegaConf.create(config_dict) print(OmegaConf.to_yaml(config)) # 将配置转换为 YAML 格式的字符串 ``` #### 加载外部 YAML 文件 如果需要加载外部 YAML 文件,可使用 `OmegaConf.load` 方法。这使得程序能够轻松读取并应用存储在磁盘上的配置文件。 ```python yaml_file_path = "./example_config.yaml" file_conf = OmegaConf.load(yaml_file_path) # 打印加载后的配置内容 print(file_conf.database.host) # 输出 'localhost' ``` #### 合并多个配置源 当存在多个配置来源时(例如默认设置与命令行参数),可以使用 `OmegaConf.merge` 来无缝合并它们。此功能允许开发者优先级较高的配置覆盖较低级别的配置项。 ```python default_configs = OmegaConf.create({"model": {"type": "resnet50"}}) cli_args = OmegaConf.from_dotlist(["model.type=vgg16"]) merged_config = OmegaConf.merge(default_configs, cli_args) assert merged_config.model.type == "vgg16" # 命令行参数成功覆盖默认 ``` #### 动态更新配置 除了静态定义外,还可以通过访问器动态修改现有配置中的字段。这种灵活性非常适合运行时调整某些超参数或环境变量。 ```python dynamic_update = file_conf.copy() dynamic_update.database.port = 8080 print(dynamic_update.database.port) # 输出新的端口号 8080 ``` #### 错误处理机制 为了防止非法赋破坏整个系统的稳定性,OmegaConf 提供了严格的模式控制选项。启用严格模式后,任何未声明过的键都将引发异常提示用户修正错误。 ```python strict_mode_enabled = file_conf.copy() strict_mode_enabled.set_struct(True) # 开启只读保护状态 try: strict_mode_enabled.new_field = True # 此处会抛出 AttributeError 异常 except AttributeError as e: print(f"Catch expected error: {e}") ``` --- ### 总结 以上展示了 OmegaConf 在不同场景下的典型用法,包括但不限于初始化配置实例、加载外部资源、融合多层设定逻辑以及实施安全防护措施等方面的功能特性。希望这些例子能帮助快速掌握其核心概念和技术要点!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值