用verilog實現L293D 驅動板介面

2021-08-08 17:16:41 字數 3226 閱讀 1667

課程實驗做了乙個藍芽智慧型小車,nexys4開發板,mipsfpga(乙個在 fpga 上實現的商業 mips 處理器軟核,imagination technologies公司提供給高校免費使用),再加上vivado裡面的一些ip核,搭了乙個簡單的處理器系統。要用這玩意來接用了l293d 驅動板的小車,網上絕大多數資料都是用arduino來接l293d驅動板,所以找了一下也沒有輪子拿來用,就自己寫乙個咯。l293d驅動板的資料你可以在網上找到很多,而且它的功能遠不止我這裡的控制乙個四驅的小車,這裡我就不細說了。

首先呢,看驅動板的訊號線,接線可以參考這篇,使用l293d驅動板(for arduino)對電動機進行驅動 引腳

名稱功能

3pwm2b

pwm調速

4dir_clk

串鎖器序列輸入時鐘

5pwm0b

pwm調速

6pwm0a

pwm調速

7dir_enable

串鎖器使能

8dir_serial

串鎖器序列輸入

11pwm2a

pwm調速

12dir_latch

串鎖器使能

24(另一邊)

gnd邏輯地

25(24的旁邊)

vcc_logic

邏輯正

上面名字估計叫法還不一樣,但是從名字也能看出來這塊板子大概是啥結構。四個pwm調速是兩塊l293d晶元的輸入,原理也自己去查吧,不要調速給個邏輯1也是可以的。另外幾個串鎖器( 74hct595n 晶元,估計名字也不統一)訊號,其實就是乙個移位暫存器、乙個鎖存器和乙個三態門構成,八位,每兩位組合控制乙個馬達的轉向。所以我們要實現的介面主要相當於乙個序列通訊的東西,把cpu傳來的8位並行控制位按序列的方式寫到74hct595n 晶元的移位暫存器中,然後dir_latch給個上公升沿把資料鎖存到鎖存器中,最後dir_enable給低電平,使能三態門,一次控制就算完成了,直到下次控制寫入之前小車都會按照上次寫的訊號運轉。

前面說的cpu用的是axi4匯流排,所以我就也封裝了乙個基於axi4匯流排的ip核,內部邏輯很簡單:分頻(可能需要,整個板子上用的是100mhz或者50mhz的時鐘,對序列傳輸資料來說可能有點快)、傳資料。

傳資料這塊的**在下面,用verilog也是個生手,可能寫的不太優雅。

`timescale 1ns / 1ps

module

car_driver_int (

input clk,

input [31

:0] ctrlsig,

output reg dir_serial,

output reg dir_enable,

output reg dir_latch

); parameter st0 = 0, st1 = 1, st2 = 2, st3 = 3, st4 = 4, st5 = 5, st6 = 6, st7 = 7, st8 = 8;

reg [3

:0] p_state = st8;

reg [31

:0] buff = 0;

always @ (negedge clk)

case (p_state)

st0:begin

buff <= ctrlsig;

p_state <= st1;

dir_serial

<= ctrlsig[0];

dir_enable

<= 1;

dir_latch

<= 0;

endst1:

begin

p_state <= st2;

dir_serial

<= ctrlsig[1];

dir_enable

<= 1;

dir_latch

<= 0;

endst2:

begin

p_state <= st3;

dir_serial

<= ctrlsig[2];

dir_enable

<= 1;

dir_latch

<= 0;

endst3:

begin

p_state <= st4;

dir_serial

<= ctrlsig[3];

dir_enable

<= 1;

dir_latch

<= 0;

endst4:

begin

p_state <= st5;

dir_serial

<= ctrlsig[4];

dir_enable

<= 1;

dir_latch

<= 0;

endst5:

begin

p_state <= st6;

dir_serial

<= ctrlsig[5];

dir_enable

<= 1;

dir_latch

<= 0;

endst6:

begin

p_state <= st7;

dir_serial

<= ctrlsig[6];

dir_enable

<= 1;

dir_latch

<= 0;

endst7:

begin

p_state <= st8;

dir_serial

<= ctrlsig[7];

dir_enable

<= 1;

dir_latch

<= 0;

endst8:

begin

p_state = !(ctrlsig ^ buff) ? st8

:st0;

dir_serial

<= ctrlsig[7];

dir_enable

<= 0;

dir_latch

<= 1;

enddefault:

begin

p_state <= st8;

endendcase

endmodule

為了確定啥時候進行下次傳輸,所以把上次寫的內容存了下來,一但和匯流排裡的資料不一樣就傳,傳完更新存的值。也可以用axi匯流排的訊號來控制這個,方法很多。不過看74hct595n文件說這塊晶元是標準的spi,vivado裡面有spi的ip核,但是我一直沒能接好~_~。

電機驅動晶元L298N和L293D區別

一 主體不同 1 l293d 支援vcc 4.5 36v的微型電機驅動積體電路晶元。2 l298n 是一種雙h橋電機驅動晶元。二 支援電流不同 1 l293d 支援vcc 4.5 36v,最大輸出電流為1a。2 l298n 每個h橋可以提供2a的電流,功率部分的供電電壓範圍是2.5 48v,邏輯部分...

用Verilog實現串並轉換

一 串轉並轉換模組 串轉並就是將低3位訊號和輸入訊號一起賦值。因為經過轉換後,碼元速率會將為原來四分之一,所以設定4分頻時鐘,將其輸出。而並轉串就是不斷右移,取高位輸出。module serial par input clk,input d,output reg 3 0 q 四分頻模組 reg 13...

用verilog實現的串列埠通訊模組

串列埠功能 1 8個資料位 1個停止為 無校驗位 2 空閒時資料線為高電平,從高電平跳向低電平表示啟動訊號 3 波特率可以通過parameter引數實現可調 有兩個檔案 uart.v 串列埠模組 module uart 全域性時鐘復位訊號 iclk,irst n,序列資料線 irx,序列接收 otx...