【数字IC设计 - 笔试刷题】P2 接口转换电路 (异步读写、串转并)

题目

请用verilog设计一个接口转换电路,接口timing如下图所示,假设clka频率为clkb频率的一半(不同源。注意图中clock关系仅为示意),且两次有效访问(wra_n有效)的间隔时间足够长。

模块代码

module Interface_Conversion(
    // System Signal
    input          rst_n   ,
    // Clka
    input          clka    ,
    input          da      ,
    input          wra_n   ,
    // Clkb
    input          clkb    ,
    output         wrb     ,
    output  [7:0]  db
    );

//=============================================
// DECLARATION
//=============================================
    // Reset Signals
    reg             rst_n_f  ;
    reg             rst_sys_n;
    
    // Clka Domain
    reg     [7:0]   da_temp  ;
    reg     [2:0]   cnt_clka ;
    
    // Clkb Domain
    reg             wra_n_ff1 ;
    reg             wra_n_ff2 ;
    reg             wra_n_ff3 ;
    wire            wrb      ;
    wire    [7:0]   db       ;

//=============================================
// MAIN CODE
//=============================================
// Reset Signal Operation
    always @(posedge clkb or negedge rst_n) begin
        if (!rst_n) begin
            rst_n_f   <= 1'b0;
            rst_sys_n <= 1'b0;
        end
        else begin
            rst_n_f   <= rst_n  ;
            rst_sys_n <= rst_n_f;
        end
    end

// Clka Domain
    always @(posedge clka or negedge rst_sys_n) begin
        if (!rst_sys_n) begin
            da_temp  <= 8'd0;
            cnt_clka <= 3'd7;
        end
        else if (!wra_n) begin
            da_temp  <= {da_temp[6:0], da};
            cnt_clka <= cnt_clka - 3'd1   ;
        end
        else
            cnt_clka <= 3'd7;
    end

// Clkb Domain
    always @(posedge clkb or negedge rst_sys_n) begin
        if (!rst_sys_n) begin
            wra_n_ff1 <= 1'b0;
            wra_n_ff2 <= 1'b0;
            wra_n_ff3 <= 1'b0;
        end
        else begin
            wra_n_ff1 <= wra_n     ;
            wra_n_ff2 <= wra_n_ff1 ;
            wra_n_ff3 <= wra_n_ff2 ;
        end
    end

    assign wrb = (wra_n_ff2 && ~wra_n_ff3)? 1'b1: 1'b0;
    assign db  = (wrb)? da_temp: 8'd0;
    
endmodule

TestBench代码

module tb_Interface_Conversion;
//==========================================================
// DEFINE INPUT                                    
//==========================================================
    reg             clk_20M   ;
    reg             clk_10M   ;
    reg             rst_n     ;
    reg     [0:0]   da        ;
    reg             wra_n     ;
    
//==========================================================
// DEFINE OUTPUT                                    
//==========================================================
    wire    [7:0]   db        ;

//==========================================================
// INSTANCE MODULE                                   
//==========================================================
Interface_Conversion U_Interface_Conversion(
    // System Signal
    .rst_n      (rst_n) ,
    // Clka
    .clka       (clk_20M)  ,
    .da         (da)    ,
    .wra_n      (wra_n) ,
    // Clkb
    .clkb       (clk_10M)  ,
    .wrb        (wrb)   ,
    .db         (db)
    );

//==========================================================
// TESTBENCH CODE                                        
//==========================================================
// Clock Generation
    always #25 clk_20M = ~clk_20M;
    always #50 clk_10M = ~clk_10M;
    
// Input Signal Generation
initial begin
    clk_20M = 1'b0;
    clk_10M = 1'b0;
    rst_n   = 1'b0;
    da      = 1'b0;
    wra_n   = 1'b1;
    
    #100 rst_n = 1'b1;
    #200 begin
            da = 1'b0;
            wra_n = 1'b0;
         end
    #50 da = 1'b0;
    #50 da = 1'b1;
    #50 da = 1'b1;
    #50 da = 1'b0;
    #50 da = 1'b0;
    #50 da = 1'b1;
    #50 da = 1'b0;
    #50 wra_n = 1'b1;
end
    
endmodule

测试波形图

模块主要信号(输入输出接口信号):

模块内部处理信号:

答案仅供参考,如有错误欢迎留言指正~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值