// module src_ttl_parser #( // parameter REG_START_ADD = 0 // ) ( // input clk, //clock input // input rst_n, //asynchronous reset input, low active // //regbus interface // output reg [31:0] addr, // input [31:0] wr_data, // input wr_en, // inout wire [31:0] rd_data, //received serial data // // 输入 // input ttlin, // //输出 // output wire ttl_output //ttl原始数据 // ); // // // // @功能: // // 1. 计算ttl频率 // // 2. 转发ttl信号 // // 3. 分频倍频 // // // // @寄存器列表: // // 地址 读写 默认 描述 // // 0x00 r 0x0 function 0:原始信号输出 1:频率信号源 // // 0x01 r 0x0 freq //一个周期的计数,单位为 1/50M s // // 0x02 wr 0x0 pll_mul //暂不支持 // // 0x03 wr 0x0 pll_div // // 0x04 wr 0x0 [0]:信号源是上升沿触发,还是下降沿触发 // // // reg ttl_origin_output; //ttl原始信号输出 // reg ttl_after_process_output; //ttl处理后信号输出 // /******************************************************************************* // * 寄存器读写 * // *******************************************************************************/ // parameter ADD_NUM = 5; //寄存器数量 // parameter REG_END_ADD = REG_START_ADD + ADD_NUM - 1; //寄存器结束地址 // reg [31:0] register[REG_START_ADD:REG_END_ADD]; // integer i; // always @(posedge clk or negedge rst_n) begin // if (!rst_n) begin // for (i = 0; i < ADD_NUM; i = i + 1) begin // register[i] <= 0; // end // end else begin // if (wr_en && addr >= REG_START_ADD && addr <= REG_END_ADD) register[addr] <= wr_data; // end // end // assign rd_data = (addr >= REG_START_ADD && addr <= REG_END_ADD) ? register[addr] : 31'bz; // parameter REG_FUNC_ADD = REG_START_ADD + 0; // parameter REG_FREQ_ADD = REG_START_ADD + 1; // parameter REG_PLL_MUL_ADD = REG_START_ADD + 2; // parameter REG_PLL_DIV_ADD = REG_START_ADD + 3; // parameter REG_TTL_EDGE_ADD = REG_START_ADD + 4; // /******************************************************************************* // * ttl输出路径选择 * // *******************************************************************************/ // assign ttl_output = (register[REG_FUNC_ADD] == 0) ? ttl_origin_output : ttl_after_process_output; // /******************************************************************************* // * 原始信号输出 * // *******************************************************************************/ // always @(posedge clk or negedge rst_n) begin // if (!rst_n) begin // ttl_origin_output <= 0; // end else begin // ttl_origin_output <= ttlin; // end // end // /******************************************************************************* // * ttl_in_last信号捕获 * // *******************************************************************************/ // reg ttl_in_last; // always @(posedge clk or negedge rst_n) begin // if (!rst_n) begin // ttl_in_last <= 0; // end else begin // ttl_in_last <= ttlin; // end // end // /******************************************************************************* // * 频率探测 * // *******************************************************************************/ // reg [31:0] ttl_freq_cnt; // always @(posedge clk or negedge rst_n) begin // if (!rst_n) begin // ttl_freq_cnt <= 0; // end else begin // if (ttlin && !ttl_in_last) begin // register[REG_FREQ_ADD] <= ttl_freq_cnt; // ttl_freq_cnt <= 0; // end // if (ttl_freq_cnt != 32'hffff_ffff_ffff_ffff) begin // ttl_freq_cnt <= ttl_freq_cnt + 1; // end // end // end // /******************************************************************************* // * 分频 * // *******************************************************************************/ // reg [31:0] ttl_in_cnt; // always @(posedge clk or negedge rst_n) begin // if (!rst_n) begin // ttl_in_cnt <= 0; // end else begin // if (ttlin && !ttl_in_last) begin // if (ttl_in_cnt <= register[REG_PLL_MUL_ADD]) begin // ttl_in_cnt <= ttl_in_cnt + 1; // end else begin // ttl_in_cnt <= 0; // ttl_after_process_output <= 1; // end // end else begin // ttl_after_process_output <= 0; // end // end // end // endmodule