EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
边缘检测工程:Ascii转十六进制模块代码解析 . t% s$ o$ [! a5 |. A. G1 m" F
作者:小黑同学
8 c3 P. L# U c, `' y% J; x% Y9 ^本文为明德扬原创文章,转载请注明出处! $ \0 V) q" g" g" \0 m
Ascii转十六进制模块的功能:将ASCII所对应的16进制数,转成实质的16进制数。 6 o0 k y) ^5 a( c0 t8 B, V0 h
一、 设计架构
9 |$ X" u( i) R0 ^3 Y6 o" ~5 X- @. i7 ^/ n M0 A2 Y2 P
上图是Ascii码表对应的数据。我们从图中可以获取到如下关键信息。
! } Z/ r: z0 `3 H4 \1. Ascii码0~9对应的十六进制数为8'h30~8'h39,也就是说收到ASCII码的16进制数8'h30~8'h39时,就转成0~9,也就是减去8'h30。
9 A6 d! \, H5 }3 {2. Ascii码A~F对应的十六进制数为8'h41~8'h46,也就是说收到ASCII码的16进制数8'h41~8'h46时,就转成A~F,也就是减去8'h37。
* A0 S% c' t' x3 V. f3. Ascii码a~f对应的十六进制数为8'h61~8'h66,也就是说收到ASCII码的16进制数8'h61~8'h66时,就转成a~f,也就是减去8'h57。
2 Y, x3 ]. t R本模块的功能,是对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; e; m6 m" [5 j
如果输入的ASCII不在数字0~9,A~F,a~f的时候,dout_vld就输出0。 当din=8'h49(大写字母I)时,且din_vld=1,则dout=0,dout_vld=0。
0 K/ H6 O8 M3 T/ ]7 {3 N二、 信号的意义 8 F# O3 F3 F. Z- R1 V5 y
信号 | | | | | | | | | | | | | | 输入数据有效指示信号,1bit位宽,当其为高电平时,对应输入数据有效,表示接收到一字节的数据。注意,一个时钟的高电平表示接收到一字节数据。 | | | Ascii码转化为十六进制数之后的输出,位宽为4bit。 | | | 输出数据有效指示信号,1bit位宽,当输入在红框范围内时,dout_vld为高电平,表示Ascii转十六进制转化成功,当输入不再红框范围内时,则dout_vld为低电平,表示数据无效。 |
! ^/ J7 t" Q, \4 U" Q三、参考代码
( U' w7 H8 j' u1 C& n# B下面展出本模块的设计,欢迎进一步交流,如果需要源代码,欢迎与本人联系。 / i# j8 `/ ^; g# E4 o
| module acsii2hex( clk , rst_n , din , din_vld , / V- _" J! `" W6 Z' G) g& |- N! l
dout , dout_vld ); " Y& B6 n' Z* U; s. W) Y' ]$ a
parameter DIN_W = 8; parameter DOUT_W = 4; ) A: V: \$ d# z8 P. R' W' e
input clk ; input rst_n ; input [DIN_W-1:0] din ; input din_vld ;
. V( D3 v) Q9 I, K" X: Q wire [DIN_W-1:0] din ; wire din_vld ; & X+ P/ p4 J' s5 D6 p
output[DOUT_W-1:0] dout ; output dout_vld ; % w6 N! i4 E1 ?5 Q0 L' Q2 K- h3 L
reg [DOUT_W-1:0] dout ; reg dout_vld ;
$ M* E' z3 Z/ n& V5 i0 X 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 0 }' ~/ n( p4 N3 G) l _0 H
+ Y9 v0 e, Y0 w# Z
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
3 N, s3 j6 ~1 i3 b6 M/ z endmodule |
以上就是这个模块的介绍,有兴趣了解这个工程,可以和我讨论。 ) I1 `8 V1 @6 l. \; V, I, b( g6 h
$ F# G0 K% M" Q# u* A' |/ W h
3 T* |: U/ h# c3 T) w- H, Y* @* b
" ]3 o+ L: i7 l" v; K0 X+ h |