小黑同学 明德扬FPGA科教
本文为明德扬原创文章,转载请注明出处!
Ascii转十六进制模块的功能:将ASCII所对应的16进制数,转成实质的16进制数。
一、 设计架构
上图是Ascii码表对应的数据。我们从图中可以获取到如下关键信息。
1. Ascii码0~9对应的十六进制数为8'h30~8'h39,也就是说收到ASCII码的16进制数8'h30~8'h39时,就转成0~9,也就是减去8'h30。
2. Ascii码A~F对应的十六进制数为8'h41~8'h46,也就是说收到ASCII码的16进制数8'h41~8'h46时,就转成A~F,也就是减去8'h37。
3. Ascii码a~f对应的十六进制数为8'h61~8'h66,也就是说收到ASCII码的16进制数8'h61~8'h66时,就转成a~f,也就是减去8'h57。
本模块的功能,是对ASCII码的0~9,a~f,A~F进行转换,其他数据不转换,不在此范围的,数据无效。例如:
当din=8'h31(字符1),且din_vld = 1,则dout=4'h1,dout_vld=1;
当din=8'h41(大写字母A)时,且din_vld=1,则dout=4'd10,dout_vld=1;
如果输入的ASCII不在数字0~9,A~F,a~f的时候,dout_vld就输出0。
当din=8'h49(大写字母I)时,且din_vld=1,则dout=0,dout_vld=0。
二、 信号的意义
三、参考代码
下面展出本模块的设计,欢迎进一步交流,如果需要源代码,欢迎与本人联系。
module acsii2hex(
clk ,
rst_n ,
din ,
din_vld ,
dout ,
dout_vld
);
parameter DIN_W = 8;
parameter DOUT_W = 4;
input clk ;
input rst_n ;
input [DIN_W-1:0] din ;
input din_vld ;
wire [DIN_W-1:0] din ;
wire din_vld ;
output[DOUT_W-1:0] dout ;
output dout_vld ;
reg [DOUT_W-1:0] dout ;
reg dout_vld ;
always @(posedge clk or negedge rst_n)begin
if(rst_n==1'b0)begin
dout_vld <= 0;
end
else if(din_vld&&((din>=8'd48&&din<8'd58)||(din>=8'd65&&din<8'd71)||(din>=8'd97&&din<8'd103)))begin
dout_vld <= 1;
end
else begin
dout_vld <= 0;
end
end
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
endmodule
明德扬专注FPGA研究,我司正在连载两本书籍:《基于FPGA至简设计法实现的图像边缘检测系统》(【书籍连载】FPGA和ASIC时序分析和时序约束书籍连载明德扬论坛 - Powered by Discuz!
明德扬N老师q:1817866119