时序图:
注意时间轴,如果没有标明(其实大部分也都是不标明的),那么从左往右的方向为时间正向轴,即时间在增长。
在阅读器件手册时,上面的参数名字一般是以器件为主语的,例如:SPI转GPIO芯片里面有个图叫做SPI OUTPUT TIMING,SPI输出时序图,对于转换芯片本身来说是输出,但是对于控制它的芯片(FPGA)来说却是输入。
Vivado:
- 不允许在不同always里面对同一个reg赋值。
- [Synth 8-91] ambiguous clock in event control 错误
原因:always @( posedge clk_in_50m or negedge clk_in_50m )
https://forums.xilinx.com/t5/7-Series-FPGAs/Synth-8-91-ambiguous-clock-in-event-control/td-p/676245https://forums.xilinx.com/t5/7-Series-FPGAs/Synth-8-91-ambiguous-clock-in-event-control/td-p/676245 - 变量,寄存器,线网和参数必须定义出现在使用之前。
- 有 input output inout3种端口型号,input 只能是wire型,并且在声明的端口的时候必须先表明输入输出,再表明是寄存器还是线网类型,例如:
output reg a
输出可以是reg或者wire.
5. 三种产生逻辑的方法:
方法1:常描述组合逻辑
assign a=b=c;
方法2:实例元件
and and_inst(
.q(q) ,
.a(a),
.c(c)
)
方法3:组合逻辑和时序逻辑都可以。
always @ (posdege clk) begin a=b+1; end
- 默认类型为wire型。
- 字母数字下划线和$符号,区分大小写。
- 数字不表明位宽和进制,默认为10进制和系统最高位数。数字可用下划线分隔。
- x 未定值,z和?高阻值。
- 负数-8d6;
- 锁存器是电平触发的存储单元,当输入信号变化时latch输出就变化,没有时钟端;易产生毛刺。
- 寄存器是由触发器和门电路构成的。
- always 和initial 中只能对reg型变量赋值。
=阻塞赋值 | <=费阻塞赋值 |
---|---|
assign;always | always |
顺序 | 并行 |
always <= reg 寄存器
assign = wire 连线
always = reg 连线
原文:https://www.cnblogs.com/uiojhi/p/7844879.html
parameter 的使用:
module exam_prj
#(parameter WIDTH=8)
//端口内也就是括号内的参数只能在这使用
(
input [WIDTH-1:0] dataa,//[WIDTH-1:0]
input [WIDTH-1:0] datab,
output reg [WIDTH:0] result
);
parameter Conuter_Top = 4'd9;//用于代码部分也就是模块内部的参数
//第一个表示只在端口设置时使用,后面的是对于模块内部的使用。
//代码部分省略
参数传递的方法:1、module_name #( parameter1, parameter2) inst_name( port_map);
module adder_16(sum,a,b);
parameter time_delay=5,time_count=10;
......
endmodule
module top;
wire[2:0] a1,b1;
wire[3:0] a2,b2,sum1;
wire[4:0] sum2;
adder_16 #(4,8) AD1(sum1,a1,b1);//time_delay=4,time_count=8//此处重点
endmodule