锆石FPGA---verlog语法篇

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		

波形图

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值