1、符号 +: 或者 -:
in[sel*4 +: 4] 代表取in的sel*4 到 sel*4 + (4-1)位,比如当sel为0 时,即in[0 +: 4] 代表从0开始取4位,也就是 in[3:0]
in[3 -: 4] 代表从3开始(包含3)向下取4个数 ,即in[3:0]
2、SOP和POS形式的逻辑函数分别通过最小项和最大项来获得。
SOP : 画 Y=1 时的式子
POS :画 Y = 0 的式子
3、对信号进行打拍的理解
4、双边采样
即对信号打半拍
module top_module (
input clk,
input d,
output q
);
wire clk_reg;
reg d1;
reg d2;
/*
assign q = clk? d1 : d2;
always@ (posedge clk ) begin
d1 <= d;
end
always@ (negedge clk ) begin
d2 <= d;
end
*/
assign q = d1 ^ d2;
always@ (posedge clk ) begin
d1 <= d ^ d2;
end
always@ (negedge clk ) begin
d2 <= d ^ d1;
end
endmodule
5、BCD计数器
module top_module (
input clk,
input reset, // Synchronous active-high reset
output [3:1] ena,
output [15:0] q);
wire [3:0]c;
assign ena = {c[0] & c[1]& c[2], c[1]& c[0], c[0]};
ten one (
.clk (clk),
.reset (reset),
.count (q[3:0]),
.ena (c[0]),
.val(1'b1)
);
ten ten_inst (
.clk (clk),
.reset (reset),
.count (q[7:4]),
.ena (c[1]),
.val(c[0])
);
ten hud (
.clk (clk),
.reset (reset),
.count (q[11:8]),
.ena (c[2]),
.val(c[0] & c[1])
);
ten thou (
.clk (clk),
.reset (reset),
.count (q[15:12]),
.ena (c[3]),
.val(c[0] & c[1] & c[2])
);
endmodule
module ten(
input clk,
input reset,
input val,
output wire ena,
output reg [3:0] count
);
assign ena = count == 4'd9 ? 1'b1 : 1'b0;
always@ (posedge clk)
if(reset)
count <= 4'd0;
else if (count == 4'd9 && val)
count <= 4'd0;
else if(val)
count <= count + 1;
endmodule
5、设计 FIFO 的深度
假设 FIFO 的写时钟为 100MHZ,读时钟为 80MHZ。在 FIFO 输入侧,每 100 个时钟,写入
80 个数据;FIFO 读入测,每个时钟读取一个数据。设计合理的 FIFO 深度,使 FIFO 不会溢
出。
我们需要考虑数据轻载和重载的情况,对缓存能力要求最高的情况为背靠背传输,则 FIFO
深度为 160-(160/100)*80=32
我们将问题一般化:
1) 写时钟频率 WCLK
2) 读时钟频率 RCLK
3) 写入测每 B 个时钟周期有 A 个数据写入
4) 读取测每 Y 个时钟周期有 X 个数据读出
则 FIFO 的深度为,
其中 burst_length 与写入测情况有关。
如果100个写时钟周期可以写入80个数据,10个读时钟可以读出8个数据。令wclk=rclk ,考虑背靠背
(20个clk不发数据+80clk发数据+80clk发数据+20个clk不发数据的200个clk)代入公式可计算FIFO的深度
fifo_depth = 160-160X(80%)=160-128=32
如果令wclk=200mhz,改为100个wclk里写入40个,rclk=100mhz,10个rclk里读出8个。那么fifo深度为48
计算如下fifo_depth =80-80X(80%)X(100/200)=80-32=48
6、>>>是算术右移,考虑符号位,如果是0,则左边补0,如果是1,则左边补1
7、