欧美性猛交xxxx免费看_牛牛在线视频国产免费_天堂草原电视剧在线观看免费_国产粉嫩高清在线观看_国产欧美日本亚洲精品一5区

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于H7的曼徹斯特編碼/解碼/串口系統(tǒng)設(shè)計(jì)

HME京微齊力 ? 來(lái)源:HME京微齊力 ? 2023-07-02 10:43 ? 次閱讀

前言

四月到現(xiàn)在一直比較忙,有一段時(shí)間沒(méi)有做京微齊力器件的開(kāi)發(fā)了,本次做一個(gè)新器件 H7 的曼徹斯特(編碼&解碼&通信)系統(tǒng)。

方案講解

關(guān)于曼徹斯特編碼

曼徹斯特編碼(Manchester coding),又稱(chēng)自同步碼、相位編碼(phase encoding,PE),能夠用信號(hào)的變化來(lái)保持發(fā)送設(shè)備和接收設(shè)備之間的同步。

值得一提的是,曼徹斯特編碼有兩種截然相反的約定:

它用電壓的變化來(lái)分辨0和1,從高電平到低電平的跳變代表1,而從低電平到高電平的跳變代表0(G.E.Tomas編碼方式)。

從高電平到低電平的跳變代表0,而從低電平到高電平的跳變代表1(IEEE 802.3編碼方式),信號(hào)的保持不會(huì)超過(guò)一個(gè)比特位的時(shí)間間隔。即使是0或1的序列,信號(hào)也將在每個(gè)時(shí)間間隔的中間發(fā)生跳變。這種跳變將允許接收設(shè)備的時(shí)鐘與發(fā)送設(shè)備的時(shí)鐘保持一致。

兩種曼徹斯特編碼:

ca04cc90-1731-11ee-962d-dac502259ad0.png

優(yōu)點(diǎn):

與 NRZ 相比,曼徹斯特編碼提供一種同步機(jī)制,保證發(fā)送端與接收端信號(hào)同步。

缺點(diǎn):

曼徹斯特編碼的頻率要比 NRZ 高一倍,傳輸?shù)攘繑?shù)據(jù)所需的帶寬大一倍。

編碼:

曼徹斯特編碼是將時(shí)鐘和數(shù)據(jù)包含在信號(hào)流中,在傳輸代碼信息的同時(shí),也將時(shí)鐘同步信號(hào)一起傳輸?shù)綄?duì)方。曼徹斯特碼是用“01”和“10”來(lái)表示普通二進(jìn)制數(shù)據(jù)中的“1””和“0”的,因此在實(shí)際電路設(shè)計(jì)中,我們可以用采一個(gè)2選1數(shù)字選擇器來(lái)完成此項(xiàng)功能。(IEEE 802.3編碼方式)

ca4dbbe4-1731-11ee-962d-dac502259ad0.png

解碼:

曼徹斯特譯碼電路設(shè)計(jì)的目的,是如何準(zhǔn)確地從曼徹斯特碼的碼流中提取出“10”和“01”信號(hào),并將其轉(zhuǎn)換成普通二進(jìn)制編碼中的“0”和“1”。

在實(shí)際設(shè)計(jì)電路中,可以采用一個(gè)緩存器,保存上一個(gè)時(shí)鐘采集到的信號(hào)和當(dāng)前時(shí)鐘采集到的信號(hào),當(dāng)緩存器的內(nèi)容是“01”時(shí),輸出“1”;當(dāng)緩存器的內(nèi)容是“10”時(shí),輸出“0”;當(dāng)緩存器的內(nèi)容是“00”或“11”時(shí),輸出維持不變。

ca5e4d7e-1731-11ee-962d-dac502259ad0.png

曼徹斯特編碼在 FPGA 領(lǐng)域的運(yùn)用比較廣泛:

以太網(wǎng):在以太網(wǎng)中,曼徹斯特編碼被用來(lái)將數(shù)據(jù)轉(zhuǎn)換為數(shù)字信號(hào),并通過(guò)物理媒介(如同軸電纜或光纖)傳輸。

遠(yuǎn)程控制系統(tǒng):在無(wú)線遙控器中,曼徹斯特編碼被用來(lái)將指令編碼并通過(guò)無(wú)線信道發(fā)送給接收器。

工業(yè)自動(dòng)化系統(tǒng):在工業(yè)自動(dòng)化系統(tǒng)中,曼徹斯特編碼被用來(lái)將傳感器測(cè)量值、控制信號(hào)等轉(zhuǎn)換為數(shù)字信號(hào),并通過(guò)數(shù)據(jù)總線傳輸。

汽車(chē)電子系統(tǒng):在汽車(chē)電子系統(tǒng)中,曼徹斯特編碼被用來(lái)將控制信號(hào)、傳感器信號(hào)等轉(zhuǎn)換為數(shù)字信號(hào),并通過(guò)汽車(chē)網(wǎng)絡(luò)傳輸。

曼徹斯特編碼的時(shí)鐘線與數(shù)據(jù)線結(jié)合一體,同步性高,錯(cuò)誤檢測(cè)性能好,去年在接觸屏顯項(xiàng)目的時(shí)候,便是用到了這一編碼。

任務(wù)&實(shí)驗(yàn)效果

用兩塊 FPGA 開(kāi)發(fā)板設(shè)計(jì)一個(gè)曼徹斯特碼編碼和解碼系統(tǒng);

第1塊板負(fù)責(zé)在按鍵后將撥碼開(kāi)關(guān)撥出的8位二進(jìn)制碼用曼徹斯特碼發(fā)出;

第2塊板負(fù)責(zé)在收到曼徹斯特碼號(hào)將其解析并在數(shù)碼管上顯示。兩塊板記得共地。(也可以用 debugware 進(jìn)行波形讀取)

進(jìn)入正文前,先看實(shí)驗(yàn)效果:

京微齊力:基于H7的曼徹斯特(編碼&解碼&串口)系統(tǒng)

可以看到,H7 端按下發(fā)送鍵后,第二塊開(kāi)發(fā)板,接收到信號(hào)并進(jìn)行解碼,結(jié)果(1111_0000)顯示在8位數(shù)碼管上。(具體過(guò)程請(qǐng)看程序解析)

硬件選擇

1、H7P20N0L176-M2H1

本次實(shí)驗(yàn)使用 H7 作為主控板,HME-H7 系列采用低功耗22nm 技術(shù),集成了高性能 ARM Cortex-M3 MCU(頻率高達(dá)300M)、外圍設(shè)備與大容量片上 SRAM。本次實(shí)驗(yàn)只使用邏輯部分,后面根據(jù)需要再擴(kuò)展 MCU 實(shí)驗(yàn)。

ca69fae8-1731-11ee-962d-dac502259ad0.png

H7 具有12K的6輸入查找表,1個(gè) OSC(80Mhz片內(nèi)振蕩器),128個(gè) 10x10 DSP 模塊,18個(gè)32K x 32位 SRAM,擁有多個(gè)封裝,能夠兼容Altera 的 EP4CE10 和 Xilinx Spartan-6,適用于伺候電機(jī)、圖像處理及通信網(wǎng)絡(luò)等多種場(chǎng)景。

ca8b1d4a-1731-11ee-962d-dac502259ad0.jpg

2、XC7A35TFGG484-2

因?yàn)?H7 板卡沒(méi)有數(shù)碼管,這里借助一塊 Spartan-7 板卡展示實(shí)驗(yàn)效果。(如果沒(méi)有多余板載數(shù)碼管的開(kāi)發(fā)板,可以使用 FUXI 軟件的 debugware IP 進(jìn)行波形觀看)

ca96e4ea-1731-11ee-962d-dac502259ad0.png

程序設(shè)計(jì)

1、頂層模塊

本模塊,實(shí)現(xiàn)的是 H7 對(duì) tx_data(8’b11110000)進(jìn)行編碼,按下按鍵(tx_en_n)后,會(huì)以 UART 的方式發(fā)送數(shù)據(jù)到第2塊開(kāi)發(fā)板 (這里模擬一個(gè)通信的效果,如果有 Lora 模塊的同學(xué),可以接上模塊,這樣就實(shí)現(xiàn)了無(wú)線通信)。關(guān)于編碼部分,原本是計(jì)劃使用撥碼開(kāi)關(guān)來(lái)模擬需要發(fā)送的8bit數(shù)據(jù),但是板卡沒(méi)有撥碼開(kāi)關(guān),這里例化的時(shí)候,直接對(duì)端口進(jìn)行賦值。程序里仍保留了撥碼開(kāi)關(guān)接口,有需要的同學(xué),可以自行例化。

1 //************Message***************//
2 //技術(shù)交流[email protected]
3 //關(guān)注CSDN博主:“千歌嘆盡執(zhí)夏”
4 //Author: 千歌嘆盡執(zhí)夏
5 //All rights reserved
6 //-------------------------------
7 // Target Devices: H7P20N0L176-M2H1
8 // Tool Versions: Fuxi 2023.1
9 // File name: hme_manchester
10 // Last modified Date: 2023年6月27日2000
11 // Last Version: V1.1
12 // Descriptions: 曼徹斯特解碼&編碼&串口
13 //-------------------------------------
14 //***********************************//
15
16 module hme_manchester(
17 input sys_clk, //高頻時(shí)鐘,可以是50MHz,本次入20MHz
18 input rst_n,
19 input rx_d, //接收到的bit數(shù)據(jù)(本實(shí)驗(yàn)支持回環(huán))
20 output tx_d, //將tx_data進(jìn)行編碼并以串口方式發(fā)送出去
21 //發(fā)送使能
22 input tx_en_n,//發(fā)送使能,使用按鍵控制
23 input [7:0] tx_data,//發(fā)送的8bits數(shù)據(jù),撥碼開(kāi)關(guān)控制
24 output sh_cp, //串行數(shù)據(jù)輸出
25 output st_cp, //移位寄存器的時(shí)鐘輸出
26 output ds //存儲(chǔ)寄存器的時(shí)鐘輸出
27 );
28
29 wire [7:0] rx_data;
30 wire rx_valid;
31 reg [7:0] rx_data_dis; //最終顯示的接收數(shù)據(jù)
32 wire [7:0] sel; //數(shù)碼管位選(選擇當(dāng)前要顯示的數(shù)碼管)
33 wire [6:0] seg; //數(shù)碼管段選(當(dāng)前要顯示的內(nèi)容)
34
35 pll_v1 u_pll_v1(
36 .clkin0 (sys_clk), //輸入20MHz時(shí)鐘
37 .locked (),
38 .clkout0 (clk) //輸出50MHz時(shí)鐘
39 );
40
41
42
43 manchester_tx u_manchester_tx_0(
44 .clk(clk), //高頻時(shí)鐘,可以是50MHz
45 .rst_n(rst_n),
46 //.tx_data(tx_data), //待發(fā)送的字節(jié)數(shù)據(jù)
47 .tx_data(8'b11110000), //由于板卡上沒(méi)有撥碼開(kāi)關(guān),這里直接輸入數(shù)據(jù)進(jìn)行模擬
48 .tx_en(!tx_en_n), //發(fā)送使能
49 .tx_ready(),
50 .tx_d(tx_d)
51 );
52 //如果沒(méi)有兩塊板卡的,可以將manchester_tx的tx_d信號(hào)接到manchester_rx的rx_d
53 //形成回環(huán)實(shí)驗(yàn),并利用debugware進(jìn)行數(shù)據(jù)查看。
54 manchester_rx u_manchester_rx_0(
55 .clk(clk), //高頻時(shí)鐘,可以是50MHz
56 .rst_n(rst_n),
57 .rx_d(rx_d), //接收到的bit數(shù)據(jù)
58 //.rx_d(tx_d), //回環(huán)實(shí)驗(yàn)
59 .rx_data(rx_data),
60 .rx_valid(rx_valid)
61 );
62
63 always@(posedge clk or negedge rst_n)
64 begin
65 if(!rst_n)
66 rx_data_dis <= 8'd0;
67 else
68 rx_data_dis <= rx_valid?rx_data:rx_data_dis;

69 end

70

71

72 HC595_driver u_HC595_driver(
73 .clk(clk),
74 .reset_n(rst_n),
75 .data({1'd0,seg,sel}),
76 .s_en(1'b1),
77 .sh_cp(sh_cp),
78 .st_cp(st_cp),
79 .ds(ds)
80 );
81
82 Hex8 u_Hex8(
83 .clk(clk),
84 .reset_n(rst_n),
85 .en(1'b1),

86 .disp_data({3'd0,rx_data_dis[7],3'd0,rx_data_dis[6],3'd0,rx_data_dis[5],3'd0,rx_data_dis[4],3'd0,rx_data_dis[3],3'd0,rx_data_dis[2],3'd0,rx_data_dis[1],3'd0,rx_data_dis[0]}),
87 .sel(sel),
88 .seg(seg)
89 );
90 //使用debugware查看編碼&解碼波形
91 debugware_v2_1 u_debugware_v2_1(
92 .trig_out_0 (),
93 .data_in_0

94 ({tx_en_n,tx_d,rx_data}),
.ref_clk_0 (clk)
95 );
96
97 endmodule

2、編碼&發(fā)送模塊

本模塊,對(duì)需要發(fā)送的8bit數(shù)據(jù)進(jìn)行曼徹斯特編碼,并以串口的方式發(fā)送出去(波特率9600)。

首先,當(dāng)復(fù)位信號(hào) rst_n 為低電平時(shí),將會(huì)執(zhí)行 if(rst_n==1’b0) 語(yǔ)句中的代碼,對(duì)模塊中的所有寄存器進(jìn)行初始化。

接著,在每一個(gè)時(shí)鐘周期的上升沿,如果時(shí)鐘倍頻使能信號(hào) clk_bps_en 為真,則將執(zhí)行 case(state)語(yǔ)句中當(dāng)前狀態(tài)下對(duì)應(yīng)的代碼。

當(dāng)狀態(tài)機(jī)處于 IDLE 狀態(tài)時(shí),如果 tx_en 為真,則需要開(kāi)始發(fā)送數(shù)據(jù)。此時(shí),需要將狀態(tài)切換為 TXS,將要發(fā)送的數(shù)據(jù)寫(xiě)入 tx_data_reg,設(shè)置 tx_ready_r 為低電平,并將 tx_cnt 設(shè)置為0。

當(dāng)狀態(tài)機(jī)處于 TXS 狀態(tài)時(shí),需要根據(jù)已經(jīng)發(fā)送的數(shù)據(jù)字節(jié)數(shù) tx_cnt 來(lái)進(jìn)行數(shù)據(jù)編碼,同時(shí)更新 tx_ready_r、tx_d_r 和 tx_data_reg 的值。

具體編碼過(guò)程如下:

當(dāng) tx_cnt 為 0 時(shí),需要發(fā)送兩個(gè)高電平(1bit 數(shù)據(jù)編制成 2bit 數(shù)據(jù))。當(dāng) tx_cnt 的值在 [1, 8] 之間時(shí),需要按照 Manchester 編碼方式編碼數(shù)據(jù)并發(fā)送出去。

具體操作如下:

根據(jù) tx_data_reg 的最高位來(lái)計(jì)算當(dāng)前發(fā)送的是01還是10。如果最高位為1,則當(dāng)前發(fā)送的是01,否則當(dāng)前發(fā)送的是10。對(duì)于 tx_cnt 中的每一位(從右往左數(shù)),如果是0,則發(fā)送的是10,否則發(fā)送的是01。

將 tx_data_reg 向左移動(dòng)一位,為下一次計(jì)算做準(zhǔn)備。

當(dāng) tx_cnt 的值大于8時(shí),需要發(fā)送一個(gè)低電平,因此將 tx_d_r 設(shè)置為低電平。

如果 tx_cnt 達(dá)到了指定長(zhǎng)度(這里是19),則需要重新將狀態(tài)切換為 IDLE,設(shè)置 tx_ready_r 為高電平,并將 tx_cnt 設(shè)置為0。

1 //************Message***************//
2 //技術(shù)交流:[email protected]
3 //關(guān)注CSDN博主:“千歌嘆盡執(zhí)夏”
4 //Author: 千歌嘆盡執(zhí)夏
5 //All rights reserved
6 //-------------------------------
7 // Target Devices: H7P20N0L176-M2H1
8 // Tool Versions: Fuxi 2023.1
9 // File name: manchester_tx
10 // Last modified Date: 2023年6月17日900
11 // Last Version: V1.1
12 // Descriptions 編碼&發(fā)送模塊模塊

13 //-------------------------------------
14 //***********************************//
15 module manchester_tx(

16 input clk, //高頻時(shí)鐘,可以是50MHz

17 input rst_n,

18 input [7:0] tx_data,//待發(fā)送的字節(jié)數(shù)據(jù)

19 input tx_en, //發(fā)送使能

20 output tx_ready,

21 output tx_d

22 );

23 parameter IDLE = 1'b0;//空閑狀態(tài)

24 parameter TXS = 1'b1;//發(fā)送狀態(tài)

25 reg tx_ready_r;

26 reg tx_d_r;

27 reg state;

28 reg [4:0] tx_cnt;//發(fā)送的bits計(jì)數(shù)器

29 reg [7:0] tx_data_reg;

30 wire clk_bps_en;

31 assign tx_ready = tx_ready_r;

32 assign tx_d = tx_d_r;
33 precise_divider//分頻模塊

34 #(

35 //DEVIDE_CNT = 85.89934592 * fo @50M

36 //DEVIDE_CNT = 42.94967296 * fo @100M

37 .DEVIDE_CNT(32'd1649267)//9600Hz * 2

38 )u_precise_divider_0

39 (

40 //global clock

41 .clk(clk),

42 .rst_n(rst_n),

43
44 //user interface

45 //.divide_clk()

46 .divide_clken(clk_bps_en)

47 );

48 always@(posedge clk or negedge rst_n)

49 begin

50 if(rst_n == 1'b0)

51 begin

52 state <= IDLE;

53 tx_ready_r <= 1'b1;

54 tx_d_r <= 1'b0;
55 tx_data_reg <= 8'd0;

56 tx_cnt <= 5'd0;

57 end
58 else if(clk_bps_en)

59 begin

60 case(state)

61 IDLE:begin

62 state <= tx_en?TXS:IDLE;

63 tx_data_reg <= tx_en?tx_data:tx_data_reg;

64 tx_ready_r <= tx_en?1'b0:1'b1;

65 tx_cnt <= 5'd0;

66 end

67 TXS:begin
68 tx_cnt <= (tx_cnt >= 5'd19)?5'd0:tx_cnt+1'b1;

69 state <= (tx_cnt >= 5'd19)?IDLE:TXS;

70 tx_ready_r <= (tx_cnt >= 5'd19)?1'b1:1'b0;

71 if(tx_cnt[4:1] == 4'd0)

72 tx_d_r <= 1'b1;//發(fā)2個(gè)高電平

73 else if(tx_cnt[4:1] <= 4'd8)

74 begin

75 //如果tx_data_reg[7]的值為1,則將tx_cnt[0]的值賦給tx_d_r;

76 //否則將tx_cnt[0]的邏輯反值(即0變成1,1變成0)賦給tx_d_r。

77 tx_d_r <= tx_data_reg[7]?tx_cnt[0]:!tx_cnt[0];//1--01 0--10

78 tx_data_reg <= tx_cnt[0]?(tx_data_reg<<1):tx_data_reg;

79 end

80 else begin

81 tx_d_r <= 1'b0;

82 end

83 end

84 endcase

85 end

86 end

87 endmodule
88

3、解碼&接收模塊

接收到的串行數(shù)據(jù)進(jìn)行解串行化,然后進(jìn)行解碼。

解碼與編碼原理差不多,這里不做贅述。

1 //*********** Message **********//
2 //技術(shù)交流:[email protected]
3 //關(guān)注CSDN博主:“千歌嘆盡執(zhí)夏”
4 //Author: 千歌嘆盡執(zhí)夏
5 //All rights reserved
6 //----------------------------------------
7 // Target Devices: H7P20N0L176-M2H1
8 // Tool Versions: Fuxi 2023.1
9 // File name: manchester_rx
10 // Last modified Date: 2023年6月18日1500
11 // Last Version: V1.1
12 // Descriptions: 解碼&接收模塊
13 //--------------------------------------------------------
14 //********************************************************************//
15 module manchester_rx(
16 input clk, //高頻時(shí)鐘,可以是50MHz
17 input rst_n,
18 input rx_d, //接收到的bit數(shù)據(jù)
19 output [7:0] rx_data,
20 output rx_valid
21 );
22
23 parameter IDLE = 1'b0;//空閑狀態(tài)
24 parameter RXS = 1'b1;//接收狀態(tài)
25 reg state;
26 reg rx_valid_r0,rx_valid_r;
27 reg [15:0] rx_data_reg;//緩存16bits的rx數(shù)據(jù),每2bits代表1bit數(shù)據(jù)//01:1 10:0
28 reg [7:0] rx_data_r;
29 wire [7:0] rx_data_w;
30 wire clk_bps_en;
31 reg [3:0] rx_cnt;//對(duì)16倍波特率的時(shí)鐘計(jì)數(shù)
32 reg [3:0] byte_cnt;//對(duì)已接收的字節(jié)計(jì)數(shù)
33 assign rx_data = rx_data_r;
34 assign rx_valid = rx_valid_r;
35
36 //將一組長(zhǎng)度為16的串行數(shù)據(jù)rx_data_reg轉(zhuǎn)換成一組長(zhǎng)度為8的并行數(shù)據(jù)rx_data_w,
37 //即將接收到的串行數(shù)據(jù)進(jìn)行解串行化。
38 generate
30 genvar i;
40 for(i=0;i<8;i=i+1) begin:u1
41 assign rx_data_w[i] = !rx_data_reg[i*2+1] && rx_data_reg[i*2];
42 end
43 endgenerate
44
45 precise_divider//分頻模塊
46 #(
47 //DEVIDE_CNT = 85.89934592 * fo @50M
48 //DEVIDE_CNT = 42.94967296 * fo @100M
49 .DEVIDE_CNT(32'd13194139) //9600Hz * 16
50 )u_precise_divider_0
51 (
52 //global clock
53 .clk(clk),
54 .rst_n(rst_n),
55
56 //user interface
57 //.divide_clk()
58 .divide_clken(clk_bps_en)
59 );
60
61 always@(posedge clk or negedge rst_n)
62 begin
63 if(rst_n == 1'b0)
64 begin
65 rx_data_r <= 8'd0;
66 rx_valid_r <= 1'b0;
67 end
68 else
69 begin
70 rx_data_r <= rx_data_w;
71 rx_valid_r <= rx_valid_r0;
72 end
73 end
74 always@(posedge clk or negedge rst_n)
75 begin
76 if(rst_n == 1'b0)
77 begin
78 state <= IDLE;
79 rx_data_reg <= 16'd0;
80
81 rx_cnt <= 4'd0;
82 byte_cnt <= 4'd0;
83 rx_valid_r0 <= 1'b0;
84 end
85 else if(clk_bps_en)
86 begin
87 case(state)
88 IDLE:begin
89 rx_cnt <= rx_d?(rx_cnt >= 4'd10)?4'd0:rx_cnt+1'b1:
90 4'd0
91 ;
92 state <= (rx_cnt >= 4'd10)?RXS:IDLE;
93 rx_data_reg <= 16'd0;
94 byte_cnt <= 4'd0;
95 rx_valid_r0 <= 1'b0;
96 end
97 RXS:begin
98 rx_cnt <= (rx_cnt >= 4'd7)?4'd0:rx_cnt+1'b1;
99 if(rx_cnt >= 4'd7)
100 rx_data_reg <= {rx_data_reg[14:0],rx_d};
101 else
102 rx_data_reg <= rx_data_reg;
103 byte_cnt <= (rx_cnt >= 4'd7)?byte_cnt+1'b1:byte_cnt;
104 state <= ((rx_cnt >= 4'd7) && byte_cnt == 4'd15)?IDLE:RXS;
105 rx_valid_r0 <= ((rx_cnt >= 4'd7) && byte_cnt == 4'd15);
106 end
107 endcase
108 end
109 end
110 endmodule
111

4、HC595驅(qū)動(dòng)模塊

第二塊板卡的電路設(shè)計(jì)用到了芯片 74HC595,該芯片的作用是移位寄存器,通過(guò)移位的方式,節(jié)省 FPGA 的管腳。FPGA 只需要輸出3個(gè)管腳,即可達(dá)到發(fā)送數(shù)碼管數(shù)據(jù)的目的,與傳統(tǒng)的選位選方式相比,大大節(jié)省了 IO 設(shè)計(jì)資源。(考慮到部分同學(xué),只有普通的8段數(shù)碼管模塊,沒(méi)有74HC595,在文末會(huì)添加傳統(tǒng)的數(shù)碼管驅(qū)動(dòng)代碼,方便大家做兼容設(shè)計(jì))。

1 //************Message ***************//
2 //技術(shù)交流:[email protected]
3 //關(guān)注CSDN博主:“千歌嘆盡執(zhí)夏”
4 //Author: 千歌嘆盡執(zhí)夏

5 //All rights reserved

6 //---------------------------------------------------------

7 // Target Devices: H7P20N0L176-M2H1
8 // Tool Versions: Fuxi 2023.1
9 // File name: HC595_driver
10 // Last modified Date: 2023年6月11日2000
11 // Last Version: V1.1
12 // Descriptions: 驅(qū)動(dòng)HC595,發(fā)出數(shù)據(jù)和選通信號(hào)
13 //--------------------------------------------------------
14//*******************************************************************************//
15 module HC595_driver(
16 clk,
17 reset_n,
18 data,
19 s_en,
20
21 sh_cp,
22 st_cp,
23 ds
24 );
25
26 input clk;
27 input reset_n;
28 input [15:0]data;
29 input s_en;
30
31 output reg sh_cp;
32 output reg st_cp;
33 output reg ds;
34
35 assign reset=~reset_n;
36 parameter CNT_MAX = 2;
37
38 reg [15:0]r_data;
39 always@(posedge clk)
40 if(s_en)
41 r_data <= data;
42
43 reg [7:0]divider_cnt;//分頻計(jì)數(shù)器;
44
45 always@(posedge clk or posedge reset)
46 if(reset)
47 divider_cnt <= 0;
48 else if(divider_cnt == CNT_MAX - 1'b1)
49 divider_cnt <= 0;
50 else
51 divider_cnt <= divider_cnt + 1'b1;
52
53 wire sck_plus;
54 assign sck_plus = (divider_cnt == CNT_MAX - 1'b1);
55
56 reg [5:0]SHCP_EDGE_CNT;
57
58 always@(posedge clk or posedge reset)
59 if(reset)
60 SHCP_EDGE_CNT <= 0;
61 else if(sck_plus)begin
62 if(SHCP_EDGE_CNT == 6'd32)
63 SHCP_EDGE_CNT <= 0;
64 else
65 SHCP_EDGE_CNT <= SHCP_EDGE_CNT + 1'b1;
66 end
67 else
68 SHCP_EDGE_CNT <= SHCP_EDGE_CNT;
69
70 always@(posedge clk or posedge reset)
71 if(reset)begin
72 st_cp <= 1'b0;
73 ds <= 1'b0;
74 sh_cp <= 1'd0;
75 end
76 else begin
77 case(SHCP_EDGE_CNT)
78 0: begin sh_cp <= 0; st_cp <= 1'd0;ds <= r_data[15];end
79 1: begin sh_cp <= 1; st_cp <= 1'd0;end
80 2: begin sh_cp <= 0; ds <= r_data[14];end
81 3: begin sh_cp <= 1; end
82 4: begin sh_cp <= 0; ds <= r_data[13];end?? ?
83 5: begin sh_cp <= 1; end
84 6: begin sh_cp <= 0; ds <= r_data[12];end?? ?
85 7: begin sh_cp <= 1; end
86 8: begin sh_cp <= 0; ds <= r_data[11];end?? ?
87 9: begin sh_cp <= 1; end
88 10: begin sh_cp <= 0; ds <= r_data[10];end?? ?
89 11: begin sh_cp <= 1; end
90 12: begin sh_cp <= 0; ds <= r_data[9];end?? ?
91 13: begin sh_cp <= 1; end
92 14: begin sh_cp <= 0; ds <= r_data[8];end?? ?
93 15: begin sh_cp <= 1; end
94 16: begin sh_cp <= 0; ds <= r_data[7];end?? ?
95 17: begin sh_cp <= 1; end
96 18: begin sh_cp <= 0; ds <= r_data[6];end?? ?
97 19: begin sh_cp <= 1; end
98 20: begin sh_cp <= 0; ds <= r_data[5];end?? ?
99 21: begin sh_cp <= 1; end
100 22: begin sh_cp <= 0; ds <= r_data[4];end?? ?
101 23: begin sh_cp <= 1; end
102 24: begin sh_cp <= 0; ds <= r_data[3];end?? ?
103 25: begin sh_cp <= 1; end
104 26: begin sh_cp <= 0; ds <= r_data[2];end?? ?
105 27: begin sh_cp <= 1; end
106 28: begin sh_cp <= 0; ds <= r_data[1];end?? ??? ??? ?
107 29: begin sh_cp <= 1; end
108 30: begin sh_cp <= 0; ds <= r_data[0];end
109 31: begin sh_cp <= 1; end
110 32: st_cp <= 1'd1;
111 default:
112 begin
113 st_cp <= 1'b0;
114 ds <= 1'b0;
115 sh_cp <= 1'd0;
116 end
117 endcase
118 end
119
120 endmodule
121

5、段選&位選模塊

cac0b702-1731-11ee-962d-dac502259ad0.png

2個(gè)共陽(yáng)極的7段4位數(shù)碼管,采用動(dòng)態(tài)掃描的顯示方式,即輪流向各位數(shù)碼管送出字形碼和相應(yīng)的位選,利用發(fā)光管的余輝和人眼視覺(jué)暫留作用,使人的感覺(jué)好像各位數(shù)碼管同時(shí)都在顯示。

比較簡(jiǎn)單的數(shù)碼管段選、位選模塊,這里不做贅述。

1 //************* Message *************//
2 //技術(shù)交流:[email protected]
3 //關(guān)注CSDN博主:“千歌嘆盡執(zhí)夏”
4 //Author: 千歌嘆盡執(zhí)夏
5 //All rights reserved

6 //---------------------------------------------------------
7 // Target Devices: H7P20N0L176-M2H1
8 // Tool Versions: Fuxi 2023.1
9 // File name: Hex8
10 // Last modified Date: 2023年6月11日1300
11 // Last Version: V1.1
12 // Descriptions: 分頻信號(hào),段選和位選信號(hào)生成,輸出需要顯示的數(shù)據(jù)、段選和位選值
13 //--------------------------------------------------------
14//****************************************************************************************//
15 module Hex8(
16 clk,
17 reset_n,
18 en,
19 disp_data,
20 sel,
21 seg
22);
23 assign reset=~reset_n;
24 input clk; //50M
25 input reset_n;
26 input en; //數(shù)碼管顯示使能,1使能,0關(guān)閉
27
28 input [31:0]disp_data;
29
30 output [7:0] sel;//數(shù)碼管位選(選擇當(dāng)前要顯示的數(shù)碼管)
31 output reg [6:0] seg;//數(shù)碼管段選(當(dāng)前要顯示的內(nèi)容)
32
33 reg [14:0]divider_cnt;//25000-1
34
35 reg clk_1K;
36 reg [7:0]sel_r;
37
38 reg [3:0]data_tmp;//數(shù)據(jù)緩存
39
40// 分頻計(jì)數(shù)器計(jì)數(shù)模塊
41 always@(posedge clk or posedge reset)
42 if(reset)
43 divider_cnt <= 15'd0;
44 else if(!en)
45 divider_cnt <= 15'd0;
46 else if(divider_cnt == 24999)
47 divider_cnt <= 15'd0;
48 else
49 divider_cnt <= divider_cnt + 1'b1;
50
51 //1K掃描時(shí)鐘生成模塊
52 always@(posedge clk or posedge reset)
53 if(reset)
54 clk_1K <= 1'b0;
55 else if(divider_cnt == 24999)
56 clk_1K <= ~clk_1K;
57 else
58 clk_1K <= clk_1K;
59
60 //8位循環(huán)移位寄存器
61 always@(posedge clk_1K or posedge reset)
62 if(reset)
63 sel_r <= 8'b0000_0001;
64 else if(sel_r == 8'b1000_0000)
65 sel_r <= 8'b0000_0001;
66 else
67 sel_r <=? sel_r << 1;
68
69 always@(*)
70 case(sel_r)
71 8'b0000_0001:data_tmp = disp_data[3:0];
72 8'b0000_0010:data_tmp = disp_data[7:4];
73 8'b0000_0100:data_tmp = disp_data[11:8];
74 8'b0000_1000:data_tmp = disp_data[15:12];
75 8'b0001_0000:data_tmp = disp_data[19:16];
76 8'b0010_0000:data_tmp = disp_data[23:20];
77 8'b0100_0000:data_tmp = disp_data[27:24];
78 8'b1000_0000:data_tmp = disp_data[31:28];
79 default:data_tmp = 4'b0000;
80 endcase
81
82 always@(*)
83 case(data_tmp)
84 4'h0:seg = 7'b1000000;
85 4'h1:seg = 7'b1111001;
86 4'h2:seg = 7'b0100100;
87 4'h3:seg = 7'b0110000;
88 4'h4:seg = 7'b0011001;
89 4'h5:seg = 7'b0010010;
90 4'h6:seg = 7'b0000010;
91 4'h7:seg = 7'b1111000;
92 4'h8:seg = 7'b0000000;
93 4'h9:seg = 7'b0010000;
94 endcase
95
96 assign sel = (en)?sel_r:8'b0000_0000;
97
98 endmodule
99

五debugware 回環(huán)實(shí)驗(yàn)

本節(jié)適用于只有一塊板卡的同學(xué),將發(fā)送模塊的 tx_d 信號(hào)接到接收模塊的 rx_d 信號(hào),形成回環(huán)實(shí)驗(yàn),并調(diào)用 debugware 進(jìn)行數(shù)據(jù)分析。

1 //如果沒(méi)有兩塊板卡的,可以將 manchester_tx 的 tx_d 信號(hào)接到 manchester_rx 的 rx_d

2 //形成回環(huán)實(shí)驗(yàn),并利用debugware進(jìn)行數(shù)據(jù)查看。

3 manchester_rx u_manchester_rx_0(

4 .clk(clk), //高頻時(shí)鐘,可以是50MHz
5 .rst_n(rst_n),
6 //.rx_d(rx_d), //接收到的bit數(shù)據(jù)7 .rx_d(tx_d)//回環(huán)實(shí)驗(yàn)

8 .rx_data(rx_data),

9 .rx_valid(rx_valid)

10 );

例化一個(gè) debugware IP:

cae2327e-1731-11ee-962d-dac502259ad0.png

1 //使用debugware查看編碼&解碼波形

2 debugware_v2_1 u_debugware_v2_1(

3 .trig_out_0(),

4 .data_in_0({tx_en_n,tx_d,rx_data_dis}),//數(shù)據(jù)拼接

5 .ref_clk_0(clk)

6 );

從 debugware 的波形看,使能按鍵按下后,編碼模塊將預(yù)留的數(shù)據(jù)進(jìn)行編碼并以串口的形式發(fā)送,rx_data_dis 顯示解碼后的數(shù)據(jù)。

caffd2f2-1731-11ee-962d-dac502259ad0.png

兼容設(shè)計(jì)

4.4節(jié)提到,為了方便只有傳統(tǒng)數(shù)碼管模塊的同學(xué)進(jìn)行設(shè)計(jì),這里提供了傳統(tǒng)的數(shù)碼管驅(qū)動(dòng)模塊。

cb24aa5a-1731-11ee-962d-dac502259ad0.png

1 module hme_manchester(
2 //其他信號(hào)-略
3 //數(shù)碼管
4 output [6:0] odata0,odata1,odata2,odata3,odata4,odata5,odata6,odata7
5 );
6 //其他模塊-略-自行復(fù)制補(bǔ)充
7
8 HEX HEX_u(
9 .idata({3'd0,rx_data_dis[7],3'd0,rx_data_dis[6],3'd0,rx_data_dis[5],3'd0,rx_data_dis[4],3'd0,rx_data_dis[3],3'd0,rx_data_dis[2],3'd0,rx_data_dis[1],3'd0,rx_data_dis[0]}),
10 .rst(1'b1),
11 .clk(clk),
12 .odata0(odata0),
13 .odata1(odata1),
14 .odata2(odata2),
15 .odata3(odata3),
16 .odata4(odata4),
17 .odata5(odata5),
18 .odata6(odata6),
19 .odata7(odata7)
20 );
21 endmodule

1 module HEX(idata,rst,clk,odata0,odata1,odata2,odata3,odata4,odata5,odata6,odata7);
2 input [31:0] idata ;
3 input clk,rst;
4 output [6:0] odata0,odata1,odata2,odata3,odata4,odata5,odata6,odata7;
5 wire [6:0] d0,d1,d2,d3,d4,d5,d6,d7;
6 reg [6:0] odata0_r,odata1_r,odata2_r,odata3_r,odata4_r,odata5_r,odata6_r,odata7_r;
7
8 assign odata0=odata0_r;
9 assign odata1=odata1_r;
10 assign odata2=odata2_r;
11 assign odata3=odata3_r;
12 assign odata4=odata4_r;
13 assign odata5=odata5_r;
14 assign odata6=odata6_r;
15 assign odata7=odata7_r;
16 SHEX SHEX0 (.idata(idata[3:0]),
17 .rst(rst),
18 .clk(clk),
19 .odata(d0));
20 SHEX SHEX1 (.idata(idata[7:4]),
21 .rst(rst),
22 .clk(clk),
23 .odata(d1));
24 SHEX SHEX2 (.idata(idata[11:8]),
25 .rst(rst),
26 .clk(clk),
27 .odata(d2));
28 SHEX SHEX3 (.idata(idata[15:12]),
29 .rst(rst),
30 .clk(clk),
31 .odata(d3));
32 SHEX SHEX4 (.idata(idata[19:16]),
33 .rst(rst),
34 .clk(clk),
35 .odata(d4));
36 SHEX SHEX5 (.idata(idata[23:20]),
37 .rst(rst),
38 .clk(clk),
39 .odata(d5));
40 SHEX SHEX6 (.idata(idata[27:24]),
41 .rst(rst),
42 .clk(clk),
43 .odata(d6));
44 SHEX SHEX7 (.idata(idata[31:28]),
45 .rst(rst),
46 .clk(clk),
47 .odata(d7));
48 always@(posedge clk or negedge rst)
49 begin
50 if(rst==1'b0)
51 begin
52 odata0_r<=7'd0;
53 odata1_r<=7'd0;
54 odata2_r<=7'd0;
55 odata3_r<=7'd0;
56 odata4_r<=7'd0;
57 odata5_r<=7'd0;
58 odata6_r<=7'd0;
59 odata7_r<=7'd0;
60 end
61 else
62 begin
63 odata0_r<=d0;
64 odata1_r<=d1;
65 odata2_r<=d2;
66 odata3_r<=d3;
67 odata4_r<=d4;
68 odata5_r<=d5;
69 odata6_r<=d6;
70 odata7_r<=d7;
71 end
72 end
73 endmodule
74

1 module SHEX (idata,rst,clk,odata);
2 input [3:0] idata;
3 input rst,clk;
4 output [6:0] odata;
5 reg [6:0] odata_r;
6 assign odata=odata_r;
7 always@(posedge clk or negedge rst)
8 begin
9 if(rst==1'b0)
10 begin
11 odata_r<=7'd0;
12 end
13 else
14 begin
15 case(idata)
16 4'd0:odata_r<=7'b1000000;
17 4'd1:odata_r<=7'b1111001;
18 4'd2:odata_r<=7'b0100100;

19 4'd3:odata_r<=7'b0110000;
20 4'd4:odata_r<=7'b0011001;
21 4'd5:odata_r<=7'b0010010;
22 4'd6:odata_r<=7'b0000010;
23 4'd7:odata_r<=7'b1111000;
24 4'd8:odata_r<=7'b0000000;
25 4'd9:odata_r<=7'b0010000;
26 default:odata_r<=7'b0111111;
27 endcase
28 end
29 end
30 endmodule
31

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • FPGA
    +關(guān)注

    關(guān)注

    1630

    文章

    21799

    瀏覽量

    606194
  • 信號(hào)
    +關(guān)注

    關(guān)注

    11

    文章

    2807

    瀏覽量

    77129
  • 編碼
    +關(guān)注

    關(guān)注

    6

    文章

    958

    瀏覽量

    54960
  • 串口
    +關(guān)注

    關(guān)注

    14

    文章

    1559

    瀏覽量

    77105
  • 曼徹斯特
    +關(guān)注

    關(guān)注

    0

    文章

    5

    瀏覽量

    6901

原文標(biāo)題:京微齊力:基于H7的曼徹斯特(編碼&解碼&串口)系統(tǒng)

文章出處:【微信號(hào):HME-FPGA,微信公眾號(hào):HME京微齊力】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    曼徹斯特編碼解碼+CRC校驗(yàn),進(jìn)行高速LVDS傳輸。。代碼

    曼徹斯特編碼解碼+CRC校驗(yàn),進(jìn)行高速LVDS傳輸。。代碼分兩部分。。。第一部分為曼徹斯特編碼,編碼
    發(fā)表于 07-17 22:20

    STM32F7H7的SDIO速度問(wèn)題

    請(qǐng)教:STMF1 F2 F4的sdio 時(shí)鐘都上限48MHz,若接4bit TF卡則只有24M時(shí)鐘,相當(dāng)于理論最大讀取速度12M/s(實(shí)際更小)。請(qǐng)問(wèn)F7H7是否有提高?看資料有的有100MByte/s,但Cubx 里面又限制24MHz,手上沒(méi)有
    發(fā)表于 12-13 08:52

    【至簡(jiǎn)設(shè)計(jì)案例系列】基于FPGA的曼徹斯特編碼解碼設(shè)計(jì)

    至簡(jiǎn)案例系列基于FPGA的曼徹斯特編碼解碼設(shè)計(jì)實(shí)驗(yàn)簡(jiǎn)述將輸入的數(shù)據(jù)流經(jīng)過(guò)曼徹斯特編碼編碼后經(jīng)過(guò)
    發(fā)表于 04-24 14:22

    曼徹斯特編碼解碼 精選資料分享

    曼徹斯特編碼常見(jiàn)的編碼方式有以下幾種,  1、NRZ(Not Return to Zero)不歸零編碼, 這是一種比較簡(jiǎn)單的編碼方式,二進(jìn)制
    發(fā)表于 08-18 07:01

    如何解決stm32 H7 DMA串口發(fā)送數(shù)據(jù)一致性問(wèn)題?

    如何解決stm32 H7 DMA串口發(fā)送數(shù)據(jù)一致性問(wèn)題?
    發(fā)表于 12-06 06:05

    曼徹斯特編碼和差分曼徹斯特編碼簡(jiǎn)介

    曼徹斯特編碼和差分曼徹斯特編碼簡(jiǎn)介曼徹斯特編碼差分曼徹斯特
    發(fā)表于 01-19 07:49

    STM32 H7系列的SDMMC內(nèi)核時(shí)鐘如何操作?

    大家好,關(guān)于STM32 H7系列:我打算使用 H7 系列芯片的 SDMMC 模塊,通過(guò)我自己的 C 代碼,不使用任何操作系統(tǒng)(如果可能的話)。當(dāng)我思考芯片的手冊(cè)參考時(shí),我注意到
    發(fā)表于 02-03 07:02

    紅旗H7搭載德?tīng)柛V鲃?dòng)安全系統(tǒng)

    電子發(fā)燒網(wǎng)訊: 德?tīng)柛Ec中國(guó)第一汽車(chē)集團(tuán)公司合作,將德?tīng)柛V鲃?dòng)安全系統(tǒng)應(yīng)用在一汽自主開(kāi)發(fā)的新一代紅旗轎車(chē)系列H7上并實(shí)現(xiàn)量產(chǎn)。作為中國(guó)首個(gè)在自主品牌上實(shí)現(xiàn)量產(chǎn)的主動(dòng)安
    發(fā)表于 11-26 11:41 ?1495次閱讀

    曼徹斯特編碼解碼及其應(yīng)用

    曼徹斯特編碼解碼及其應(yīng)用。
    發(fā)表于 05-20 14:28 ?0次下載

    h264編碼解碼源代碼

    h264編碼解碼源代碼h264編碼解碼源代碼
    發(fā)表于 01-14 15:50 ?34次下載

    用FPGA器件與VHDL語(yǔ)言實(shí)現(xiàn)曼徹斯特碼編解碼器的設(shè)計(jì)

    曼徹斯特編碼、解碼器是1553B總線接口中不可缺少的重要組成部分。曼徹斯特碼編解碼器設(shè)計(jì)的好壞直接影響總線接口的性能。本文介紹的是MIL-
    的頭像 發(fā)表于 04-24 08:24 ?5224次閱讀

    openmv cam H7官方電路圖免費(fèi)

    openmv cam H7 P官方電路圖免費(fèi)下載。
    發(fā)表于 04-24 10:06 ?39次下載

    Arduino Portenta H7雙核調(diào)試

    電子發(fā)燒友網(wǎng)站提供《Arduino Portenta H7雙核調(diào)試.zip》資料免費(fèi)下載
    發(fā)表于 06-25 10:35 ?0次下載
    Arduino Portenta <b class='flag-5'>H7</b>雙核調(diào)試

    什么是曼徹斯特編碼 曼徹斯特編碼在電路中怎么表示

    什么是曼徹斯特編碼 曼徹斯特編碼的特點(diǎn)是 曼徹斯特編碼在電路中怎么表示
    的頭像 發(fā)表于 11-22 16:32 ?2130次閱讀

    什么是曼徹斯特編碼和差分曼徹斯特編碼?其特點(diǎn)如何?

    什么是曼徹斯特編碼和差分曼徹斯特編碼?其特點(diǎn)如何? 曼徹斯特編碼和差分
    的頭像 發(fā)表于 11-22 16:37 ?1.2w次閱讀