邊緣檢測工程:Ascii轉(zhuǎn)十六進(jìn)制模塊代碼解析
作者:小黑同學(xué)
本文為明德?lián)P原創(chuàng)文章,轉(zhuǎn)載請注明出處!
Ascii轉(zhuǎn)十六進(jìn)制模塊的功能:將ASCII所對應(yīng)的16進(jìn)制數(shù),轉(zhuǎn)成實(shí)質(zhì)的16進(jìn)制數(shù)。
一、設(shè)計架構(gòu)
上圖是Ascii碼表對應(yīng)的數(shù)據(jù)。我們從圖中可以獲取到如下關(guān)鍵信息。
1. Ascii碼0~9對應(yīng)的十六進(jìn)制數(shù)為8’h30~8’h39,也就是說收到ASCII碼的16進(jìn)制數(shù)8’h30~8’h39時,就轉(zhuǎn)成0~9,也就是減去8’h30。
2. Ascii碼A~F對應(yīng)的十六進(jìn)制數(shù)為8’h41~8’h46,也就是說收到ASCII碼的16進(jìn)制數(shù)8’h41~8’h46時,就轉(zhuǎn)成A~F,也就是減去8’h37。
3. Ascii碼a~f對應(yīng)的十六進(jìn)制數(shù)為8’h61~8’h66,也就是說收到ASCII碼的16進(jìn)制數(shù)8’h61~8’h66時,就轉(zhuǎn)成a~f,也就是減去8’h57。
本模塊的功能,是對ASCII碼的0~9,a~f,A~F進(jìn)行轉(zhuǎn)換,其他數(shù)據(jù)不轉(zhuǎn)換,不在此范圍的,數(shù)據(jù)無效。例如:
當(dāng)din=8’h31(字符1),且din_vld = 1,則dout=4’h1,dout_vld=1;
當(dāng)din=8’h41(大寫字母A)時,且din_vld=1,則dout=4‘d10,dout_vld=1;
如果輸入的ASCII不在數(shù)字0~9,A~F,a~f的時候,dout_vld就輸出0。
當(dāng)din=8’h49(大寫字母I)時,且din_vld=1,則dout=0,dout_vld=0。
二、信號的意義
信號 |
類型 |
意義 |
clk |
輸入信號 |
時鐘信號。 |
rst_n |
輸入信號 |
復(fù)位信號,低電平有效。 |
din |
輸入信號 |
接收的Ascii碼數(shù)據(jù),位寬為8bit。 |
din_vld |
輸入信號 |
輸入數(shù)據(jù)有效指示信號,1bit位寬,當(dāng)其為高電平時,對應(yīng)輸入數(shù)據(jù)有效,表示接收到一字節(jié)的數(shù)據(jù)。注意,一個時鐘的高電平表示接收到一字節(jié)數(shù)據(jù)。 |
dout |
輸出信號 |
Ascii碼轉(zhuǎn)化為十六進(jìn)制數(shù)之后的輸出,位寬為4bit。 |
dout_vld |
輸出信號 |
輸出數(shù)據(jù)有效指示信號,1bit位寬,當(dāng)輸入在紅框范圍內(nèi)時,dout_vld為高電平,表示Ascii轉(zhuǎn)十六進(jìn)制轉(zhuǎn)化成功,當(dāng)輸入不再紅框范圍內(nèi)時,則dout_vld為低電平,表示數(shù)據(jù)無效。 |
三、參考代碼
下面展出本模塊的設(shè)計,歡迎進(jìn)一步交流,如果需要源代碼,歡迎與本人聯(lián)系。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61 |
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 |
明德?lián)P專注FPGA研究,我司正在連載兩本書籍:《基于FPGA至簡設(shè)計法實(shí)現(xiàn)的圖像邊緣檢測系統(tǒng)》(http://www.fpgabbs.cn/forum.php?mod=viewthread&tid=691)、《ASIC和FPGA時序約束理論與應(yīng)用》(http://www.fpgabbs.cn/forum.php?mod=viewthread&tid=705),有興趣點(diǎn)擊觀看。
也歡迎加入群(838209674),及時獲取最新的文章信息,整個邊緣檢測工程源代碼可加Q:1817866119(N老師)獲取!