FPGA组合逻辑 王安然
与门电路
与门电路 设计输入: 原理图输入 Verilog HDL语言 VHDL语言 EDA工具: Lattice Diamond 与门逻辑电路
与门电路 // ------------------------------------------- // Version: |Mod. Date: |Changes Made: // V1.0 |2016/04/20 |Initial ver module And_gate ( input key_a, input key_b, output and_gate_out ); wire and_gate_out; assign and_gate_out = key_a & key_b; endmodule
Verilog HDL是对大小写敏感的语言 模块框架 module 模块名称(端口列表); //端口定义声明; input, output, inout //内部变量及参数声明 wire, reg, functioion, task, parameter, define, etc //模块功能实现 数据流描述: assign 行为级描述:initial, always 结构化描述: module例化 其他用户原语 endmodule Verilog HDL是对大小写敏感的语言 关键字都是小写的
模块框架 模块是Verilog的基本描述单元,主要用来描述某个设计的功能或结构及其与其他功能模块通信的外部端口。 模块以 “module”开始,以“endmodule”结束。 每个模块都需要模块名称来标示模块,在端口列表的括号后面一定要以 “;”结束。 除仿真模块testbench外,模块都有端口列表,端口与端口之间用 “,”隔开。 端口声明部分需要声明端口的方向和位宽。 input [4:0] a; // 信号名为a的5输入信号 inout b; // 双向信号b output [6:0] c; // 信号名为c的7输出总线信号
端口列表及声明 端口列表和端口声明可以分开写也可以写在一起:
线网数据类型 线网数据类型: wire型的线网是不具备数据存取 功能的 定义为wire型的线网是不能够在 always语句中被赋值的,只能被 连续赋值。
Verilog 逻辑值 0、低、伪、逻辑低、地、VSS、负 1、高、真、逻辑高、电源、VDD、正 X、不确定:逻辑冲突无法确定其逻辑值 1 X Z buf bufif1 0、低、伪、逻辑低、地、VSS、负 1、高、真、逻辑高、电源、VDD、正 X、不确定:逻辑冲突无法确定其逻辑值 HiZ、高阻抗、三态、无驱动源
运算符 逻 辑 运 算 符 按 位 运 算 符 操作符 表达式 描述 && A&&B A、B是否都为真? || A || B ! ! B B是否为假 操作符 表达式 描述 ~ ~B 将B中的每一位取反 & A & B 将A中的每位与B中对应的位相与 | A | B 将A中的每位与B中对应的位相或 ^ A ^ B 将A中的每位与B中对应的位异或 ~^ A ~^B 将A中的每位与B中对应的位相异或非 ^~ A^~B 按 位 运 算 符
运算符实例 已知:A = 4’b1011 B = 4’b1101 逻辑运算 !A =1'b0 A&&B =1'b1 A||B =1'b1 按位运算 ~A =4'b0100 A&B =4'b1001 A|B =4'b1111 A^B =4'b0110 A^~B=A~^B=4'b1001
常量表示 常量就是不变的数值,比如说4’d8,表示的是一个4位宽的十进 制整数8。 在Verilog中,有三种不同类型的常量:整数型、实数型以及字符 串型。 整数型常量可以直接使用十进制的数字表示。 基数表示法的格式如下: 长度’+数制简写+数字 当设定的位宽比实际数字的位宽少,则自动截去左边超出的位数, 反之则在左边不够的位置补足0。如果长度不显示,那么数字的 位宽则取决于本身的长度。 注意:这里说的长度或位宽表示数值在二进制形态下的位宽
程序注释 Verilog 是一种格式很自由的语言。 空格在文本中起一个分离符的作用, 别的没有其他用处。 单行注释符用 //********* 与C 语言一致 多行注释符用 /* ------------------------- */
38译码器 74HC138译码器 3位二进制加权地址输入(A0, A1和A2) 并当使能时 提供8个互斥的低有效输出(Y0至Y7)
数码管 module Decode38 ( input [2:0] A_in, //3位地址输入 output reg [7:0] Y_out //8位选择输出 ); always@(A_in) begin //当A_in发生变化时 case (A_in) //根据A_in的值选择执行 3'b000: Y_out = 8'b11111110; 3'b001: Y_out = 8'b11111101; 3'b010: Y_out = 8'b11111011; 3'b011: Y_out = 8'b11110111; 3'b100: Y_out = 8'b11101111; 3'b101: Y_out = 8'b11011111; 3'b110: Y_out = 8'b10111111; 3'b111: Y_out = 8'b01111111; default:Y_out = 8'b11111111; endcase end endmodule
寄存器数据类型 寄存器数据类型: reg型的则可以存取最后一次赋 给它的值, 定义为reg型的线网只能在 always和initial语句中被赋值, 不能被连续赋值。
不同数据类型比较 ①用assign声明语句 如:assign c = a&b; ②用always块 如:always@(posedge clk) c <= a&b; 例子描述了一个与门,但是只有在clk上升沿(posedge)时候a与b 才会进行与。
不同数据类型比较 clk a b assign c always c
数据类型说明 对于模块而言: 输入变量都是线网类型的 输出变量可以是线网类型的,也可以是寄存器类型的
相关语法 1. begin --- end 将多条语句组成顺序块,类似于C语言中的“{}” 2. case() xx: default: endcase case语句是一种多分支选择语句,类似于C语言中的swith—case,每个分支各不相同,执行分支语句后跳出
数码管 数码管 半导体发光器件,基本单元是发光二极管; 价格便宜,使用简单; 主要用来显示时间、日期、温度等数字或较为固定的显示, 家电领域应用极为广泛,如显示屏、空调、热水器、冰箱等等。
数码管 发光二极管简称LED,是半导体二极管的一种,把电能转化成光能
数码管 数码管由 8个LED灯( a、b、c、d、e、f、g和dp)组成,控制每个LED的点亮或熄灭实现数字显示。通常数码管分为共阳极数码管和共阴极数码管,结构如下图所示: DP G F E D C B A 字库 1 8’h5b
数码管
数码管
相关语法 1.用reg声明寄存器变量 reg [8:0] seg; 2.用reg声明存储器(寄存器组) 3.存储器的操作 wire [8:0] a,b; assign a = seg[1]; assign b = seg[1][5:0]; 4.initial关键字 用于给寄存器或存储器初始化数据