You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
131 lines
5.0 KiB
131 lines
5.0 KiB
// 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
|