⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 resp_gen.v

📁 32位单精度浮点加法器
💻 V
字号:
//-----------------------------------------------------------------------------//  //  Copyright (c) 2009 Xilinx Inc.////  Project  : Programmable Wave Generator//  Module   : resp_parse.v//  Parent   : wave_gen.v//  Children : to_dec.v////  Description: //     This module is responsible for pushing data into the character FIFO to//     send to the user over the serial link.//     There are two interfaces from the command parser to this module. The//     first is the one that echoes received characters back to the user//     (giving full duplex communication) - every character received while the//     character FIFO is not full is simply pushed into the FIFO.//     The second is the generation of the response string when a command (or//     error) is entered. There are 3 types of responses//       - The error response (normally "-ERR\n")//       - The OK response (normally "-OK\n")//       - The data response the '-' followed by 4 hex digits, a space, and 5//         decimal digits, then the \n////  Parameters:////  Local Parameters://     RESP_TYPE_*: Values for the different response types//                  Must correspond to those defined in cmd_parse////  Notes       : //     For PC usage, we must send a "Carriage return" (ascii 0xD). The//     terminal program should append a line feed.////  Multicycle and False Paths//     The submodule "to_dec.v" contains a 5 cycle MCP//`timescale 1ns/1psmodule resp_gen (  input             clk_rx,         // Clock input  input             rst_clk_rx,     // Active HIGH reset - synchronous to clk_rx  // From Character FIFO  input             char_fifo_full, // The char_fifo is full  // To/From the Command Parser  input             send_char_val,  // A character is ready to be sent  input      [7:0]  send_char,      // Character to be sent  input             send_resp_val,  // A response is requested  input      [1:0]  send_resp_type, // Type of response - see localparams  input      [15:0] send_resp_data, // Data to be output  output reg        send_resp_done, // The response generation is complete  // To character FIFO  output reg [7:0]  char_fifo_din,  // Character to push into the FIFO                                    // char_fifo_din is NOT from a flop  output            char_fifo_wr_en // Write enable (push) for the FIFO);//***************************************************************************// Parameter definitions//***************************************************************************  `include "clogb2.txt"  function [31:0] max;    input [31:0] a;    input [31:0] b;  begin    max = (a > b) ? a : b;  end  endfunction  function [7:0] to_digit;    input [3:0] val;  begin    if (val < 4'd10)      to_digit = 8'h30 + val; // 8'h30 is the character '0'    else      to_digit = 8'h57 + val; // 8'h57 + 10 is 8'h61 - the character 'a'   end  endfunction//***************************************************************************// Parameter definitions//***************************************************************************  localparam [1:0]    RESP_OK   = 2'b00,    RESP_ERR  = 2'b01,    RESP_DATA = 2'b11;  localparam    STR_OK_LEN   = 4,  // -OK\n    STR_ERR_LEN  = 5,  // -ERR\n    STR_DATA_LEN = 12; // -HHHH DDDDD\n  localparam STR_LEN = max(max(STR_OK_LEN, STR_ERR_LEN), STR_DATA_LEN);  localparam CNT_WID = clogb2(STR_LEN);   // Must hold 0 to STR_LEN-1  localparam LEN_WID = clogb2(STR_LEN+1); // Must hold the value STR_LEN  localparam    IDLE    = 1'b0,    SENDING = 1'b1;   //***************************************************************************// Reg declarations//***************************************************************************  reg               state;    // State variable  reg [CNT_WID-1:0] char_cnt; // Current character being sent//***************************************************************************// Wire declarations//***************************************************************************  // From to_dec  wire [5*4-1-1:0]     bcd_out;         // Most significant digit can                                        // only go from 0 to 6, hence                                        // only needs 3 bits  wire [LEN_WID-1:0]   str_to_send_len; // The length of the string to be sent//***************************************************************************// Tasks and Functions//***************************************************************************//***************************************************************************// Code//***************************************************************************  // Instantiate the Binary Coded Decimal converter  to_bcd to_bcd_i0 (    .clk_rx     (clk_rx),    .rst_clk_rx (rst_clk_rx),    .value_val  (send_resp_val && (send_resp_type == RESP_DATA)),    .value      (send_resp_data),    .bcd_out    (bcd_out)  );  assign str_to_send_len = (send_resp_type == RESP_OK)  ? STR_OK_LEN  :                           (send_resp_type == RESP_ERR) ? STR_ERR_LEN :                                                           STR_DATA_LEN;  // Echo the incoming character to the output, if there is room in the FIFO  always @(posedge clk_rx)  begin    if (rst_clk_rx)    begin      state           <= IDLE;      char_cnt        <= 0;      send_resp_done  <= 1'b0;    end    else if (state == IDLE)    begin      send_resp_done <= 1'b0;      // Make sure not to re-trigger while we are waiting for the       // send_resp_done to affect the send_resp_val. In other words,      // never respond to a send_resp_val if send_resp_done is being sent      if (send_resp_val && !send_resp_done)  // A new response is requested      begin        state    <= SENDING;        char_cnt <= 0;      end    end     else // Not in IDLE state    begin // So are in sending state      if (!char_fifo_full)      begin        // We will send a character this clock        if (char_cnt == (str_to_send_len - 1'b1))         begin          // This will be the last one          state          <= IDLE; // Return to IDLE          send_resp_done <= 1'b1; // Signal cmd_parse that we are done        end        else        begin          char_cnt <= char_cnt + 1'b1;        end      end // if !char_fifo_full    end // if STATE  end // always  assign char_fifo_wr_en =             ((state == IDLE) && send_char_val) ||            ((state == SENDING) && !char_fifo_full) ;  // Generate the DATA to the FIFO  // If idle, the only thing we can be sending is the send_char  // If in the SENDING state, it depends on the send_resp_type, and where  // we are in the sequence  always @(*)  begin    if (state == IDLE)    begin      char_fifo_din = send_char;    end    else    begin      if (send_resp_type == RESP_OK)       begin        case (char_cnt) // synthesis full_case          0 : char_fifo_din = "-"; // Dash          1 : char_fifo_din = "O";          2 : char_fifo_din = "K";          3 : char_fifo_din = 8'h0d; // Newline        endcase      end      else if (send_resp_type == RESP_ERR)      begin        case (char_cnt) // synthesis full_case          0 : char_fifo_din = "-"; // Dash          1 : char_fifo_din = "E";          2 : char_fifo_din = "R";          3 : char_fifo_din = "R";          4 : char_fifo_din = 8'h0d; // Newline        endcase      end      else // It is RESP_DATA      begin        case(char_cnt) // synthesis full_case          0 : char_fifo_din = "-"; // Dash          1 : char_fifo_din = to_digit(send_resp_data[15:12]);          2 : char_fifo_din = to_digit(send_resp_data[11:8 ]);          3 : char_fifo_din = to_digit(send_resp_data[ 7:4 ]);          4 : char_fifo_din = to_digit(send_resp_data[ 3:0 ]);          5 : char_fifo_din = " "; // Space          6 : char_fifo_din = to_digit({1'b0,bcd_out[18:16]});          7 : char_fifo_din = to_digit(bcd_out[15:12]);          8 : char_fifo_din = to_digit(bcd_out[11:8 ]);          9 : char_fifo_din = to_digit(bcd_out[ 7:4 ]);          10: char_fifo_din = to_digit(bcd_out[ 3:0 ]);          11: char_fifo_din = 8'h0d; // Newline        endcase      end // if RESP_DATA    end // if send_char  end // alwaysendmodule

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -