ASCII HEX BIN DIG进制转换工具页

本文介绍了一个实用的ASCII HEXBINDIG进制转换工具,该工具可以帮助用户轻松进行不同进制之间的数值转换,适用于编程和数据处理等场景。
module top_moudle ( input clk, // 50MHz系统时钟 input rst_n, // 低电平有效复位 input [7:0] adc_data_in, // ADC输入数据(8位) input adc_data_valid,// ADC数据有效标志 output adc_clk, // ADC时钟输出 output adc_cs_n, // ADC片选信号(低有效) output reg uart_tx // UART发送数据线 ); // ============================================================================= // 参数定义区域 // ============================================================================= // UART波特率参数 (9600bps @ 50MHz) localparam BAUD_DIV = 5208; // 50MHz / 9600 ≈ 5208 localparam STR_LEN = 30; // 发送字符串总长度 // ADC控制参数 localparam ADC_CLK_DIV = 10; // ADC时钟分频系数 (50MHz/10 = 5MHz) localparam SAMPLE_INTERVAL = 5000000; // 采样间隔 (5MHz时钟下约1秒) // 状态机状态定义 localparam [2:0] S_IDLE = 3'd0; // 空闲状态 localparam [2:0] S_START = 3'd1; // 发送起始位 localparam [2:0] S_DATA = 3'd2; // 发送数据位 localparam [2:0] S_STOP = 3'd3; // 发送停止位 localparam [2:0] S_NEXT_BYTE = 3'd4; // 准备下一个字节 // ============================================================================= // ADC控制模块 // ============================================================================= // ADC时钟生成 reg [3:0] adc_clk_counter; reg adc_clk_reg; reg [23:0] sample_counter; // 采样间隔计数器 reg sample_enable; // 采样使能信号 // ADC时钟分频:50MHz -> 5MHz always @(posedge clk or negedge rst_n) begin if (!rst_n) begin adc_clk_counter <= 4'd0; adc_clk_reg <= 1'b0; end else begin if (adc_clk_counter == ADC_CLK_DIV/2 - 1) begin adc_clk_reg <= ~adc_clk_reg; adc_clk_counter <= 4'd0; end else begin adc_clk_counter <= adc_clk_counter + 1'b1; end end end assign adc_clk = adc_clk_reg; // 采样间隔控制 (约1秒采样一次) always @(posedge clk or negedge rst_n) begin if (!rst_n) begin sample_counter <= 24'd0; sample_enable <= 1'b0; end else begin if (sample_counter == SAMPLE_INTERVAL - 1) begin sample_counter <= 24'd0; sample_enable <= 1'b1; // 产生采样使能脉冲 end else begin sample_counter <= sample_counter + 1'b1; sample_enable <= 1'b0; end end end // ADC片选控制 - 持续使能ADC assign adc_cs_n = 1'b0; // ADC数据寄存器 reg [7:0] adc_data_reg; reg adc_data_ready; // 捕获有效的ADC数据 always @(posedge clk or negedge rst_n) begin if (!rst_n) begin adc_data_reg <= 8'd0; adc_data_ready <= 1'b0; end else if (adc_data_valid && sample_enable) begin adc_data_reg <= adc_data_in; // 锁存ADC数据 adc_data_ready <= 1'b1; // 设置数据就绪标志 end else begin adc_data_ready <= 1'b0; end end // ============================================================================= // UART发送控制模块 // ============================================================================= // 波特率时钟生成 reg [12:0] baud_cnt; reg baud_tick; always @(posedge clk or negedge rst_n) begin if (!rst_n) begin baud_cnt <= 13'd0; baud_tick <= 1'b0; end else begin if (baud_cnt == BAUD_DIV - 1) begin baud_cnt <= 13'd0; baud_tick <= 1'b1; // 产生1个时钟周期的波特率使能脉冲 end else begin baud_cnt <= baud_cnt + 1'b1; baud_tick <= 1'b0; end end end // 字符串存储ROM - 存储固定字符串和ADC数据 reg [7:0] send_rom [0:STR_LEN-1]; // 字符串初始化 - 包含ADC数据占位符 initial begin // 初始化发送字符串 "ADC Value: 0xXX\r\n" send_rom[0] = 8'h41; // 'A' send_rom[1] = 8'h44; // 'D' send_rom[2] = 8'h43; // 'C' send_rom[3] = 8'h20; // ' ' send_rom[4] = 8'h56; // 'V' send_rom[5] = 8'h61; // 'a' send_rom[6] = 8'h6C; // 'l' send_rom[7] = 8'h75; // 'u' send_rom[8] = 8'h65; // 'e' send_rom[9] = 8'h3A; // ':' send_rom[10] = 8'h20; // ' ' send_rom[11] = 8'h30; // '0' send_rom[12] = 8'h78; // 'x' // 位置13-14为ADC数据(十六进制高位和低位) send_rom[13] = 8'h30; // 初始化为'0',将被ADC数据替换 send_rom[14] = 8'h30; // 初始化为'0',将被ADC数据替换 send_rom[15] = 8'h0D; // '\r' send_rom[16] = 8'h0A; // '\n' // 其余位置初始化为0 for (integer i = 17; i < STR_LEN; i = i + 1) begin send_rom[i] = 8'h00; end end // ADC数据到ASCII字符换 wire [7:0] adc_high_nibble; // ADC高4位对应的ASCII字符 wire [7:0] adc_low_nibble; // ADC低4位对应的ASCII字符 // 将4位二进制数换为十六进制ASCII字符 function [7:0] bin_to_hex_ascii; input [3:0] bin; begin bin_to_hex_ascii = (bin < 4'd10) ? (8'h30 + bin) : (8'h41 + bin - 4'd10); end endfunction assign adc_high_nibble = bin_to_hex_ascii(adc_data_reg[7:4]); assign adc_low_nibble = bin_to_hex_ascii(adc_data_reg[3:0]); // 更新ROM中的ADC数据 always @(posedge clk) begin if (adc_data_ready) begin send_rom[13] <= adc_high_nibble; // 更新ADC高4位字符 send_rom[14] <= adc_low_nibble; // 更新ADC低4位字符 end end // ============================================================= // 状态机寄存器 reg [2:0] current_state; reg [2:0] next_state; reg [3:0] bit_counter; // 数据位计数器(0-7) reg [4:0] byte_counter; // 字节计数器 reg [7:0] shift_reg; // 移位寄存器 reg send_active; // 发送激活标志 reg uart_busy; // UART忙标志 // 状态寄存器 - 同步状态换 always @(posedge clk or negedge rst_n) begin if (!rst_n) current_state <= S_IDLE; else current_state <= next_state; end // 下一状态逻辑 - 组合逻辑 always @(*) begin case (current_state) S_IDLE: // 空闲状态:当有ADC数据就绪或需要连续发送时进入发送流程 next_state = (send_active && adc_data_ready) ? S_START : S_IDLE; S_START: // 起始位状态:等待波特率时钟脉冲后进入数据位状态 next_state = baud_tick ? S_DATA : S_START; S_DATA: // 数据位状态:发送完8个数据位后进入停止位状态 next_state = (baud_tick && bit_counter == 4'd7) ? S_STOP : S_DATA; S_STOP: // 停止位状态:发送完停止位后准备下一个字节 next_state = baud_tick ? S_NEXT_BYTE : S_STOP; S_NEXT_BYTE: // 下一字节状态:判断是否继续发送或返回空闲 next_state = (byte_counter == 5'd16) ? S_IDLE : S_START; // 只发送前17个字节("ADC Value: 0xXX\r\n") default: next_state = S_IDLE; endcase end // 输出逻辑和寄存器更新 always @(posedge clk or negedge rst_n) begin if (!rst_n) begin // 复位初始化 uart_tx <= 1'b1; // UART空闲时为高电平 bit_counter <= 4'd0; byte_counter <= 5'd0; shift_reg <= 8'd0; send_active <= 1'b1; // 使能发送 uart_busy <= 1'b0; // 初始不忙 end else begin case (current_state) S_IDLE: begin uart_tx <= 1'b1; // 保持空闲状态 uart_busy <= 1'b0; // 当ADC数据就绪时开始发送 if (adc_data_ready && !uart_busy) begin send_active <= 1'b1; byte_counter <= 5'd0; uart_busy <= 1'b1; end end S_START: begin uart_busy <= 1'b1; if (baud_tick) begin uart_tx <= 1'b0; // 发送起始位(低电平) shift_reg <= send_rom[byte_counter]; // 加载当前要发送的字节 bit_counter <= 4'd0; // 复位位计数器 end end S_DATA: begin if (baud_tick) begin // 发送数据位(从最低位开始) uart_tx <= shift_reg[0]; // 发送当前最低位 shift_reg <= {1'b0, shift_reg[7:1]}; // 右移一位 bit_counter <= bit_counter + 1'b1; // 位计数器递增 end end S_STOP: begin if (baud_tick) begin uart_tx <= 1'b1; // 发送停止位(高电平) end end S_NEXT_BYTE: begin byte_counter <= byte_counter + 1'b1; // 字节计数器递增 // 如果发送完所有字节,清除发送标志 if (byte_counter == 5'd16) begin // 发送到第16个字节(共17个) send_active <= 1'b0; uart_busy <= 1'b0; end end endcase end end endmodule 基于安路科技EG4S20BG256开发板,根据上面代,写出一个管脚约束
最新发布
10-13
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值