EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
边缘检测工程:Ascii转十六进制模块代码解析 & V2 e! U7 \, i
作者:小黑同学 * f! N( i# n. d! J7 N
本文为明德扬原创文章,转载请注明出处!
$ r: y6 H) [+ T, a& GAscii转十六进制模块的功能:将ASCII所对应的16进制数,转成实质的16进制数。 1 T6 t6 F. _' M" @" t4 m$ Q* h! t
一、 设计架构 4 S. P& H+ S$ ~7 F
+ Z% t0 c* I2 Y2 p8 T, @
上图是Ascii码表对应的数据。我们从图中可以获取到如下关键信息。
6 {1 k* n8 e& Z* R1 m% v1. Ascii码0~9对应的十六进制数为8'h30~8'h39,也就是说收到ASCII码的16进制数8'h30~8'h39时,就转成0~9,也就是减去8'h30。
1 h: T8 E& V3 q) q7 u8 ^2. Ascii码A~F对应的十六进制数为8'h41~8'h46,也就是说收到ASCII码的16进制数8'h41~8'h46时,就转成A~F,也就是减去8'h37。
2 t) I. H1 m9 n' d# \- t/ E3. Ascii码a~f对应的十六进制数为8'h61~8'h66,也就是说收到ASCII码的16进制数8'h61~8'h66时,就转成a~f,也就是减去8'h57。 8 h W- O/ M5 W4 o2 | q8 \3 `) a
本模块的功能,是对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; / Y6 H/ |+ m' m; q- q$ d' C# d
如果输入的ASCII不在数字0~9,A~F,a~f的时候,dout_vld就输出0。 当din=8'h49(大写字母I)时,且din_vld=1,则dout=0,dout_vld=0。 * r+ j: z( U1 `4 W' U: [, C, E
二、 信号的意义 % i; _9 g- q g0 N
信号 | | | | | | | | | | | | | | 输入数据有效指示信号,1bit位宽,当其为高电平时,对应输入数据有效,表示接收到一字节的数据。注意,一个时钟的高电平表示接收到一字节数据。 | | | Ascii码转化为十六进制数之后的输出,位宽为4bit。 | | | 输出数据有效指示信号,1bit位宽,当输入在红框范围内时,dout_vld为高电平,表示Ascii转十六进制转化成功,当输入不再红框范围内时,则dout_vld为低电平,表示数据无效。 |
( `3 U! V' d2 F9 W6 F& H三、参考代码 6 z% C4 L/ c' E+ N
下面展出本模块的设计,欢迎进一步交流,如果需要源代码,欢迎与本人联系。 # Q& u J: ?6 K5 w8 `. X
| module acsii2hex( clk , rst_n , din , din_vld , ; A- ?* j. @ V
dout , dout_vld );
' J9 c* [6 W- w: z parameter DIN_W = 8; parameter DOUT_W = 4; 9 b9 ~2 V$ ^' l* L" Q9 ?0 `: x" I
input clk ; input rst_n ; input [DIN_W-1:0] din ; input din_vld ;
% H/ J2 [8 f& g wire [DIN_W-1:0] din ; wire din_vld ; , m& c/ t8 T: h; W4 G* w
output[DOUT_W-1:0] dout ; output dout_vld ;
" u6 d1 v9 E4 ?& C reg [DOUT_W-1:0] dout ; reg dout_vld ;
- _" D3 o# h$ c+ d; _ 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 6 G/ E; p4 l, g6 F1 f, y: I3 o
- a% F0 y* t0 n9 N 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
# Y6 ?/ n3 C, K+ T$ { endmodule |
以上就是这个模块的介绍,有兴趣了解这个工程,可以和我讨论。 4 y% w& k# M" m; L4 y- J
# V) i7 A" }0 y! s$ X" Y
2 o2 J& a/ [ G2 x. S& o
! d. i1 l, d, E0 |2 y3 l) W |