首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >比较t_data和rx_data的误差,并用total_error "verilog“给出误差值

比较t_data和rx_data的误差,并用total_error "verilog“给出误差值
EN

Stack Overflow用户
提问于 2014-11-13 16:27:51
回答 1查看 280关注 0票数 2

我在verilog中做了一个误码率文件。在ber模块中,我制作了total_error,它比较了t_data和rx_data,并总结了它从比较中得到的错误数。

这是代码

代码语言:javascript
复制
`timescale 1ns / 1ps

module ber
(
  clk,
  rstn,
  T_Data,
  RX_Data,
  total_error,
  enable
);

//inputs
input clk;
input rstn;
input [15 : 0] T_Data;
input [15 : 0] RX_Data;
input enable;
//outputs
output [15:0] total_error;

reg [4:0] i;
reg [15:0] subtotal, next_subtotal;

assign total_error = subtotal;

always @(posedge clk) begin : comb
    next_subtotal = 0;
    for (i = 0; i < 16; i = i + 1)
    begin
      if (T_Data[i] != RX_Data[i] ) 
      begin
        next_subtotal = next_subtotal + 1;
      end
    end
end

always @(posedge clk) begin : dff
  if (rstn==1'b0)
  begin
    subtotal <= 7'b0000000;
  end else
  begin
    subtotal <= next_subtotal;
  end
end
endmodule

在生成BER文件之后,我创建了另一个名为BER_STATE_MACHINE的文件,其中我创建了一个用于TRANFERRING和接收信号的状态机,我用这个ber_state_machine文件实例化了ber文件。

这是代码

代码语言:javascript
复制
// --------------------------------------------------------------------
`timescale 1ns/1ps
module  ber_state_machine
(
    clk,
    resetn,
    T_Data [15:0],
    T_Valid,
    T_Ready,
    RX_Data [15:0],
    RX_Active,
    RX_Valid,
    total_error  
);
//-----------------------------------
input     resetn, clk;

// DECLARING INPUTS AND OUTPUTS FOR TRASMIT SIGNALS
input [15 : 0] T_Data;      
input T_Valid;
output T_Ready; 

// DECLARING INPUTS AND OUTPUTS FOR RECEIVING SIGNALS
input [15 : 0] RX_Data;
input RX_Active;
input RX_Valid;

//-----------------------------------
output [15 : 0] total_error;
//-----------------------------------

reg [6:0] sel;
reg execute_in;
reg T_Ready;

//------------------------------------------    
ber uut
(
  .clk(clk),
  .rstn(resetn),
  .T_Data(T_Data),
  .RX_Data(RX_Data),
  .total_error(total_error),
  .enable(execute_in)
);
//------------------------------------------        

// MAKING STATE MACHINE HERE //INPUTS
always @ (posedge clk or negedge resetn) // state machine for changing states
begin
    if (resetn == 1'b1) // idle state
    begin
        sel <= 7'b000; // state 0
    end
    else if (T_Valid == 7'b1)
    begin
        sel <= 7'b001; // state 1
    end
    else if (sel == 7'b001)
    begin
        sel <= 7'b010; // state 2
    end
    else if (RX_Active == 7'b1)
    begin
        sel <= 7'b011; // state 3
    end
    else if (T_Valid == 7'b1 && RX_Valid == 7'b1)
    begin
        sel <= 7'b100; // state 4
    end
    else if (sel == 7'b100)
    begin
        sel <= 7'b101; // state 5
    end
    else if (T_Valid == 2'b0 && RX_Valid == 2'b0)
    begin
        sel <= 7'b100; // going back to state 4
    end
end

// STATE MACHINE //OUTPUTS
always @ (posedge clk) // outputs for every state in state diagram
begin
    case(sel)
        7'b000 :
            execute_in = 2'b0; // state 0
        7'b001 :
            T_Ready =    2'b1; // state 1
        7'b010 :
            T_Ready =    2'b0; // state 2
        7'b011 :
            execute_in = 2'b1; // state 3
        7'b100 :
            T_Ready =    2'b1; // state 4
        7'b101 :
            T_Ready =    2'b0; // state 5
    endcase
end  
endmodule

在此之后,我做了一个测试bech看看行为模拟。有几个问题,我得到的,我无法解决,因为较少的经验。

  1. t_data和rx_data在模拟中是未定义的,在最后一位之后,我可以看到每个值都包含,但是从0到15,它们是未定义的。我真的不知道问题出在哪里。
  2. 我在total_error中看不到任何价值,即使我把错误放在t_data和rx_data中,但是我看不到total_error中错误的数量。但我可以在仿真中看到,t_data和rx_data的最终值都有错误。

下面是测试平台的代码

代码语言:javascript
复制
`timescale 1ns / 1ps
module test_bench();

//inputs
reg execute_in;
reg clk; 
reg resetn;

//inputs for transferring signals
reg [15:0] T_Data;
reg T_Valid;

//inputs for receiving signals
reg [15:0] RX_Data;
reg RX_Active;
reg RX_Valid;

//outputs
wire [15:0] total_error;
wire T_Ready;

//instantiate the unit under test (UUT)
ber_state_machine uut_ber
(
.clk(clk),
.resetn(resetn),
.T_Data(T_Data),
.T_Valid(T_Valid),
.T_Ready(T_Ready),
.RX_Data(RX_Data),
.RX_Active(RX_Active),
.RX_Valid(RX_Valid),
.total_error(total_error)
);

initial begin
            clk = 1'b0;
            resetn = 1'b1;
            repeat(4) #10 clk = ~clk;
            resetn = 1'b0;
            forever #10 clk = ~clk;
end        

initial begin           
            #100
            execute_in = 0;
            #100
            execute_in = 1;

            #100
            T_Valid = 1'b0;
            RX_Active = 1'b0;
            #100
            RX_Valid = 1'b0;
            //************//
            #100
            RX_Active = 1'b1;
            T_Valid = 1'b1;
            T_Data[0] = 1'b0; // data 0 // make it 0 for error
            RX_Valid = 1'b1;
            RX_Data[0] = 1'b1; // make it 0 for error
            #50
            T_Valid = 1'b0;
            //************//
            #100
            RX_Active = 1'b1;
            T_Valid = 1'b1;
            T_Data[1] = 1'b1; // data 1
            RX_Valid = 1'b1;
            RX_Data[1] = 1'b1; // make it 0 for error
            #50
            T_Valid = 1'b0;

            #100
            RX_Active = 1'b1;
            T_Valid = 1'b1;
            T_Data[2] = 1'b1; // data 2
            RX_Valid = 1'b1;
            RX_Data[2] = 1'b1; // make it 0 for error
            #50
            T_Valid = 1'b0;  

            #100
            RX_Active = 1'b1;
            T_Valid = 1'b1;
            T_Data[3] = 1'b0; // data 3
            RX_Valid = 1'b1;
            RX_Data[3] = 1'b1; // make it 0 for error
            #50
            T_Valid = 1'b0;                    

            #100
            RX_Active = 1'b1;
            T_Valid = 1'b1;
            T_Data[4] = 1'b1; // data 4
            RX_Valid = 1'b1;
            RX_Data[4] = 1'b1; // make it 0 for error
            #50
            T_Valid = 1'b0;

            #100
            RX_Active = 1'b1;
            T_Valid = 1'b1;
            T_Data[5] = 1'b1; // data 5
            RX_Valid = 1'b1;
            RX_Data[5] = 1'b1; // make it 0 for error
            #50
            T_Valid = 1'b0;            

            #100
            RX_Active = 1'b1;
            T_Valid = 1'b1;
            T_Data[6] = 1'b1; // data 6
            RX_Valid = 1'b1;
            RX_Data[6] = 1'b1; // make it 0 for error
            #50
            T_Valid = 1'b0;

            #100
            RX_Active = 1'b1;
            T_Valid = 1'b1;
            T_Data[7] = 1'b1; // data 7
            RX_Valid = 1'b1;
            RX_Data[7] = 1'b1; // make it 0 for error
            #50
            T_Valid = 1'b0;    

            #100
            RX_Active = 1'b1;
            T_Valid = 1'b1;
            T_Data[8] = 1'b1; // data 8
            RX_Valid = 1'b1;
            RX_Data[8] = 1'b0; // make it 0 for error
            #50
            T_Valid = 1'b0;     

            #100
            RX_Active = 1'b1;
            T_Valid = 1'b1;
            T_Data[9] = 1'b1; // data 9
            RX_Valid = 1'b1;
            RX_Data[9] = 1'b1; // make it 0 for error
            #50
            T_Valid = 1'b0;       

            #100
            RX_Active = 1'b1;
            T_Valid = 1'b1;
            T_Data[10] = 1'b1; // data 10
            RX_Valid = 1'b1;
            RX_Data[10] = 1'b1; // make it 0 for error
            #50
            T_Valid = 1'b0;      

            #100
            RX_Active = 1'b1;
            T_Valid = 1'b1;
            T_Data[11] = 1'b1; // data 11
            RX_Valid = 1'b1;
            RX_Data[11] = 1'b1; // make it 0 for error
            #50
            T_Valid = 1'b0;     

            #100
            RX_Active = 1'b1;
            T_Valid = 1'b1;
            T_Data[12] = 1'b1; // data 12
            RX_Valid = 1'b1;
            RX_Data[12] = 1'b1; // make it 0 for error
            #50
            T_Valid = 1'b0;     

            #100
            RX_Active = 1'b1;
            T_Valid = 1'b1;
            T_Data[13] = 1'b1; // data 13
            RX_Valid = 1'b1;
            RX_Data[13] = 1'b1; // make it 0 for error
            #50
            T_Valid = 1'b0;      

            #100
            RX_Active = 1'b1;
            T_Valid = 1'b1;
            T_Data[14] = 1'b1; // data 14
            RX_Valid = 1'b1;
            RX_Data[14] = 1'b1; // make it 0 for error
            #50
            T_Valid = 1'b0;    

            #100
            RX_Active = 1'b1;
            T_Valid = 1'b1;
            T_Data[15] = 1'b1; // data 15
            RX_Valid = 1'b1;
            RX_Data[15] = 1'b1; // make it 0 for error
            #50
            T_Valid = 1'b0;     
        end                                                                         
endmodule

请帮帮我

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-11-13 16:45:58

您的逻辑使用活动-低复位。但是,您的测试平台从重置信号(resetn=1)开始,然后在40 it之后断言它(resetn=0)。我认为你需要倒转测试台的极性:

代码语言:javascript
复制
initial begin
            clk = 1'b0;
            resetn = 0; // Assert active-low reset
            repeat(4) #10 clk = ~clk;
            resetn = ~resetn; // De-assert reset
            forever #10 clk = ~clk;
end        
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26913663

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档