码迷,mamicode.com
首页 > 其他好文 > 详细

Verilog-字符串检测程序(NVIDIA2018数字前端)

时间:2020-03-04 23:18:27      阅读:94      评论:0      收藏:0      [点我收藏+]

标签:inf   depend   sig   under   instant   ini   cte   nbsp   scale   

1、原题

技术图片

 

2、代码

module sequence_detect(
input              clk,
input              rst_n,
input       [7:0]  stringB_in,
input              stringB_en ,
input              stringB_over ,
output reg  [4:0]  location,
output reg         out_valid
);
 
// 输入字符串计数
reg [4:0] location_reg_count;
always @ (posedge clk or negedge rst_n) begin
  if(!rst_n)
    location_reg_count <= 5d1;          // 根据示例索引从1开始
  else if(stringB_en == 1b1 && stringB_over == 1b0) begin
    location_reg_count <= location_reg_count+1;
  end
end

// 检测标志位
reg n_detected,v_detected,i_detected,d_detected,a_detected;   // 标记字母是否已经被检测到了,若是,后面不再检测
always @(posedge clk or negedge rst_n) begin
    if(!rst_n) begin
        n_detected <= 1b0;
        v_detected <= 1b0;
        i_detected <= 1b0;
        d_detected <= 1b0;
        a_detected <= 1b0;        
    end
    else if(stringB_en == 1b1 && stringB_over == 1b0) begin
        case(stringB_in)
            "n": n_detected <= 1b1;
            "v": v_detected <= 1b1;
            "i": i_detected <= 1b1;
            "d": d_detected <= 1b1;
            "a": a_detected <= 1b1;            
        endcase
    end
    else begin
            n_detected <= n_detected;
            v_detected <= v_detected;
            i_detected <= i_detected;
            d_detected <= d_detected;
            a_detected <= a_detected;        
    end

end
 
// 检测
reg [4:0] location_reg;
always @ (posedge clk or negedge rst_n) begin
  if(!rst_n)
    location_reg <= 0;
  else if (stringB_en == 1b1 && stringB_over == 1b0 ) begin
    if((stringB_in == "n" && (!n_detected)) || (stringB_in == "v" && (!v_detected)) || (stringB_in == "i"&& (!i_detected))
     ||(stringB_in == "d"&& (!d_detected))  || (stringB_in == "a"&& (!a_detected))) begin
      location_reg <= location_reg_count;
    end
    else begin
      location_reg <= location_reg;
    end
  end
end
 
// 输出
always @ (posedge clk or negedge rst_n) begin
  if(!rst_n)
    out_valid <= 0;
  else if (stringB_over == 1b1 ) begin
    location <= location_reg ;
    out_valid <= 1b1;
  end
  else begin
    location <= 0 ;
    out_valid <= 1b0;
  end
end
      
 
endmodule

 3、测试激励

`timescale 1ns / 1ps

////////////////////////////////////////////////////////////////////////////////
// Company: 
// Engineer:
//
// Create Date:   21:26:54 03/04/2020
// Design Name:   sequence_detect
// Module Name:   D:/MyFiles/code_and_projects/ISE/projects/for_work/sequence_detect_tb.v
// Project Name:  for_work
// Target Device:  
// Tool versions:  
// Description: 
//
// Verilog Test Fixture created by ISE for module: sequence_detect
//
// Dependencies:
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
////////////////////////////////////////////////////////////////////////////////

module sequence_detect_tb;

    // Inputs
    reg clk;
    reg rst_n;
    reg [7:0] stringB_in;
    reg stringB_en;
    reg stringB_over;

    // Outputs
    wire [4:0] location;
    wire out_valid;

    // Instantiate the Unit Under Test (UUT)
    sequence_detect uut (
        .clk(clk), 
        .rst_n(rst_n), 
        .stringB_in(stringB_in), 
        .stringB_en(stringB_en), 
        .stringB_over(stringB_over), 
        .location(location), 
        .out_valid(out_valid)
    );

    initial begin
        // Initialize Inputs
        clk = 0;
        rst_n = 0;
        stringB_in = 0;
        stringB_en = 0;
        stringB_over = 0;

        // Wait 100 ns for global reset to finish
        #70;
        rst_n = 1;
        stringB_en = 1;
        stringB_in = "n";
        @(posedge clk);
        stringB_in = "a";
        @(posedge clk);
        stringB_in = "a";
        @(posedge clk);
        stringB_in = "b";
        @(posedge clk);
        stringB_in = "c";
        @(posedge clk);
        stringB_in = "d";
        @(posedge clk);
        stringB_in = "i";
        @(posedge clk);
        stringB_in = "a";
        @(posedge clk);
        stringB_in = "i";
        @(posedge clk);
        stringB_in = "c";
        @(posedge clk);
        stringB_in = "c";
        @(posedge clk);
        stringB_in = "b";
        @(posedge clk);
        stringB_in = "v";
        @(posedge clk);
        stringB_in = "d";
        @(posedge clk);
        stringB_in = "e";
        @(posedge clk);        
        
        
        #20;
        stringB_en = 0;
        stringB_over = 1;
        
        
        
        
        
        
        
        // Add stimulus here

    end
    
    always #50 clk = !clk;
      
endmodule

4、输出波形

技术图片

 

Verilog-字符串检测程序(NVIDIA2018数字前端)

标签:inf   depend   sig   under   instant   ini   cte   nbsp   scale   

原文地址:https://www.cnblogs.com/wt-seu/p/12416553.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!