数字IC验证--MCDT源码23822

mcdt框图

在这里插入图片描述

slave_fifo

接收外部的数据,在合适的时间,将数据发送给仲裁器

module slave_fifo (
input                       clk_i,                  // Clock input 
input                       rstn_i,                 // Reset signal 
input [31:0]                chx_data_i,             // Data input                 ---->From outside
input                       a2sx_ack_i,             // Read ack                   ---->From Arbiter
input                       chx_valid_i,            // Data is valid From outside ---->From Outside
output reg [31:0]           slvx_data_o,            // Data Output                ---->To Arbiter
output [5:0]                slvx_margin_o,          // Data margin               ---->To Outside
output reg                  chx_ready_o,            // Ready to accept data       ---->To outside
output reg                  slvx_val_o,             // Output data is valid       ---->To Arbiter
output reg                  slvx_req_o              // Request to send data       ---->To Arbiter
);     
//------------------------------Internal variables-------------------//
reg [5:0] wr_pointer_r;
reg [5:0] rd_pointer_r;
reg [31:0] mem [0:31]; //FIFO 32bits width and 32 deepth
//-----------------------------Variable assignments------------------//
wire full_s, empty_s, rd_en_s ;
wire [5:0] data_cnt_s;
assign full_s = ({~wr_pointer_r[5],wr_pointer_r[4:0]}==rd_pointer_r);
assign empty_s = (wr_pointer_r == rd_pointer_r);
assign data_cnt_s = (6'd32 - (wr_pointer_r - rd_pointer_r));
assign slvx_margin_o = data_cnt_s;
assign rd_en_s = a2sx_ack_i;

//-----------Code Start---------------------------------------------//
always @ (*) //ready signal
begin
if (!full_s) chx_ready_o = 1'b1;                  //If FIFO is not full then it is ready to accept data
else chx_ready_o = 1'b0;
end

always @ (*) //reset signal
begin 
  if (!rstn_i) slvx_req_o = 1'b0;
  else if (!empty_s) slvx_req_o = 1'b1;           //If FIFO is not empty then it is ready to send data
  else slvx_req_o = 1'b0;
end 

//write pointer increment
always @ (posedge clk_i or negedge rstn_i)
begin : WRITE_POINTER
  if (!rstn_i) begin
    wr_pointer_r <= 6'b0000;
  end else 
  if (chx_valid_i && chx_ready_o) begin
    wr_pointer_r <= wr_pointer_r + 6'b0001;
  end
end

//read pointer increment
always @ (posedge clk_i or negedge rstn_i)
begin : READ_POINTER
  if (!rstn_i) begin
    rd_pointer_r <= 6'b0000;
  end else 
  if (rd_en_s && (!empty_s)) begin
    rd_pointer_r <= rd_pointer_r + 6'b0001;
  end
end

//data output is vaild 
always @ (posedge clk_i or negedge rstn_i)
begin
  if (!rstn_i) slvx_val_o <= 1'b0;
  else if (rd_en_s && (!empty_s))
    slvx_val_o <= 1'b1;
    else slvx_val_o <= 1'b0;
end 

// Memory Read Block 
always  @ (posedge clk_i )
begin : READ_DATA 
  if (rstn_i && rd_en_s && (!empty_s)) begin
    slvx_data_o <= mem[rd_pointer_r[4:0]];
  end
end

// Memory Write Block 
always @ (posedge clk_i)
begin : MEM_WRITE
	if (rstn_i && chx_valid_i && chx_ready_o) begin
	  mem[wr_pointer_r[4:0]] <= chx_data_i;
	 end
end
endmodule 

接口说明
input clk_i, 时钟输入
input rstn_i, 复位输入
input [31:0] chx_data_i, 外部数据输入
input a2sx_ack_i, 从仲裁器(Arbiter)获得的应答
input chx_valid_i, 外部输入的数据有效信号

output reg [31:0] slvx_data_o, 输出到仲裁器的数据
output [5:0] slvx_margin_o, 输出到外部剩余可写数据位数
output reg chx_ready_o, 输出到外部的准备信号
output reg slvx_val_o, 输出到仲裁器的数据有效信号
output reg slvx_req_o 输出到仲裁器的数据器请求发送信号

当fifo中数据不满,chx_ready_o准备接受数据信号拉高;当fifo不空,请求发送数据信号拉高。
当外部数据有效并且fifo不满,时钟上升沿地址指针加1.
当仲裁器返回应答,并且fifo非空,读指针加1.
信号说明
1、FIFO写满与读空
写满:写指针最高位取反等于读指针
读空:写指针与读指针相等

assign full_s = ({~wr_pointer_r[5],wr_pointer_r[4:0]}==rd_pointer_r);
assign empty_s = (wr_pointer_r == rd_pointer_r);

2、slvx_margin_o剩余可写数据位数

assign data_cnt_s = (6'd32 - (wr_pointer_r - rd_pointer_r));
assign slvx_margin_o = data_cnt_s;

3、数据读写
读要求仲裁器的应答信号和非空信号
写要求外都数据有效和准备写信号

// Memory Read Block 
always  @ (posedge clk_i )
begin : READ_DATA 
  if (rstn_i && rd_en_s && (!empty_s)) begin
    slvx_data_o <= mem[rd_pointer_r[4:0]];
  end
end

// Memory Write Block 
always @ (posedge clk_i)
begin : MEM_WRITE
	if (rstn_i && chx_valid_i && chx_ready_o) begin
	  mem[wr_pointer_r[4:0]] <= chx_data_i;
	 end
end

arbiter

与各个slave_fifo通讯并且判优。

module arbiter(
input                    clk_i,
input                    rstn_i,

//connect with slave port
input  [31:0]            slv0_data_i,
input  [31:0]            slv1_data_i,
input  [31:0]            slv2_data_i,
input                    slv0_req_i,
input                    slv1_req_i,
input                    slv2_req_i,
input                    slv0_val_i,
input                    slv1_val_i,
input                    slv2_val_i,
output                   a2s0_ack_o,
output                   a2s1_ack_o,
output                   a2s2_ack_o,

//Output of MCDT
output                   data_val_o,
output [1:0]             arb_id_o,
output [31:0]            arb_data_o       
);

reg                   data_val_r;
reg [1:0]             arb_id_r;
reg [31:0]            arb_data_r;
reg [2:0]             c_state;
reg [2:0]             n_state;

//--------------------------------use FSM to implete simple Round Robin Arbiter                             

parameter   IDLE = 3'b000,
            GRANT0 = 3'b001,
            GRANT1 = 3'b010,
            GRANT2 = 3'b100;

always @ (posedge clk_i or negedge rstn_i)
begin
  if (!rstn_i) c_state <= IDLE;
  else c_state <= n_state;
end 

always @ (*)
begin
  if (!rstn_i) n_state = IDLE; //default priority slv0 > slv1 > slv2
  else 
    case (c_state)
      IDLE :  if (slv0_req_i) n_state = GRANT0;
              else if (slv1_req_i) n_state = GRANT1;
              else if (slv2_req_i) n_state = GRANT2;
              else n_state = IDLE;

     GRANT0 : if (slv1_req_i) n_state = GRANT1;
              else if (slv2_req_i) n_state = GRANT2;
              else if (slv0_req_i) n_state = GRANT0;
              else n_state = IDLE;

     GRANT1 : if (slv2_req_i) n_state = GRANT2;
              else if (slv0_req_i) n_state = GRANT0;
              else if (slv1_req_i) n_state = GRANT1;
              else n_state = IDLE;

    GRANT2 : if (slv0_req_i) n_state = GRANT0;
             else if (slv1_req_i) n_state = GRANT1;
             else if (slv2_req_i) n_state = GRANT2;
             else n_state = IDLE;
    default : n_state = IDLE;
    endcase
end 

assign {a2s2_ack_o,a2s1_ack_o,a2s0_ack_o} =  c_state;


// please check only one valid at a time @@ zhangshi  
always @ (*)
begin 
if (!rstn_i) begin
    data_val_r = 1'b0;
    arb_id_r = 2'b11;
    arb_data_r = 32'hffff_ffff;
  end 
  else 
	case ({slv2_val_i,slv1_val_i,slv0_val_i})			
	3'b001 : begin
				data_val_r = slv0_val_i;
            arb_id_r = 2'b00;
            arb_data_r = slv0_data_i;
				end
	3'b010 : begin
            data_val_r = slv1_val_i;
            arb_id_r = 2'b01;
            arb_data_r = slv1_data_i;
            end 
	3'b100 : begin
            data_val_r = slv2_val_i;
            arb_id_r = 2'b10;
            arb_data_r = slv2_data_i;
            end 
				
	default : begin
				data_val_r = 1'b0;
				arb_id_r = 2'b11;
				arb_data_r = 32'hffff_ffff;	
				end 
	endcase 
	
end 

assign data_val_o = data_val_r;
assign arb_data_o = arb_data_r;
assign arb_id_o = arb_id_r;

endmodule

接口说明:
input [31:0] slv0_data_i, 数据输入
input slv0_req_i 数据请求输入
input slv0_val_i, 数据有效是输入
output a2s0_ack_o, 应答信号输出
这样的接口输出有三组

output data_val_o, 数据有效输出
output [1:0] arb_id_o, 通道ID输出
output [31:0] arb_data_o 数据输出

实现方式:根据fifo的数据输出请求信号选择对应的状态,对应状态用独热码形式作为应答信号输出给fifo进行读数据;根据数据有效信号判断通道ID并且进行读取。

### 回答1: MCDT实验3 1.1是指对于MCDT实验3的第一个子实验,其主要目的是研究使用不同颜色的物体对人眼的识别能力产生的影响。 在这个实验中,被试者将会被要求辨别不同颜色的物体。实验过程中,被试者可能会遇到不同的颜色,如红色、蓝色、绿色等,并要求通过按键或其他方式指示物体的颜色。实验会记录被试者的反应时间和准确度,以分析不同颜色对于人眼识别的影响。 这个实验的目的是探究人眼对不同颜色的物体的感知和辨别能力。通过对比不同颜色下的反应时间和准确度,可以了解不同颜色在人眼观察和识别中的作用。这对于设计颜色,如交通信号灯的颜色选择、产品标签颜色的设计等有着重要的参考价值。 实验过程中,可能会使用一些心理学或实验设计的方法,如随机化、对照组等,以保证实验的科学性和结果的可靠性。 通过这个实验,可以得出一些结论,例如不同颜色对于人眼的刺激程度不同,某些颜色可能具有更高的可见度和识别能力,或者某些颜色可能会产生视觉疲劳或混淆。这将对各种领域的设计和实践有着实际意义,例如广告设计、交通信号灯、产品包装等。 总之,MCDT实验3 1.1是一个研究人眼对于不同颜色物体识别能力的实验,通过分析实验结果可以对颜色的选择和使用提供参考和指导。 ### 回答2: MCDT是Memory-Constrained Decision Tree的缩写,它是一种用于学习和预测的机器学习算法。实验3.1是指在进行MCDT实验时的第三个实验,即使用MCDT算法进行决策树学习和预测的第一个实验。 在实验3.1中,我们首先需要准备用于训练和测试的数据集。数据集应包含已知的输入和相应的输出。这些输入可以是数字、文本等形式,而输出通常是对应于输入的一个类别标签或数值。 然后,我们使用MCDT算法对准备的数据集进行训练。MCDT算法通过递归地将数据集分成子集,并在每个子集中选择最佳的分割方式来构建一个决策树。这个决策树可以帮助我们对新的未知输入进行预测。 训练完成后,我们可以使用训练好的决策树对测试集中的输入进行预测。预测过程中,输入会按照决策树的分割规则逐级判断,最终得到一个预测的输出。 实验3.1的结果可以包括准确率、精确率、召回率、F1分数等评估指标。准确率是指预测正确的样本数与总样本数的比例;精确率是指预测为正类别的样本中实际为正类别的比例;召回率是指实际为正类别的样本中被预测为正类别的比例;F1分数是综合衡量精确率和召回率的指标。这些指标可以帮助我们评估MCDT算法的性能和预测结果的准确度。 总之,实验3.1中我们使用MCDT算法进行决策树学习和预测。通过训练和测试数据集,我们可以评估算法的性能并得到预测结果。 ### 回答3: MCDT实验3 1.1是指微控制器与显示器的连接实验。 在这个实验中,我们将学习如何将微控制器与显示器进行连接,并通过控制微控制器来控制显示器的工作。这是一个非常基础的实验,在很多电子产品中都会用到。 首先,我们需要准备一个微控制器和一个显示器。微控制器可以是Arduino、树莓派等开源硬件平台,而显示器可以是LCD显示屏、LED模块或其他类似的设备。 接下来,我们需要连接微控制器和显示器。这通常需要使用一些连接线,如杜邦线或焊接线。具体的连接方式取决于使用的微控制器和显示器的接口类型,一般在微控制器和显示器的技术文档或规格书中能找到详细的连接图。 在完成连接之后,我们需要编写一段程序来控制显示器。这个程序可以使用微控制器的编程语言(如C、Python等)编写。通过编写程序,我们可以实现一些基本的功能,比如在显示器上显示文字、数字或图形等。 完成程序编写后,我们需要将程序上传到微控制器,并与显示器一起工作。这通常需要使用一个开发板或编程器来实现。 最后,我们可以测试我们的实验。通过控制程序,我们可以在显示器上看到我们想要的结果。我们可以通过按下微控制器上的按钮或使用其他输入设备来测试程序的不同状态。 总的来说,MCDT实验3 1.1是一个介绍微控制器与显示器连接的基础实验。通过学习这个实验,我们可以了解到如何连接不同类型的显示器,并通过编写程序来控制显示器的工作。这个实验能够帮助我们在日后的项目中更好地应用和掌握这些技术。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值