EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
边缘检测工程:Ascii转十六进制模块代码解析
E4 b7 }* U, S: _! Y( k作者:小黑同学
, r2 F$ M$ k9 S0 Q本文为明德扬原创文章,转载请注明出处!
* a# A; @5 j3 ^% W+ k( QAscii转十六进制模块的功能:将ASCII所对应的16进制数,转成实质的16进制数。
; ]/ F0 L# z4 p- ^, y一、 设计架构
# _ M+ D' U; N, o& i2 ~7 l; z" c n* i5 U
上图是Ascii码表对应的数据。我们从图中可以获取到如下关键信息。 " }' D+ t0 l" }) Q/ h8 m4 }
1. Ascii码0~9对应的十六进制数为8'h30~8'h39,也就是说收到ASCII码的16进制数8'h30~8'h39时,就转成0~9,也就是减去8'h30。
1 z' W3 [+ `! b9 a2. Ascii码A~F对应的十六进制数为8'h41~8'h46,也就是说收到ASCII码的16进制数8'h41~8'h46时,就转成A~F,也就是减去8'h37。 " H) @+ X. g5 l! x: a1 b
3. Ascii码a~f对应的十六进制数为8'h61~8'h66,也就是说收到ASCII码的16进制数8'h61~8'h66时,就转成a~f,也就是减去8'h57。
5 i# [ ~2 G/ s4 p8 v本模块的功能,是对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; 7 r( K/ h. g5 K1 ~! I
如果输入的ASCII不在数字0~9,A~F,a~f的时候,dout_vld就输出0。 当din=8'h49(大写字母I)时,且din_vld=1,则dout=0,dout_vld=0。
. j$ p/ ^' z/ g4 D+ F5 N二、 信号的意义
& e; v S/ Y. J! K3 `! O信号 | | | | | | | | | | | | | | 输入数据有效指示信号,1bit位宽,当其为高电平时,对应输入数据有效,表示接收到一字节的数据。注意,一个时钟的高电平表示接收到一字节数据。 | | | Ascii码转化为十六进制数之后的输出,位宽为4bit。 | | | 输出数据有效指示信号,1bit位宽,当输入在红框范围内时,dout_vld为高电平,表示Ascii转十六进制转化成功,当输入不再红框范围内时,则dout_vld为低电平,表示数据无效。 |
: \ B- G" d; H# P三、参考代码 ( G4 z) O4 B( ]7 N. s! j1 l4 }
下面展出本模块的设计,欢迎进一步交流,如果需要源代码,欢迎与本人联系。 & @0 k/ U' E/ f2 D- `2 M7 }
| module acsii2hex( clk , rst_n , din , din_vld ,
6 i+ E* m+ V7 m dout , dout_vld ); . e$ Z# t+ e7 M5 e! T5 p1 p' j: t
parameter DIN_W = 8; parameter DOUT_W = 4; 8 p; Z/ l- [: N+ Y7 V; D4 Z5 {
input clk ; input rst_n ; input [DIN_W-1:0] din ; input din_vld ;
' w, f% U9 R% G& D' S! S) W, d wire [DIN_W-1:0] din ; wire din_vld ; 9 h6 B% _- s# c
output[DOUT_W-1:0] dout ; output dout_vld ;
! B' D* W8 t6 O7 L: ?' f6 j reg [DOUT_W-1:0] dout ; reg dout_vld ;
5 I5 `" d& g( \. a. D7 C 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
$ l! R5 v2 Q, m3 _, [- I) g* B
- r! I6 G) u% r 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 4 ?2 P" {5 Z; @0 C8 P
endmodule |
以上就是这个模块的介绍,有兴趣了解这个工程,可以和我讨论。
. n9 n" x- N# u6 R2 c* y# B! [+ t
/ C9 l u, G+ j% c0 I; ~
* ~6 d1 N; L7 X3 G
|