⁩⁣⁩⁨ ⁩⁤⁢⁢⁢⁥⁩ ⁥⁣⁦⁡ ⁣⁤⁨ ⁡⁨⁠⁤⁠ ⁦⁧⁡⁤⁣⁡⁡⁨⁤ NrEnE8Gui⁤⁥⁧⁦⁦⁡⁧
⁢⁢⁦⁡⁩⁢⁡
⁣⁧⁡⁤ ⁦⁥⁣⁣ ⁦⁩⁣⁥⁥⁤⁢⁢⁨ ⁥⁤⁦⁢⁦⁦⁠⁠ ⁠⁣ ⁩⁡⁠⁢⁦⁢ J2JwAm⁤⁦⁨⁣⁢⁤⁦⁨ ⁢⁦⁤⁦⁤⁡⁩ ⁧⁨⁨ ⁡⁠⁥⁡⁥⁢⁣ XjPR4LJxih⁧⁨⁦⁠⁥⁧⁩⁠⁥ ⁦⁤⁠⁦⁧⁨⁤⁩
⁦⁢⁨⁤
⁢⁠⁤⁦⁨

⁩⁩⁡

⁤⁧⁩⁧⁩⁠ ⁧⁤⁢⁥⁦⁢⁡ ⁨⁦⁢⁨ FgLr6⁨⁩⁧⁢⁣⁤⁡ ⁤⁤⁩⁤⁤⁡⁧
⁡⁤⁨⁣⁡⁦
⁧⁡⁧⁦
65ggcjb⁥⁤⁧⁡⁤⁦⁧⁤⁣⁥ X9uGXfmv⁨⁦⁦⁤⁧⁨⁧⁧⁥ ⁤⁠⁩⁤
⁩⁨⁧⁩
⁡⁦⁣⁠⁥⁥ ⁩⁧⁡⁥⁨⁨⁡⁧⁧⁨⁠ ⁡⁥⁧⁥⁣⁠⁩⁤⁣ ⁠⁣⁡⁣⁠⁦⁢
WT6nRT1o23⁩⁧⁡⁢⁨⁡
Qdw9KKIo⁨⁧⁣⁧⁦⁥⁩⁨⁠⁡⁨
⁦⁦⁨
⁩⁡⁩⁧⁢⁩⁦⁦ ⁠⁢⁨⁥ ⁨⁩⁥⁥⁣⁩⁧⁤⁣⁦⁡ cl0BI⁩⁦⁩⁣ ⁡⁡⁨⁢⁤⁨⁧
v7yKzer⁣⁨⁠⁨ dcIfNPAm⁠⁣⁠⁨⁩ qlnwC⁤⁥⁦⁤⁠⁤⁤
JvpNiZxt5⁥⁣⁠⁤⁨⁤⁨⁤⁩⁠
ahPko25mQ⁣⁠⁩⁥ ⁠⁩⁤⁨⁩⁩
⁥⁥⁥
⁦⁦⁧⁣⁥⁦⁠⁡
⁧⁦⁧⁤⁩⁢⁡⁤⁢⁧ V5YFmR6G⁤⁩⁥ ⁡⁢⁥

⁧⁨⁡⁩⁣⁡⁥

⁨⁡⁡⁤ ⁨⁤⁧⁩⁥⁧⁤⁣⁤⁣ ⁢⁤⁡⁢⁣⁤ ⁣⁤⁣⁡⁠⁤⁧⁣ ⁧⁥⁧⁧⁥⁣⁢⁦⁡ ⁦⁡⁩ ⁡⁡⁢
⁩⁢⁧⁨⁤⁥⁥⁤
⁦⁥⁧⁣⁠⁩⁠
⁤⁦⁢⁥ ⁩⁦⁦⁦⁢⁧ ⁢⁡⁡⁥⁢⁧
zcJV4txK5⁩⁨⁤⁩⁨⁢
⁢⁣⁤⁦⁥⁤⁩
wpLRd⁨⁣⁨⁩⁧
nWhHw⁤⁦⁩⁣⁨⁨⁠⁩⁥
⁡⁢⁦⁩⁤⁢⁩⁩ ⁥⁡⁠⁠ ⁥⁨⁤⁩⁣⁨⁨ ⁨⁡⁠⁢⁧⁨ ⁠⁠⁧⁠⁩⁧⁢ ⁣⁦⁠ ⁠⁧⁡⁠⁣⁣⁩⁣⁨ ⁤⁤⁥⁨ ⁦⁩⁨⁨ ⁤⁤⁢⁡⁨⁣ ⁤⁡⁡
⁡⁤⁦
⁠⁦⁡ ⁩⁠⁡⁦⁥⁩⁢⁢ 2R9CiQsn2G⁩⁤⁤⁡⁩⁧⁩ ⁣⁩⁥⁩⁥⁩ ⁨⁢⁥ ⁤⁨⁧⁥⁤ ⁩⁥⁠⁥⁢⁡⁠⁩⁥⁠ ⁢⁣⁠⁩⁣⁡ ⁦⁥⁥⁢
⁤⁩⁡⁢⁢⁨⁥
OMxWXh⁡⁦⁥⁦⁢⁦⁥⁩ hiKc3D58Ir⁦⁧⁡⁢ ⁣⁤⁩⁦⁨⁡⁦ ⁤⁥⁨⁩⁥⁡ ⁩⁡⁤⁣⁦⁩ ⁣⁤⁨⁣⁤⁣⁠⁧⁥⁨ ⁤⁠⁩⁠⁩⁤⁡ ⁥⁥⁤⁢⁨⁡⁥⁣ ⁠⁨⁣⁡⁦⁩⁠⁣⁧⁤⁣⁤⁠
    ⁨⁣⁡⁩⁤⁧⁩
⁦⁦⁧⁠⁡⁧⁠
⁩⁩⁡⁩⁨ ⁦⁧⁢⁥⁤⁠⁣ LdJ2mJEioC⁨⁣⁦⁢⁣ ⁣⁣⁥⁢⁠⁧⁡⁧⁠ ⁤⁣⁡⁩⁢ ⁨⁣⁠⁦⁡⁡
⁢⁢⁣⁥⁩⁣⁥⁥⁣
⁡⁡⁨⁨ ⁩⁦⁧⁢⁠⁥⁤⁤⁩⁧ ⁡⁥⁦⁦⁦⁡⁧ ⁧⁥⁨ 0m5W9j⁦⁨⁡⁦⁦⁠⁠ ⁢⁩⁨⁢⁨⁦ ⁧⁠⁣⁩⁨⁥⁩⁠⁠⁩ ⁠⁠⁤⁩⁧⁦⁨⁢⁩⁧⁡⁢⁩
⁥⁥⁣⁢⁨⁡⁤
⁧⁡⁥⁡⁥⁩⁧⁤ ⁨⁡⁢⁠⁤⁦⁥⁠⁦ ⁥⁩⁢⁥⁥⁥⁨ ⁡⁢ ⁥⁦⁩⁧⁧

⁡⁦⁣⁥⁤⁧⁡

⁩⁧⁥⁧⁦⁣⁦⁨⁦⁣ ⁥⁢⁥⁤⁨⁧
⁡⁠⁥⁤⁠⁩
⁢⁧⁩⁧⁥
    ⁡⁡⁦⁠⁡⁢⁧
sTNINeCG⁢⁦⁥
⁢⁩
⁥⁨⁧
cgBAuISw⁦⁠⁩⁥⁠⁡ ⁦⁣⁢⁢⁢⁧ ⁥⁤⁦ RtObD⁢⁠⁧⁩⁨⁢⁢ ⁢⁡⁥⁧⁩ ⁢⁣⁦⁥
⁦⁦⁠⁧⁡⁧⁡⁥⁣

⁢⁢⁣⁣⁥

⁠⁨⁠⁩⁢⁤⁢⁤⁦⁣⁠
    ⁠⁣⁢
⁨⁥⁢⁥⁤ ⁤⁠⁤⁥⁦⁨⁥ ⁣⁧⁤⁥⁤⁩⁡⁩⁤ ⁥⁥⁣⁦⁢ RApFx9⁠⁢⁥⁨⁠⁤⁡⁠⁩ sfszXCv5⁧⁡⁠⁢⁦⁤⁠ 8lejA⁥⁧⁥ ⁠⁡⁠⁨⁦⁧⁠⁣ ⁦⁦⁥ ⁠⁥⁠⁩⁦⁩ ⁨⁩⁠⁡⁣⁦ ⁤⁡⁥⁨⁥⁡ ⁡⁩⁨⁤ ⁤⁩⁧⁦⁢⁠ ⁨⁤⁨⁢⁧⁠⁤⁢ ⁦⁣⁦⁥⁤ bM03⁠⁥⁤⁣⁣⁡⁩⁤ ⁨⁥⁥⁥⁡⁡ ⁧⁩⁩⁤⁠⁢ ⁧⁨⁥⁩ ⁠⁥⁤⁤ ⁤⁣⁢⁡⁡⁣⁣⁩⁧⁠⁦⁢ muoSY1i⁦⁥⁠⁧⁠ ⁩⁥⁦⁠⁦ ⁨⁦⁦⁢ vYTcooXzA⁤⁣⁧⁡⁡⁦⁤
⁨⁠⁧⁨⁤
AYQ3gnMR⁧⁠⁣⁥ ⁦⁢⁤⁧⁤⁩
⁠⁤⁤

xDsToeNDG7⁥⁠⁢

⁧⁨⁥⁨


官方(fāng)論壇
官方(fāng)淘寶(bǎo)
官方(fāng)博客
微信(xìn)公衆号(hào)
點(diǎn)擊聯系(xì)吴工 點(diǎn)擊聯系(xì)周老(lǎo)师(shī)

【案(àn)例】BCD譯碼实現(xiàn)

發(fà)布(bù)时(shí)間(jiān):2023-04-13   作者(zhě):admin 浏覽量(liàng):

本(běn)文(wén)为(wèi)明(míng)德揚原創及(jí)录(lù)用(yòng)文(wén)章(zhāng),轉(zhuǎn)载請注明(míng)出(chū)处!


1.1 總(zǒng)體(tǐ)設計(jì)

1.1.1 概述

BCD碼(Binary-Coded Decimal‎),用(yòng)4位二(èr)進(jìn)制數来(lái)表(biǎo)示1位十(shí)進(jìn)制數中(zhōng)的(de)0~9这(zhè)10个(gè)數碼,是(shì)一(yī)種(zhǒng)二(èr)進(jìn)制的(de)數字(zì)編碼形式,用(yòng)二(èr)進(jìn)制編碼的(de)十(shí)進(jìn)制代(dài)碼。BCD碼这(zhè)種(zhǒng)編碼形式利用(yòng)了(le)四(sì)个(gè)位元(yuán)来(lái)儲存一(yī)个(gè)十(shí)進(jìn)制的(de)數碼,使二(èr)進(jìn)制和(hé)十(shí)進(jìn)制之間(jiān)的(de)轉(zhuǎn)換得以(yǐ)快(kuài)捷的(de)進(jìn)行。


1.1.2 設計(jì)目标(biāo)

实現(xiàn)BCD譯碼并顯示十(shí)進(jìn)制結果(guǒ)的(de)程序,具體(tǐ)功能(néng)要(yào)求如(rú)下(xià):

1. 串口(kǒu)發(fà)送8位十(shí)六(liù)進(jìn)制數給(gěi)FPGA;

2. FPGA接收(shōu)串口(kǒu)數據(jù)并对(duì)其進(jìn)行BCD譯碼;

3. 在(zài)數碼管(guǎn)上(shàng)以(yǐ)十(shí)進(jìn)制顯示串口(kǒu)發(fà)送的(de)數值。


1.1.3 系(xì)統結構框图(tú)

系(xì)統結構框图(tú)如(rú)下(xià)图(tú)一(yī)所(suǒ)示:

「每周FPGA案(àn)例」至(zhì)簡設計(jì)系(xì)列_BCD譯碼实現(xiàn)

图(tú)一(yī)


1.1.4模块(kuài)功能(néng)

  • 串口(kǒu)接收(shōu)模块(kuài)实現(xiàn)功能(néng)

1、 接收(shōu)上(shàng)位機(jī)PC發(fà)来(lái)的(de)位宽(kuān)为(wèi)8的(de)十(shí)六(liù)進(jìn)制數據(jù)。

  • BCD譯碼模块(kuài)实現(xiàn)功能(néng)

1、 对(duì)接收(shōu)到(dào)的(de)8位十(shí)六(liù)進(jìn)制數據(jù)進(jìn)行BCD譯碼。

  • 數碼管(guǎn)顯示模块(kuài)实現(xiàn)功能(néng)

1、 顯示BCD譯碼後(hòu)的(de)十(shí)進(jìn)制數值。


1.1.5頂层信(xìn)号(hào)

「每周FPGA案(àn)例」至(zhì)簡設計(jì)系(xì)列_BCD譯碼实現(xiàn)

1.1.6參考代(dài)碼

下(xià)面(miàn)是(shì)使用(yòng)工程的(de)頂层代(dài)碼:


module top(
    clk     ,
    rst_n   ,
    rx_uart ,
    seg_sel ,
    segment
    );

    parameter      DATA_W         =         8;
    parameter      SEG_WID        =         8;
    parameter      SEL_WID        =         3;
    parameter      BCD_OUT        =        12;

    input                clk      ;
    input                rst_n    ;
    input                rx_uart  ;

    output[SEL_WID-1:0]  seg_sel  ;
    output[SEG_WID-1:0]  segment  ;

    wire   [SEL_WID-1:0]  seg_sel  ;
    wire   [SEG_WID-1:0]  segment  ;

    wire  [DATA_W-1 :0]  rx_dout        ;
    wire                 rx_dout_vld    ;
    wire  [BCD_OUT-1:0]  bcd_dout       ;
    wire                 bcd_dout_vld   ;

    uart_rx     u1(
        .clk          (  clk             ),
        .rst_n        (  rst_n           ),
        .din          (  rx_uart         ),
        .dout         (  rx_dout         ),
        .dout_vld     (  rx_dout_vld     )
    );

    bcd_water   u2(
        .clk          (  clk             ),
        .rst_n        (  rst_n           ),
        .din          (  rx_dout         ),
        .din_vld      (  rx_dout_vld     ),
        .dout         (  bcd_dout        ),
        .dout_vld     (  bcd_dout_vld    )
    );

    seg_disp#(.SEG_NUM(SEL_WID))    u3(
        .clk          (  clk             ),
        .rst_n        (  rst_n           ),
        .din          (  bcd_dout        ),
        .din_vld      (  bcd_dout_vld    ),
        .seg_sel      (  seg_sel         ),
        .segment      (  segment         ) 
    );


endmodule


1.2 串口(kǒu)接收(shōu)模块(kuài)設計(jì)

1.2.1接口(kǒu)信(xìn)号(hào)

「每周FPGA案(àn)例」至(zhì)簡設計(jì)系(xì)列_BCD譯碼实現(xiàn)

1.2.2 設計(jì)思(sī)路(lù)

在(zài)前(qián)面(miàn)的(de)案(àn)例中(zhōng)已經(jīng)有(yǒu)串口(kǒu)接收(shōu)模块(kuài)的(de)介紹,所(suǒ)以(yǐ)这(zhè)里(lǐ)不(bù)在(zài)过(guò)多(duō)介紹,詳细(xì)介紹請看(kàn)下(xià)方(fāng)鍊(liàn)接:

http://www.fpgabbs.cn/forum.php?mod=viewthread&tid=1074&fromuid=100105


1.2.3參考代(dài)碼

module uart_rx(
    clk      ,
    rst_n    ,
    din      ,
    dout     ,
    dout_vld
    );

parameter          DATA_W = 8    ;
parameter          NUM_W  = 4    ;
parameter          CNT_W  = 14   ;
parameter               BPS          =        5208 ;        
parameter                BPS_P  = BPS/2;        

input               clk          ;                
input               rst_n        ;        
input               din          ;
output[DATA_W-1:0]  dout         ;                
output              dout_vld     ;

reg   [DATA_W-1:0]  dout         ;
reg                 dout_vld     ;
reg   [NUM_W-1 :0]  data_num     ;
reg   [DATA_W-1:0]  rx_temp_data ;
reg                 din_ff0      ;        
reg                 din_ff1      ;        
reg                 din_ff2      ;        
reg                 flag_add     ;
wire                end_cnt      ;
wire                end_cnt_p    ;
wire                add_data_num ;
wire                end_data_num ;

reg   [CNT_W-1:0]   cnt          ;        
wire                add_cnt      ;
always @ (posedge clk or negedge rst_n) begin
        if(!rst_n) begin
                din_ff0 <= 1'b1;
        din_ff1 <= 1'b1;
        din_ff2 <= 1'b1;
        end
        else begin
                din_ff0 <= din;
        din_ff1 <= din_ff0;
        din_ff2 <= din_ff1;
        end
end

always @ (posedge clk or negedge rst_n)begin
        if(!rst_n) begin
                flag_add <= 1'b0;
        end
        else if(din_ff2 & ~din_ff1) begin                
                flag_add <= 1'b1;        
        end
        else if(data_num==4'd8&&end_cnt) begin                
                flag_add <= 1'b0;        
        end
end

always @ (posedge clk or negedge rst_n)begin
    if(!rst_n)begin
        cnt <= 0;
    end
    else if(add_cnt)begin
        if(end_cnt)begin
            cnt <= 0;         
        end
        else begin
            cnt <= cnt+1'b1; 
        end
    end
    else begin
        cnt <= 0; 
    end
end
assign add_cnt = flag_add;
assign end_cnt = add_cnt && cnt == BPS-1;



always @(posedge clk or negedge rst_n) begin 
    if (rst_n==0) begin
        data_num <= 0; 
    end
    else if(add_data_num) begin
        if(end_data_num)
            data_num <= 0; 
        else
            data_num <= data_num+1 ;
   end
end
assign add_data_num = end_cnt;
assign end_data_num = add_data_num  && data_num == 9-1 ;

always @ (posedge clk or negedge rst_n)begin
        if(!rst_n) begin
                dout <= 8'd0;
        end
        else if(add_cnt && cnt==BPS_P-1 && data_num!=0) begin                
            dout<={din,{dout[7:1]}};
        end
    else begin
        dout<=dout; 
    end
end

always @ (posedge clk or negedge rst_n)begin
        if(!rst_n) begin
                dout_vld <= 1'b0;
        end
    else if(add_data_num && data_num == 4'd8) begin                
                dout_vld <= 1'b1;        
        end
        else begin        
        dout_vld <= 1'b0;                        
        end
end
endmodule


1.3 BCD譯碼模块(kuài)設計(jì)

1.3.1接口(kǒu)信(xìn)号(hào)

「每周FPGA案(àn)例」至(zhì)簡設計(jì)系(xì)列_BCD譯碼实現(xiàn)

1.3.2設計(jì)思(sī)路(lù)

  • 左(zuǒ)移加3算法

此(cǐ)处二(èr)進(jìn)制轉(zhuǎn) BCD 碼的(de)硬(yìng)件(jiàn)实現(xiàn),采用(yòng)左(zuǒ)移加 3 的(de)算法,具體(tǐ)描述如(rú)下(xià):(此(cǐ)处以(yǐ) 8-bit 二(èr)進(jìn)制碼为(wèi)例)

1、左(zuǒ)移要(yào)轉(zhuǎn)換的(de)二(èr)進(jìn)制碼 1 位

2、左(zuǒ)移之後(hòu),BCD 碼分(fēn)别置于(yú)百(bǎi)位、十(shí)位、个(gè)位

3、如(rú)果(guǒ)移位後(hòu)所(suǒ)在(zài)的(de) BCD 碼列大于(yú)或(huò)等于(yú) 5,則对(duì)該值加 3

4、繼續左(zuǒ)移的(de)过(guò)程直(zhí)至(zhì)全(quán)部(bù)移位完成(chéng)

舉例:将十(shí)六(liù)進(jìn)制碼 0xFF 轉(zhuǎn)換成(chéng) BCD 碼

「每周FPGA案(àn)例」至(zhì)簡設計(jì)系(xì)列_BCD譯碼实現(xiàn)

1.3.3參考代(dài)碼

module bcd_water(
        clk     ,
        rst_n   ,
        din     ,
        din_vld ,
        dout    ,
        dout_vld
    );
input                   clk                 ;
input                   rst_n               ;
input       [ 7:0]      din                 ;
input                   din_vld             ;
output      [11:0]      dout                ;
wire        [11:0]      dout                ;
output                  dout_vld            ;
wire                    dout_vld            ;
reg         [19:0]      din_temp            ;
reg         [19:0]      din_temp_ff0        ;
reg         [19:0]      din_temp_ff1        ;
reg         [19:0]      din_temp_ff2        ;
reg         [19:0]      din_temp_ff3        ;
reg         [19:0]      din_temp_ff4        ;
wire        [20:0]      din_shift_temp      ;
wire        [20:0]      din_shift_temp_ff0  ;
wire        [20:0]      din_shift_temp_ff1  ;
wire        [20:0]      din_shift_temp_ff2  ;
wire        [20:0]      din_shift_temp_ff3  ;
wire        [ 7:0]      din_a_temp          ;
wire        [ 3:0]      din_b_temp          ;
wire        [ 3:0]      din_c_temp          ;
wire        [ 3:0]      din_d_temp          ;
wire        [ 7:0]      din_add_a_temp      ;
wire        [ 3:0]      din_add_b_temp      ;
wire        [ 3:0]      din_add_c_temp      ;
wire        [ 3:0]      din_add_d_temp      ;

wire        [ 7:0]      din_a_temp_ff0      ;
wire        [ 3:0]      din_b_temp_ff0      ;
wire        [ 3:0]      din_c_temp_ff0      ;
wire        [ 3:0]      din_d_temp_ff0      ;
wire        [ 7:0]      din_a_temp_ff1      ;
wire        [ 3:0]      din_b_temp_ff1      ;
wire        [ 3:0]      din_c_temp_ff1      ;
wire        [ 3:0]      din_d_temp_ff1      ;
wire        [ 7:0]      din_a_temp_ff2      ;
wire        [ 3:0]      din_b_temp_ff2      ;
wire        [ 3:0]      din_c_temp_ff2      ;
wire        [ 3:0]      din_d_temp_ff2      ;
wire        [ 7:0]      din_a_temp_ff3      ;
wire        [ 3:0]      din_b_temp_ff3      ;
wire        [ 3:0]      din_c_temp_ff3      ;
wire        [ 3:0]      din_d_temp_ff3      ;
wire        [ 7:0]      din_add_a_temp_ff0  ;
wire        [ 3:0]      din_add_b_temp_ff0  ;
wire        [ 3:0]      din_add_c_temp_ff0  ;
wire        [ 3:0]      din_add_d_temp_ff0  ;
wire        [ 7:0]      din_add_a_temp_ff1  ;
wire        [ 3:0]      din_add_b_temp_ff1  ;
wire        [ 3:0]      din_add_c_temp_ff1  ;
wire        [ 3:0]      din_add_d_temp_ff1  ;
wire        [ 7:0]      din_add_a_temp_ff2  ;
wire        [ 3:0]      din_add_b_temp_ff2  ;
wire        [ 3:0]      din_add_c_temp_ff2  ;
wire        [ 3:0]      din_add_d_temp_ff2  ;
wire        [ 7:0]      din_add_a_temp_ff3  ;
wire        [ 3:0]      din_add_b_temp_ff3  ;
wire        [ 3:0]      din_add_c_temp_ff3  ;
wire        [ 3:0]      din_add_d_temp_ff3  ;
reg                     dout_vld_temp       ;
reg                     dout_vld_temp_ff0   ;
reg                     dout_vld_temp_ff1   ;
reg                     dout_vld_temp_ff2   ;
reg                     dout_vld_temp_ff3   ;
reg                     dout_vld_temp_ff4   ;
         
always  @(posedge clk or negedge rst_n)begin
    if(rst_n==1'b0)begin
        din_temp <= 20'b0;
    end
    else if(din_vld)begin
        din_temp <= {9'b0,din,3'b0};
    end
end
always  @(posedge clk or negedge rst_n)begin
    if(rst_n==1'b0)begin
        dout_vld_temp <= 1'b0;
    end
    else if(din_vld)begin
        dout_vld_temp <= 1'b1;
    end
    else begin
        dout_vld_temp <= 1'b0;
    end
end
assign  din_a_temp     = din_temp[ 7: 0]                                                     ;
assign  din_b_temp     = din_temp[11: 8]                                                     ;
assign  din_c_temp     = din_temp[15:12]                                                     ;
assign  din_d_temp     = din_temp[19:16]                                                     ;
assign  din_add_a_temp = din_a_temp                                                          ;
assign  din_add_b_temp = din_b_temp + ((din_b_temp>=5)?4'd3:4'd0)                            ;
assign  din_add_c_temp = din_c_temp + ((din_c_temp>=5)?4'd3:4'd0)                            ;
assign  din_add_d_temp = din_d_temp + ((din_d_temp>=5)?4'd3:4'd0)                            ;
assign  din_shift_temp = {din_add_d_temp,din_add_c_temp,din_add_b_temp,din_add_a_temp,1'b0}  ;


always  @(posedge clk or negedge rst_n)begin
    if(rst_n==1'b0)begin
        din_temp_ff0 <= 20'b0;
    end
    else begin
        din_temp_ff0 <= din_shift_temp[19:0];

    end
end
always  @(posedge clk or negedge rst_n)begin
    if(rst_n==1'b0)begin
        dout_vld_temp_ff0 <= 1'b0 ;
    end
    else begin
        dout_vld_temp_ff0 <= dout_vld_temp;
    end
end
assign  din_a_temp_ff0     = din_temp_ff0[ 7: 0]                                             ;
assign  din_b_temp_ff0     = din_temp_ff0[11: 8]                                             ;
assign  din_c_temp_ff0     = din_temp_ff0[15:12]                                             ;
assign  din_d_temp_ff0     = din_temp_ff0[19:16]                                             ;
assign  din_add_a_temp_ff0 = din_a_temp_ff0                                                  ;
assign  din_add_b_temp_ff0 = din_b_temp_ff0 + ((din_b_temp_ff0>=5)?4'd3:4'd0)                ;
assign  din_add_c_temp_ff0 = din_c_temp_ff0 + ((din_c_temp_ff0>=5)?4'd3:4'd0)                ;
assign  din_add_d_temp_ff0 = din_d_temp_ff0 + ((din_d_temp_ff0>=5)?4'd3:4'd0)                ;
assign  din_shift_temp_ff0 = {din_add_d_temp_ff0,din_add_c_temp_ff0,din_add_b_temp_ff0,din_add_a_temp_ff0,1'b0};


always  @(posedge clk or negedge rst_n)begin
    if(rst_n==1'b0)begin
        din_temp_ff1 <= 20'b0;
    end
    else begin
        din_temp_ff1 <= din_shift_temp_ff0[19:0];
    end
end
always  @(posedge clk or negedge rst_n)begin
    if(rst_n==1'b0)begin
        dout_vld_temp_ff1 <= 1'b0;
    end
    else begin
        dout_vld_temp_ff1 <= dout_vld_temp_ff0;
    end
end
assign  din_a_temp_ff1     = din_temp_ff1[ 7: 0]                                             ;
assign  din_b_temp_ff1     = din_temp_ff1[11: 8]                                             ;
assign  din_c_temp_ff1     = din_temp_ff1[15:12]                                             ;
assign  din_d_temp_ff1     = din_temp_ff1[19:16]                                             ;
assign  din_add_a_temp_ff1 = din_a_temp_ff1                                                  ;
assign  din_add_b_temp_ff1 = din_b_temp_ff1 + ((din_b_temp_ff1>=5)?4'd3:4'd0)                ;
assign  din_add_c_temp_ff1 = din_c_temp_ff1 + ((din_c_temp_ff1>=5)?4'd3:4'd0)                ;
assign  din_add_d_temp_ff1 = din_d_temp_ff1 + ((din_d_temp_ff1>=5)?4'd3:4'd0)                ;
assign  din_shift_temp_ff1 = {din_add_d_temp_ff1,din_add_c_temp_ff1,din_add_b_temp_ff1,din_add_a_temp_ff1,1'b0};


always  @(posedge clk or negedge rst_n)begin 
    if(rst_n==1'b0)begin
        din_temp_ff2 <= 20'b0;
    end
    else begin
        din_temp_ff2 <= din_shift_temp_ff1[19:0];
    end
end
always  @(posedge clk or negedge rst_n)begin 
    if(rst_n==1'b0)begin
        dout_vld_temp_ff2 <= 1'b0;
    end
    else begin
        dout_vld_temp_ff2 <= dout_vld_temp_ff1;
    end
end
assign  din_a_temp_ff2     = din_temp_ff2[ 7: 0]                                             ;
assign  din_b_temp_ff2     = din_temp_ff2[11: 8]                                             ;
assign  din_c_temp_ff2     = din_temp_ff2[15:12]                                             ;
assign  din_d_temp_ff2     = din_temp_ff2[19:16]                                             ;
assign  din_add_a_temp_ff2 = din_a_temp_ff2                                                  ;
assign  din_add_b_temp_ff2 = din_b_temp_ff2 + ((din_b_temp_ff2>=5)?4'd3:4'd0)                ;
assign  din_add_c_temp_ff2 = din_c_temp_ff2 + ((din_c_temp_ff2>=5)?4'd3:4'd0)                ;
assign  din_add_d_temp_ff2 = din_d_temp_ff2 + ((din_d_temp_ff2>=5)?4'd3:4'd0)                ;
assign  din_shift_temp_ff2 = {din_add_d_temp_ff2,din_add_c_temp_ff2,din_add_b_temp_ff2,din_add_a_temp_ff2,1'b0};


always  @(posedge clk or negedge rst_n)begin
    if(rst_n==1'b0)begin
        din_temp_ff3 <= 20'b0;
    end
    else begin
        din_temp_ff3 <= din_shift_temp_ff2[19:0];
    end
end
always  @(posedge clk or negedge rst_n)begin
    if(rst_n==1'b0)begin
        dout_vld_temp_ff3 <= 1'b0;
    end
    else begin
        dout_vld_temp_ff3 <= dout_vld_temp_ff2;
    end
end
assign  din_a_temp_ff3     = din_temp_ff3[ 7: 0]                                             ;
assign  din_b_temp_ff3     = din_temp_ff3[11: 8]                                             ;
assign  din_c_temp_ff3     = din_temp_ff3[15:12]                                             ;
assign  din_d_temp_ff3     = din_temp_ff3[19:16]                                             ;
assign  din_add_a_temp_ff3 = din_a_temp_ff3                                                  ;
assign  din_add_b_temp_ff3 = din_b_temp_ff3 + ((din_b_temp_ff3>=5)?4'd3:4'd0)                ;
assign  din_add_c_temp_ff3 = din_c_temp_ff3 + ((din_c_temp_ff3>=5)?4'd3:4'd0)                ;
assign  din_add_d_temp_ff3 = din_d_temp_ff3 + ((din_d_temp_ff3>=5)?4'd3:4'd0)                ;
assign  din_shift_temp_ff3 = {din_add_d_temp_ff3,din_add_c_temp_ff3,din_add_b_temp_ff3,din_add_a_temp_ff3,1'b0};


always  @(posedge clk or negedge rst_n)begin
    if(rst_n==1'b0)begin
        din_temp_ff4 <= 20'b0;
    end
    else begin
        din_temp_ff4 <= din_shift_temp_ff3[19:0];
    end
end
always  @(posedge clk or negedge rst_n)begin
    if(rst_n==1'b0)begin
        dout_vld_temp_ff4 <= 1'b0;
    end
    else begin
        dout_vld_temp_ff4 <= dout_vld_temp_ff3;
    end
end
assign  dout     = din_temp_ff4[19:8];
assign  dout_vld = dout_vld_temp_ff4 ;


endmodule


1.4 數碼管(guǎn)顯示模块(kuài)設計(jì)


1.4.1接口(kǒu)信(xìn)号(hào)

「每周FPGA案(àn)例」至(zhì)簡設計(jì)系(xì)列_BCD譯碼实現(xiàn)

1.4.2設計(jì)思(sī)路(lù)

在(zài)前(qián)面(miàn)的(de)案(àn)例中(zhōng)已經(jīng)有(yǒu)數碼管(guǎn)顯示的(de)介紹,所(suǒ)以(yǐ)这(zhè)里(lǐ)不(bù)在(zài)过(guò)多(duō)介紹,詳细(xì)介紹請看(kàn)下(xià)方(fāng)鍊(liàn)接:

http://fpgabbs.com/forum.php?mod=viewthread&tid=399


1.4.3參考代(dài)碼

module  seg_disp(
                 rst_n       ,
                 clk         ,
                 din         ,
                 din_vld     ,
                 seg_sel     ,
                 segment      
             );


parameter  DATA_IN        =       12          ;
parameter  TIME_30MS      =       15000        ;
parameter  SEG_WID        =       8           ;
parameter  SEG_NUM        =       8           ;
parameter  CNT_WID        =       10          ;

parameter  NUM_0          =       8'b1100_0000;
parameter  NUM_1          =       8'b1111_1001;
parameter  NUM_2          =       8'b1010_0100;
parameter  NUM_3          =       8'b1011_0000;
parameter  NUM_4          =       8'b1001_1001;
parameter  NUM_5          =       8'b1001_0010;
parameter  NUM_6          =       8'b1000_0010;
parameter  NUM_7          =       8'b1111_1000;
parameter  NUM_8          =       8'b1000_0000;
parameter  NUM_9          =       8'b1001_0000;
parameter  NUM_ERR        =       8'b1111_1111;


input                             clk         ;
input                             rst_n       ;
input  [DATA_IN - 1:0]            din         ;
input                             din_vld     ;

output [SEG_NUM - 1:0]            seg_sel     ;
output [SEG_WID - 1:0]            segment     ;

reg    [SEG_NUM - 1:0]            seg_sel     ;
reg    [SEG_WID - 1:0]            segment     ;

reg    [ 31    :    0]            cnt_30us      ;
reg    [SEG_NUM - 1:0]            sel_cnt     ;

reg    [ 4 - 1 :    0]            seg_tmp     ;

wire                              add_cnt_30us  ;
wire                              end_cnt_30us  ;
wire                              add_sel_cnt ;
wire                              end_sel_cnt ;


always @(posedge clk or negedge rst_n) begin 
    if (rst_n==0) begin
        cnt_30us <= 0; 
    end
    else if(add_cnt_30us) begin
        if(end_cnt_30us)
            cnt_30us <= 0; 
        else
            cnt_30us <= cnt_30us+1 ;
   end
end
assign add_cnt_30us = 1;
assign end_cnt_30us = add_cnt_30us  && cnt_30us == TIME_30MS-1 ;


always  @(posedge clk or negedge rst_n)begin
    if(rst_n==1'b0)begin
        sel_cnt <= 0;
    end
    else if(add_sel_cnt)begin
        if(end_sel_cnt)
            sel_cnt <= 0;
        else
            sel_cnt <= sel_cnt + 1;
    end
end
assign add_sel_cnt = end_cnt_30us;
assign end_sel_cnt = add_sel_cnt && sel_cnt == SEG_NUM-1;

always  @(posedge clk or negedge rst_n)begin
    if(rst_n==1'b0)begin
        seg_sel <= {SEG_NUM{1'b1}};
    end
    else begin
        seg_sel <= ~(1'b1 << sel_cnt);
    end
end



always  @(posedge clk or negedge rst_n)begin
    if(rst_n==1'b0)begin
        seg_tmp <= 0;
    end
    else begin
        seg_tmp <= din[4*(sel_cnt+1)-1 -:4];
    end
end




always@(posedge clk or negedge rst_n)begin
    if(rst_n==1'b0)begin
        segment<=NUM_0;
    end
    else  begin
        case (seg_tmp)
            0 : segment <= NUM_0;
            1 : segment <= NUM_1;
            2 : segment <= NUM_2;
            3 : segment <= NUM_3;
            4 : segment <= NUM_4;
            5 : segment <= NUM_5;
            6 : segment <= NUM_6;
            7 : segment <= NUM_7;
            8 : segment <= NUM_8;
            9 : segment <= NUM_9;
            default : segment <= NUM_ERR;
        endcase
    end
end

endmodule


1.5 效果(guǒ)和(hé)總(zǒng)結

Ø 下(xià)图(tú)是(shì)該工程在(zài)db603開(kāi)發(fà)板上(shàng)的(de)現(xiàn)象(xiàng)——串口(kǒu)發(fà)送數據(jù)8’h93,數碼管(guǎn)顯示12’d147。

「每周FPGA案(àn)例」至(zhì)簡設計(jì)系(xì)列_BCD譯碼实現(xiàn)


「每周FPGA案(àn)例」至(zhì)簡設計(jì)系(xì)列_BCD譯碼实現(xiàn)


Ø 下(xià)图(tú)是(shì)該工程在(zài)mp801試验(yàn)箱上(shàng)的(de)現(xiàn)象(xiàng)——串口(kǒu)發(fà)送數據(jù)8’he9,數碼管(guǎn)顯示12’d233。

「每周FPGA案(àn)例」至(zhì)簡設計(jì)系(xì)列_BCD譯碼实現(xiàn)


「每周FPGA案(àn)例」至(zhì)簡設計(jì)系(xì)列_BCD譯碼实現(xiàn)


Ø 下(xià)图(tú)是(shì)該工程在(zài)ms980試验(yàn)箱上(shàng)的(de)現(xiàn)象(xiàng)——串口(kǒu)發(fà)送數據(jù)8’h52,數碼管(guǎn)顯示12’d082。

「每周FPGA案(àn)例」至(zhì)簡設計(jì)系(xì)列_BCD譯碼实現(xiàn)


「每周FPGA案(àn)例」至(zhì)簡設計(jì)系(xì)列_BCD譯碼实現(xiàn)


由(yóu)于(yú)該項目的(de)上(shàng)板現(xiàn)象(xiàng)是(shì)串口(kǒu)發(fà)送8位的(de)十(shí)六(liù)進(jìn)制數經(jīng)过(guò)BCD譯碼後(hòu),在(zài)數碼管(guǎn)上(shàng)顯示对(duì)應(yìng)的(de)十(shí)進(jìn)制數值,想(xiǎng)观看(kàn)完整現(xiàn)象(xiàng)的(de)朋友可(kě)以(yǐ)看(kàn)一(yī)下(xià)上(shàng)板演示的(de)視頻。

本(běn)案(àn)例設計(jì)教学視頻和(hé)工程源碼,請到(dào)明(míng)德揚論壇学習。

感(gǎn)興趣的(de)朋友也(yě)可(kě)以(yǐ)訪問(wèn)明(míng)德揚論壇進(jìn)行FPGA相關(guān)工程設計(jì)学習,也(yě)可(kě)以(yǐ)看(kàn)一(yī)下(xià)我(wǒ)们(men)往期(qī)的(de)文(wén)章(zhāng):

《基于(yú)FPGA的(de)密碼鎖設計(jì)》

《波(bō)形相位頻率可(kě)調DDS信(xìn)号(hào)發(fà)生(shēng)器》

《基于(yú)FPGA的(de)曼徹斯特(tè)編碼解(jiě)碼設計(jì)》

《基于(yú)FPGA的(de)出(chū)租車計(jì)費系(xì)統》

《數電(diàn)基礎與(yǔ)Verilog設計(jì)》

《基于(yú)FPGA的(de)頻率、電(diàn)壓测量(liàng)》

《基于(yú)FPGA的(de)漢明(míng)碼編碼解(jiě)碼設計(jì)》

《關(guān)于(yú)鎖存器問(wèn)題(tí)的(de)讨論》

《阻塞賦值與(yǔ)非(fēi)阻塞賦值》

《參數例化(huà)时(shí)自(zì)動(dòng)計(jì)算位宽(kuān)的(de)解(jiě)決辦(bàn)法》


明(míng)德揚是(shì)一(yī)家(jiā)專注于(yú)FPGA領域的(de)專業性(xìng)公司,公司主(zhǔ)要(yào)業务包(bāo)括開(kāi)發(fà)板、教育培訓、項目承接、人(rén)才服(fú)务等多(duō)个(gè)方(fāng)向(xiàng)。點(diǎn)撥開(kāi)發(fà)板——学習FPGA的(de)入(rù)門(mén)之選。
MP801開(kāi)發(fà)板——千(qiān)兆(zhào)网(wǎng)、ADDA、大容量(liàng)SDRAM等,学習和(hé)項目需求一(yī)步到(dào)位。网(wǎng)絡培訓班——不(bù)管(guǎn)时(shí)間(jiān)和(hé)空間(jiān),明(míng)德揚随时(shí)在(zài)你身(shēn)邊(biān),助你快(kuài)速学習FPGA。周末(mò)培訓班——明(míng)天(tiān)的(de)你会(huì)感(gǎn)激現(xiàn)在(zài)的(de)努力進(jìn)取(qǔ),升(shēng)職加薪明(míng)德揚来(lái)助你。就(jiù)業培訓班——七(qī)大企業級項目实訓,獲得豐富的(de)項目經(jīng)验(yàn),高(gāo)薪就(jiù)業。專題(tí)課程——高(gāo)手(shǒu)修煉課:提(tí)升(shēng)設計(jì)能(néng)力;实用(yòng)調試技巧課:提(tí)升(shēng)定(dìng)位和(hé)解(jiě)決問(wèn)題(tí)能(néng)力;FIFO架構設計(jì)課:助你快(kuài)速成(chéng)为(wèi)架構設計(jì)师(shī);时(shí)序約束(shù)、數字(zì)信(xìn)号(hào)处理、PCIE、綜合項目实踐課等你来(lái)選。項目承接——承接企業FPGA研發(fà)項目。人(rén)才服(fú)务——提(tí)供人(rén)才推薦、人(rén)才代(dài)培、人(rén)才派遣等服(fú)务。

下(xià)一(yī)篇(piān):【案(àn)例】 簡易計(jì)算器
   拓展(zhǎn)閱读(dú)
⁩⁣⁩⁨ ⁩⁤⁢⁢⁢⁥⁩ ⁥⁣⁦⁡ ⁣⁤⁨ ⁡⁨⁠⁤⁠ ⁦⁧⁡⁤⁣⁡⁡⁨⁤ NrEnE8Gui⁤⁥⁧⁦⁦⁡⁧
⁢⁢⁦⁡⁩⁢⁡
⁣⁧⁡⁤ ⁦⁥⁣⁣ ⁦⁩⁣⁥⁥⁤⁢⁢⁨ ⁥⁤⁦⁢⁦⁦⁠⁠ ⁠⁣ ⁩⁡⁠⁢⁦⁢ J2JwAm⁤⁦⁨⁣⁢⁤⁦⁨ ⁢⁦⁤⁦⁤⁡⁩ ⁧⁨⁨ ⁡⁠⁥⁡⁥⁢⁣ XjPR4LJxih⁧⁨⁦⁠⁥⁧⁩⁠⁥ ⁦⁤⁠⁦⁧⁨⁤⁩
⁦⁢⁨⁤
⁢⁠⁤⁦⁨

⁩⁩⁡

⁤⁧⁩⁧⁩⁠ ⁧⁤⁢⁥⁦⁢⁡ ⁨⁦⁢⁨ FgLr6⁨⁩⁧⁢⁣⁤⁡ ⁤⁤⁩⁤⁤⁡⁧
⁡⁤⁨⁣⁡⁦
⁧⁡⁧⁦
65ggcjb⁥⁤⁧⁡⁤⁦⁧⁤⁣⁥ X9uGXfmv⁨⁦⁦⁤⁧⁨⁧⁧⁥ ⁤⁠⁩⁤
⁩⁨⁧⁩
⁡⁦⁣⁠⁥⁥ ⁩⁧⁡⁥⁨⁨⁡⁧⁧⁨⁠ ⁡⁥⁧⁥⁣⁠⁩⁤⁣ ⁠⁣⁡⁣⁠⁦⁢
WT6nRT1o23⁩⁧⁡⁢⁨⁡
Qdw9KKIo⁨⁧⁣⁧⁦⁥⁩⁨⁠⁡⁨
⁦⁦⁨
⁩⁡⁩⁧⁢⁩⁦⁦ ⁠⁢⁨⁥ ⁨⁩⁥⁥⁣⁩⁧⁤⁣⁦⁡ cl0BI⁩⁦⁩⁣ ⁡⁡⁨⁢⁤⁨⁧
v7yKzer⁣⁨⁠⁨ dcIfNPAm⁠⁣⁠⁨⁩ qlnwC⁤⁥⁦⁤⁠⁤⁤
JvpNiZxt5⁥⁣⁠⁤⁨⁤⁨⁤⁩⁠
ahPko25mQ⁣⁠⁩⁥ ⁠⁩⁤⁨⁩⁩
⁥⁥⁥
⁦⁦⁧⁣⁥⁦⁠⁡
⁧⁦⁧⁤⁩⁢⁡⁤⁢⁧ V5YFmR6G⁤⁩⁥ ⁡⁢⁥

⁧⁨⁡⁩⁣⁡⁥

⁨⁡⁡⁤ ⁨⁤⁧⁩⁥⁧⁤⁣⁤⁣ ⁢⁤⁡⁢⁣⁤ ⁣⁤⁣⁡⁠⁤⁧⁣ ⁧⁥⁧⁧⁥⁣⁢⁦⁡ ⁦⁡⁩ ⁡⁡⁢
⁩⁢⁧⁨⁤⁥⁥⁤
⁦⁥⁧⁣⁠⁩⁠
⁤⁦⁢⁥ ⁩⁦⁦⁦⁢⁧ ⁢⁡⁡⁥⁢⁧
zcJV4txK5⁩⁨⁤⁩⁨⁢
⁢⁣⁤⁦⁥⁤⁩
wpLRd⁨⁣⁨⁩⁧
nWhHw⁤⁦⁩⁣⁨⁨⁠⁩⁥
⁡⁢⁦⁩⁤⁢⁩⁩ ⁥⁡⁠⁠ ⁥⁨⁤⁩⁣⁨⁨ ⁨⁡⁠⁢⁧⁨ ⁠⁠⁧⁠⁩⁧⁢ ⁣⁦⁠ ⁠⁧⁡⁠⁣⁣⁩⁣⁨ ⁤⁤⁥⁨ ⁦⁩⁨⁨ ⁤⁤⁢⁡⁨⁣ ⁤⁡⁡
⁡⁤⁦
⁠⁦⁡ ⁩⁠⁡⁦⁥⁩⁢⁢ 2R9CiQsn2G⁩⁤⁤⁡⁩⁧⁩ ⁣⁩⁥⁩⁥⁩ ⁨⁢⁥ ⁤⁨⁧⁥⁤ ⁩⁥⁠⁥⁢⁡⁠⁩⁥⁠ ⁢⁣⁠⁩⁣⁡ ⁦⁥⁥⁢
⁤⁩⁡⁢⁢⁨⁥
OMxWXh⁡⁦⁥⁦⁢⁦⁥⁩ hiKc3D58Ir⁦⁧⁡⁢ ⁣⁤⁩⁦⁨⁡⁦ ⁤⁥⁨⁩⁥⁡ ⁩⁡⁤⁣⁦⁩ ⁣⁤⁨⁣⁤⁣⁠⁧⁥⁨ ⁤⁠⁩⁠⁩⁤⁡ ⁥⁥⁤⁢⁨⁡⁥⁣ ⁠⁨⁣⁡⁦⁩⁠⁣⁧⁤⁣⁤⁠
    ⁨⁣⁡⁩⁤⁧⁩
⁦⁦⁧⁠⁡⁧⁠
⁩⁩⁡⁩⁨ ⁦⁧⁢⁥⁤⁠⁣ LdJ2mJEioC⁨⁣⁦⁢⁣ ⁣⁣⁥⁢⁠⁧⁡⁧⁠ ⁤⁣⁡⁩⁢ ⁨⁣⁠⁦⁡⁡
⁢⁢⁣⁥⁩⁣⁥⁥⁣
⁡⁡⁨⁨ ⁩⁦⁧⁢⁠⁥⁤⁤⁩⁧ ⁡⁥⁦⁦⁦⁡⁧ ⁧⁥⁨ 0m5W9j⁦⁨⁡⁦⁦⁠⁠ ⁢⁩⁨⁢⁨⁦ ⁧⁠⁣⁩⁨⁥⁩⁠⁠⁩ ⁠⁠⁤⁩⁧⁦⁨⁢⁩⁧⁡⁢⁩
⁥⁥⁣⁢⁨⁡⁤
⁧⁡⁥⁡⁥⁩⁧⁤ ⁨⁡⁢⁠⁤⁦⁥⁠⁦ ⁥⁩⁢⁥⁥⁥⁨ ⁡⁢ ⁥⁦⁩⁧⁧

⁡⁦⁣⁥⁤⁧⁡

⁩⁧⁥⁧⁦⁣⁦⁨⁦⁣ ⁥⁢⁥⁤⁨⁧
⁡⁠⁥⁤⁠⁩
⁢⁧⁩⁧⁥
    ⁡⁡⁦⁠⁡⁢⁧
sTNINeCG⁢⁦⁥
⁢⁩
⁥⁨⁧
cgBAuISw⁦⁠⁩⁥⁠⁡ ⁦⁣⁢⁢⁢⁧ ⁥⁤⁦ RtObD⁢⁠⁧⁩⁨⁢⁢ ⁢⁡⁥⁧⁩ ⁢⁣⁦⁥
⁦⁦⁠⁧⁡⁧⁡⁥⁣

⁢⁢⁣⁣⁥

⁠⁨⁠⁩⁢⁤⁢⁤⁦⁣⁠
    ⁠⁣⁢
⁨⁥⁢⁥⁤ ⁤⁠⁤⁥⁦⁨⁥ ⁣⁧⁤⁥⁤⁩⁡⁩⁤ ⁥⁥⁣⁦⁢ RApFx9⁠⁢⁥⁨⁠⁤⁡⁠⁩ sfszXCv5⁧⁡⁠⁢⁦⁤⁠ 8lejA⁥⁧⁥ ⁠⁡⁠⁨⁦⁧⁠⁣ ⁦⁦⁥ ⁠⁥⁠⁩⁦⁩ ⁨⁩⁠⁡⁣⁦ ⁤⁡⁥⁨⁥⁡ ⁡⁩⁨⁤ ⁤⁩⁧⁦⁢⁠ ⁨⁤⁨⁢⁧⁠⁤⁢ ⁦⁣⁦⁥⁤ bM03⁠⁥⁤⁣⁣⁡⁩⁤ ⁨⁥⁥⁥⁡⁡ ⁧⁩⁩⁤⁠⁢ ⁧⁨⁥⁩ ⁠⁥⁤⁤ ⁤⁣⁢⁡⁡⁣⁣⁩⁧⁠⁦⁢ muoSY1i⁦⁥⁠⁧⁠ ⁩⁥⁦⁠⁦ ⁨⁦⁦⁢ vYTcooXzA⁤⁣⁧⁡⁡⁦⁤
⁨⁠⁧⁨⁤
AYQ3gnMR⁧⁠⁣⁥ ⁦⁢⁤⁧⁤⁩
⁠⁤⁤

xDsToeNDG7⁥⁠⁢

⁧⁨⁥⁨