FPGA基本语法总结

//一个实例************************
`timescale 1ns / 1ps //定义时钟刻度

module Transceiver (clk,rst_n, Data_in,Data_out); //模块名称
input clk; // 一个一位的输入参数,时钟:
input rst_n; // 一个一位的输入参数,复位:
input [3:0] Data_in; // 一个4位输入,reg为信号类型,
output [6:0] Data_out; // 一个7位输出
wire [6:0] Data_out;

HammingEncode HammingEncode_ins(                  //实例化一个名为HummingEncode的模块,并取名为HummingEncode_ins
		.clk(clk),                       // 实例化的输入入口,将括号里clk这个参数,输入到这个模块的clk接口
		.Data_in(Data_in),              // 一个4位输入,reg为信号类型,
		.Data_out(Data_out)             //实例化的输出出口,将这个模块的Data_in参数,输入到外部名为Data_in变量,括号里
);  

endmodule //结束模块
//**********************************************************************************

reg wire integer paramenter

8’b0000_0000; // " ’ “前的"8” 表示给后面的数分配几个比特的储存空间,或者几条二进制流,即数的位宽
//“b”表示后面的数是二进制计数法,相应还有“d”,“h”等
// 0000_0000就是数,"_“表示分隔符,无意义,主要便于观察数有多少位,另外"z”,"?"表示高阻,"x"表示不确定
-8’d5 //负号只能放在最前

paramenter定义常量 ;
但在实例化模块时可以修改,比如
module Decode(x,x);
paramenter x1=1,x2=1;
Endmodule

则实例化时使用#()可以修改常量:
Decode #(2,2) d1(x,x) ;
则d1中Paramenter x1=2,x2=2;

defparam A.B.C=2; //则可以将实例A下的实例B中的C常量修改为2

wire单驱动或连续 tri 多驱动 未定义逻辑强度->多驱动时冲突->不确定值
assign 连续赋值 这个必须是wire型
wire[7:0] x1;

reg 寄存器储存单元 always中必全为reg
负reg在操作中为正reg :4位 -1 -> +15

memory型 :储存器或数组
reg[7,0] memo[255,0];

位运算 : ^反 &与 |或 ^异或 ^~同或
逻辑运算 :&& || !
关系运算: > < >= <=
等式运算 :== != 存在x 或z ,结果为x ; === !== x或z也必须相同否则为0
移位运算:>> << a>>n; //a右移n位
位拼接:{ , , }
缩减运算 : C=&B; //则C为B[0]与到最后一位的值,同理 |

赋值:
非阻塞: b <= a; //块结束后赋值 时序逻辑中通常
阻塞:b = a // 马上执行,有时会造成麻烦 assign和always块中必须

begin end 顺序块
fork join 并行块

if
else if
else
if后不管需不需要条件以外的操作,最好都接else,即便else后保持原状;

case(x)
1 : XXX1; //当x=1时,执行XXX1
2: XXX2; //当x=2时,执行XXX2
3: XXX3; //当x=3时,执行XXX3
default: XXX4; //除上述情况外,执行XXX3
endcase
//case 可以处理 含z x的数
else default 都是为了避免综合时自动生成锁存器

循环 :
forever //必须在initial块中
repeat(n) //循环n次
while (bool)
for( ; ; )

begin:块名 fork:块名

生成块:generate endgenerate

你可能感兴趣的:(总结与感悟)