十六进制代表的数据通过UART发送到电脑上表示出来,所以最终要求就是将十六进制表示的数据用ASCII码表示传给电脑
假设输入只有如下情况
ASCII码 | ASCII对应的16进制及10进制 | 16进制 | ASCII码转化为16进制 | 16进制转化为ASCII码 |
0-9 | 8'h30-8'h39(即d'48-d'57) | 0-9 | ASCII对应10进制减去d'48 | 16进制加d'48 |
A~F | 8'h41-8'h46(即d'65-d'70) | a-f | ASCII对应10进制减去d'55 | 16进制加d'55 |
a~f | 8'h61-8'h66即d'97-d'102) | a-f | ASCII对应10进制减去d'87 | 16进制加d'87 |
由于16进制中大小写都是一样的所以规定十六进制数据的输入为大写字母时
因此获得16进制转ASCII码,Verilog代码如下:
module hex_to_ascii(
clk ,
rst_n ,
din ,
din_vld ,
dout
);
//参数定义
parameter D_W = 8;
//输入信号定义
input clk ;
input rst_n ;
input [D_W-1:0] din ;
input din_vld;
wire [D_W-1:0] din ;
//输出信号定义
output [D_W-1:0] dout ;
//输出信号reg定义
reg [D_W-1:0] dout ;
//dout
always @(posedge clk or negedge rst_n)begin
if(rst_n==1'b0)begin
dout <= 0;
end
else begin
if(din_vld)begin
if(din<4'ha)//0-9数字
dout <= din+48;//hex((4))->dec(asccii(4))
else
dout <= din +55;
end
end
end
endmodule
反之ASCII转16进制就需要考虑一下大小写,,Verilog代码如下:
always@(posedge clk or negedge rst_n)begin
if(rst_n==1'b0)begin
dout <= 0;
end
else if(din>=8'd48&&din<8'd58) begin
dout <= din - 8'd48;
end
else if(din>=8'd65&&din<8'd71) begin
dout <= din - 8'd55;
end
else if(din>=8'd97&&din<8'd103) begin
dout <= din - 8'd87;
end
else begin
dout <= 0;
end
end