赞
踩
1、与门:F=A?B:0;或门:F=A?1:B;非门:F=A?0:1;传输门:F=A:1:0;
2、异或:F=A?(B?0:1):(B?1:0);同或:F=A?(B?1:0):(B?0:1);(传输门化简后仅使用2个2选1MUX),其中inv可替换非门。
参考:加油站| 逻辑电路中的24种表达式(大疆通用硬件岗解析)
如上图所示dat为输入信号,红色虚线所标即为输入信号上升沿,蓝色虚线所标即为输入信号下降沿,pose_dge为上升沿检测信号,nege_dge即为下降沿检测信号。(assign写法)
module u1( input CLK, input dat, input rst_n, output pose_dge, output nege_dge ); reg dat_delay; always @(posedge CLK)begin if(!rst_n) dat_delay <= 1'b0; else dat_delay <= dat; end assign pose_dge = rst_n ? (dat)&(~dat_delay ) : 0; assign nege_dge = rst_n ? (~dat)&(dat_delay ) : 0; endmodule
module u2( input CLK, input dat, input rst_n, output pose_dge, output nege_dge ); reg dat_delay,pose_dge,nege_dge; always @(posedge CLK)begin if(!rst_n) dat_delay <= 1'b0; else dat_delay <= dat; end always @(posedge CLK)begin if(!rst_n) pose_dge <= 1'b0; else pose_dge <= (dat)&(~dat_delay ); end always @(posedge CLK)begin if(!rst_n) nege_dge<= 1'b0; else nege_dge<= (~dat)&(dat_delay ); end endmodule
不难发现上升沿检测为 A B ‾ A\overline{B} AB形式,下降沿检测为 A ‾ B \overline{A}B AB形式,同时检测即为异或操作即可 dat^dat_delay。
由于快时钟域数据周期短,存在漏检情况,除了周期展宽之外还可以将数据转化为沿,即发送端数据每存在一个脉冲,输出信号进行一次翻转,输出信号跨时钟域打拍后(需要多打一拍作为延迟信号),进行边沿检测(异或)即可恢复。
参考:加油站| 单比特信号跨时钟域问题详解(大疆FPGA逻辑岗A卷)
n u m f r a m e num_{frame} numframe为给出单周期中最大发送量, f l o w f_{low} flow为慢时钟频率, f f a s t f_{fast} ffast为快时钟频率。
1、 二进制转格雷码:a^(a>>1);
2、格雷码转二进制(假设N位数据):
parameter N=
assign binary[N-1]=grey[N-1];
//
generate
genvar i;
for(i=N-2;i>=0;i=i-1)
assign binary[i] = grey[i+1]^binary[i];
//
end
endgenerate
参考:verilog实现格雷码与二进制的转化
3、加入标志位(标志两个指针之间计数周期差别)后的格雷码空满比较(默认读指针不会超过写指针):读空:格雷码相同,由于打拍可能出现虚空;
写满:格雷码高两位相异,其余位相同,由于打拍可能出现虚满;
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。