verilog 之流水灯

1.黑金板 简易操作: 通过判断数值累加    个人观点:黑金代码质量有待提高,讲解不够详细

2.正点原子的 位置调换

led[3:0] <= {led[2:0],led[3]};

3.传统位移

led<=led<<1;     //循环左移一位

4.

# T sys_rst_n <= 1'b1; //在第20ns的时候复位信号信号拉高

# 延迟的作用,单位是上面定义的

5.

`timescale 1ns / 1ps //仿真时间单位/时间精度           

 6.对于  if else 如果有超过1条语句,请使用begin end。

7.对于管脚约束,一般来说寄存器可以直接对应引脚。

8.不存在的语句一定要删除,比如 rst

port connections cannot be mixed ordered and named

端口最后不能有  ‘,’

9.数据加减乘除  直接复制,会扩大位数。如果再进行其他运算 就会舍弃溢出位。

10.数据拼接  {2d'00,dat[11:2] }

11.模块中如果要控制io端口,请使用wire

不指定就默认为1位wire类型。专门指定出wire类型,可能是多位或为使程序易读。wire只能被assign连续赋值,reg只能在initial和always中赋值。wire使用在连续赋值语句中,而reg使用在过程赋值语句中。

12.NET "data_in[0]" LOC = P44 | IOSTANDARD = "LVCMOS33"; //管脚约束 | 两边一定要留空间

13.wire 变量不能初始化,不能连接到1 或者0.或者初始化时候链接完毕。

14.对于没有输出缓冲的时钟,不能连接到多个模块。

 15.

 16.ram 时钟 如果启用了输入输出时钟,相关操作要延迟加一个周期。

17.如果顶层的网线只是将引脚传递给底层,该线路将被系统移除。

18.

fpga 内部使用布线操作,该种方法特别适合于 按位操作。

19.Assignment under multiple single edges is not supported for synthesis

@输入有两个信号,但是 if 却没有考虑两个信号的两种情况

20.仿真reg信号 init里面必须指定初始电平,不然直接使用 always   a=~a;//将得到未知电平

21.function 内部初始化变量

22.

//处理用途?任务 有输出和输入 而且可以使用全局变量 函数可以相互调用,不能使用 输出类型
task automatic data_process;


endtask

23.verilog误区:定义reg和wire尽量不要赋初值,百度网友可能会告诉你这个初值系统会省略,实际上ise会通过逻辑实现,而不是省略。如果这个初值与时钟沿判断相反,将会造成更大的资源浪费,正确的做法应该是在 reset里面赋初值。

24.时序约束也要注意,还有 init函数。网友可能说的有问题。

原文地址:https://www.cnblogs.com/polar-lights/p/10250021.html