日常记录(65)通识

IC产业用语

https://zhuanlan.zhihu.com/p/403874080

IDM

Integrated Device Manufacture
集芯片设计、芯片制造、芯片封装和测试等多个产业链环节于一身

Fabless

无工厂模式,就是只做芯片设计和销售,其它环节全都使用外部资源

Foundry

代工厂模式,就是不负责芯片设计,只进行芯片生产的模式

亚稳态与处理

亚稳态产生的原因在于建立和保持时间的窗口内的信号,被时钟边沿采样。器件本身都有该窗口。窗口小则亚稳态更不容易影响电路工作。
又或者是电信号的动力不足,采样得到的结果又受到影响。

亚稳态的处理一般是通过同步器的设计实现,如两级的D触发器。多级的同步器虽然可以再次降低亚稳态出现的概率,但是系统性能也随之下降。
关于性能的下降,可以使用倍频的方式控制多级的触发器,使得结果在更短周期内获取。
https://blog.csdn.net/tristan_tian/article/details/105301175

简单总线协议

IIC

起始信号和终止信号

https://blog.csdn.net/zhanghuaichao/article/details/48266309
image

从机应答信号与01

https://blog.csdn.net/zuo_an/article/details/89139445
image

发送过程

先发地址7位,读写方向位,够8个就等应答,然后对对应的从机进行操作。
image

SPI

读写

有专门的片选信号。而读写没有标记位,全双工形式下,传递地址,就是在下一个周期完成又读又写的操作。

读操作

image

写操作

image

单总线

复位

主机拉低,然后释放,等从机拉低,然后主机检查是否拉低。
image

写操作

主机拉低,然后进行写0或者写1,然后拉高
image

读操作

主机拉低,释放,然后采样读写
image

同步FIFO

端口

端口 长度 方向 功能
data_in 8 input 数据输入
rd 1 input
wr 1 input
rst_n 1 input 复位
clk 1 input 时钟
data_out 8 output 数据输出
full 1 output 满状态
empty 1 output 空状态

程序

分为6个部分,分别是:
数据写入、读取
写指针、读指针
满状态、空状态
设计了5个always结构,和1一个assign语句。

注意边界情况、状态改变情况等。

module my_sync_fifo (data_out, full, empty, data_in, rd, wr, rst_n, clk);
    output wire [7:0] data_out;
    output wire full, empty;
    input wire [7:0] data_in;
    input wire rd, wr, rst_n, clk;

    reg [7:0] mem[0:15];
    reg full_in, empty_in;
    reg [3:0] wp, rp;

    //read data
    assign data_out = mem[rp];
    //empty and full
    assign empty = empty_in;
    assign full = full_in;

    //write data
    always @(posedge clk, negedge rst_n) begin
        if (!rst_n) begin
            ;
        end else if (wr && ~full_in) begin
            mem[wp] <= data_in;
        end
    end

    //change wp
    always @(posedge clk, negedge rst_n) begin
        if (!rst_n) begin
            wp <= 0;
        end else if (wr && ~full) begin
            wp <= wp + 1;
        end
    end

    //change rp
    always @(posedge clk, negedge rst_n) begin
        if (!rst_n) begin
            rp <= 0;
        end else if (rd && ~empty) begin
            rp <= rp + 1;
        end
    end

    //change empty
    always @(posedge clk, negedge rst_n) begin
        if (!rst_n) begin
            empty_in <= 1;
        end else if ((rd && ~wr) && (rp == wp -1 || (rp==4'hf && wp ==0))) begin
            empty_in <= 1;
        end else if (empty_in && wr) begin
            empty_in <= 0;
        end
    end

    //change full
    always @(posedge clk, negedge rst_n) begin
        if (!rst_n) begin
            full_in <= 0;
        end else if ((wr && ~rd) && (wp == rp - 1 || (wp==4'hf && rp ==0))) begin
            full_in <= 1;
        end else if (full_in && rd) begin
            full_in <= 0;
        end
    end

endmodule


posted @ 2022-02-27 18:32  大浪淘沙、  阅读(50)  评论(0)    收藏  举报