[技术讨论] 智能小车建造火热进行中——材料准备

[复制链接]
6718|0
 楼主| feihufuture 发表于 2021-8-10 14:25 | 显示全部楼层 |阅读模式
本帖最后由 feihufuture 于 2021-8-10 19:39 编辑

#申请原创# @21小跑堂最近我们家的麒麟看见别人家孩子的酷车玩具,跑到爸爸跟前也要一辆。。。
好歹爸爸也是电子出身,这种电子玩具怎么能去买呢,而且买来的小车,要么傻瓜,要么功能不全,还不如DIY,还能跟麒麟一起做,让孩子享受一把电子开发的乐趣!

说干就干!

第一步:选择小车框架,+四个舵机,价格25元。










第二步,选择MCU。
家里找啊找,全是一些STM32的成品板子,太大,不适合。
最后在萝筐里找到了两个FPGA的核心板,很小,芯片型号XC6SLX25。




也好,虽然用的有点奢侈,每个核心板的价格100元,
但是,FPGA处理实时图像视频很好。
两个核心板,正好,一个放在小车上,另一个放在遥控器上。


第三步,选择音乐模块。
功能要足够全面,可以随意下载,选啊选,这个不错;
通过串口,FPGA可以跟模块任意操作。



  
引脚名称
  
引脚描述
5V电源负极
接5V电源负极(GND)
5V电源正极
接5V电源正极
TXD/IO0
IO触发模式下为输入引脚IO0;UART控制模式下为TX引脚,连接控制端(MCU)的RX
RXD/IO1
IO触发模式下为输入引脚IO1;UART控制模式下为RX引脚,连接控制端(MCU)的TX
IO2
IO触发模式输入引脚IO2
IO3
IO触发模式输入引脚IO3
IO4/ONE_LINE
IO触发模式输入引脚IO4;One_Line一线串口控制模式数据接收引脚
IO5
IO触发模式输入引脚IO5
IO6
IO触发模式输入引脚IO6
IO7
IO触发模式输入引脚IO7
BUSY
播放曲目时输出低电平(0V),播放结束输出高电平(3.3V)
GND
参考地端(与控制端GND连接)


拨码开关模式配置
  
对应拨码开关上的编号
  
1
CON1
拨到数字端为低电平(下拉)
拨到ON端为高电平(上拉)
2
CON2
拨到数字端为低电平(下拉)
拨到ON端为高电平(上拉)
3
CON3
拨到数字端为低电平(下拉)
拨到ON端为高电平(上拉)


控制指令
  
指令
  
指令码
返回
播放
AA 02 00 AC
暂停
AA 03 00 AD
停止
AA 04 00 AE
上一曲
AA 05 00 AF
下一曲
AA 06 00 B0
音量加
AA 14 00 BE
音量减
AA 15 00 BF
上一文件目录
AA 0E 00 B8
下一文件目录
AA 0F 00 B9
结束播放
AA 10 00 BA







第四步,选择远程通信模块;蓝牙可以,遥控器,手机都可兼容;
配置好,自动连接,即可透传,方便。






管脚序号 管脚名称 管脚说明
1 UART_CTS 悬空
2 UART_TX 串口数据输出
3 UART_CTS 悬空
4 UART_RX 串口数据输入
5 P2_1 调试数据口
6 P2_2 调试时钟口
7 SCL SCL
8 SDA SDA
9 VCC 3.3v
10 NC NC
11 RESETB 低电平复位, 至少5ms
12 GND
13 P1_1 蓝牙连接指示口( 未连接为低, 连接上为高)
14 P1_0 NC
15 P0_7 LED灯管脚(未连接闪烁, 连接常亮)
16 P0_6 断开连接引脚(200ms 低电脉冲断开)



第五步,选择跟随模块。
用超声,比较简单一点。直接测距,精度高,安装方便。



最大接收距离 >5M
最小接收距离 <3CM
最大接收角度 180° (会随着距离增大角度变小)


串口模式: 通信波特率为 115200, 接收模块 OUT 端直接使用串口输出距离,
输出频率是一秒发送 50 个数据包, 数据格式是 0XA5 加上两个字节的数据,
数据单位是毫米。 例如: 输出 0XA5 0X55 0X11, 0X5511 就是距离, 单位毫米。


引脚 定义
VCC 电源(DC 5V)
GND
OUT 输出信号端
NC 悬空







第六步,选择舵机驱动L298N。
为了提高小车的马力,加上两个L298N,前轮+后轮。






第七步,选择电源。




第八步,其他附属内容。

导线若干;
开关若干;
电压转换芯片;
电平转换芯片;

电容;
胶枪;
电烙铁。

OK,先用上面的内容做个简单的,等麒麟满意了,咱再加上摄像头等其他功能,发挥FPGA的长处,总之,重在体验,让孩子感受乐趣!孩子是爸爸的好帮手!(透露一下,我们家麒麟五岁,认识常用类型的电阻电容和芯片,能焊接,能用列子夹住0402封装的电阻电容哟,最近在学习图形编程,相信麒麟未来比爸爸强!

作为电子工程师的你们,为了你们的孩子,也行动起来把!
目前常用的主要是串口控制,附上代码!

  1. module music_ctrl
  2.         (
  3.         input                        SysClk                        ,
  4.         input                        Rst                                ,
  5.         input                        Rx                                ,
  6.         output                        Tx                                ,
  7.         input                        MusicCtrlValid        ,
  8.         input        [7:0]        MusicCtrlData       

  9.         );



  10.         wire                         RxClk;
  11.         wire                        ByteRxDone;
  12.         wire        [7:0]        ByteRx;
  13.         reg                                ByteRxRdDone;
  14.         wire                        TxClk;
  15.         reg                                TxTriger;
  16.         wire                        ByteTxDone;
  17.         wire         [7:0]        ByteTx;
  18.        
  19.        
  20.        
  21.        
  22.         uart_top #
  23.         (
  24.         .sys_clk_freq ( 50000000 ),
  25.         .baud_rate    ( 9600 )
  26.         )
  27.         uart_top
  28.         (
  29.         .Rs232SetRst        (         Rst ),
  30.         .Rs232RxRst                (         Rst ),
  31.         .Rs232TxRst                (         Rst ),
  32.         //
  33.         .SysClk                 (         SysClk ),
  34.         //
  35.         .rx                                (          Rx         ),
  36.         .tx                                (         Tx        ),
  37.         //
  38.         .RxClk                        (         RxClk ),
  39.         .ByteRxDone                (         ByteRxDone),
  40.         .ByteRx                        (        ByteRx),
  41.         .ByteRxRdDone        (        ByteRxRdDone),
  42.         //
  43.         .TxClk                        (        TxClk),
  44.         .TxTriger                (        TxTriger),       
  45.         .ByteTxDone                (        ByteTxDone),
  46.         .ByteTx                        (        ByteTx)
  47.         );


  48.        
  49.        
  50.                
  51.        
  52.        
  53.         localparam                 TX_IDLE                         =         4'd0 ;
  54.         localparam                 SEND_1ST_BYTE                 =         4'd1 ;
  55.         localparam                 SEND_1ST_BYTE_WAIT         =         4'd2 ;
  56.         localparam                 SEND_2ST_BYTE                 =         4'd3 ;
  57.         localparam                 SEND_2ST_BYTE_WAIT         =         4'd4 ;
  58.         localparam                 SEND_3ST_BYTE                 =         4'd5 ;
  59.         localparam                 SEND_3ST_BYTE_WAIT         =         4'd6 ;
  60.         localparam                 SEND_4ST_BYTE                 =         4'd7 ;
  61.         localparam                 SEND_4ST_BYTE_WAIT         =         4'd8 ;
  62.        
  63.         reg         [3:0]          SendSm;       
  64.         reg                [31:0]        SendData;
  65.        
  66.        
  67.        
  68.         //MusicCtrlData[7] : 1 music operation, button up
  69.         //MusicCtrlData[6] : falling edge, play current music; rising edge, stop current music;
  70.         //MusicCtrlData[5] : select music or vol, up is music.
  71.         //MusicCtrlData[4] : falling edge, next music;music vol+;
  72.         //MusicCtrlData[3] : falling edge, last music;music vol-;
  73.        
  74.        
  75.         reg MusicCtrlDatabit6D1;
  76.         reg MusicCtrlDatabit4D1;
  77.         reg MusicCtrlDatabit3D1;
  78.        
  79.        
  80.         always [url=home.php?mod=space&uid=72445]@[/url] ( posedge TxClk )
  81.         begin
  82.         MusicCtrlDatabit6D1  <= MusicCtrlData[6] ;
  83.         MusicCtrlDatabit4D1  <= MusicCtrlData[4];
  84.         MusicCtrlDatabit3D1  <= MusicCtrlData[3];
  85.         end
  86.        
  87.         always @ ( posedge TxClk )
  88.         begin
  89.         if( Rst ) SendSm <= TX_IDLE;
  90.         else
  91.                 case( SendSm )
  92.                 TX_IDLE                         :        if( MusicCtrlData[7] )
  93.                                                                         begin
  94.                                                                         if( MusicCtrlDatabit6D1 != MusicCtrlData[6] ) SendSm <= SEND_1ST_BYTE;
  95.                                                                         else if( ~MusicCtrlData[4] & MusicCtrlDatabit4D1 ) SendSm <= SEND_1ST_BYTE;
  96.                                                                         else if( ~MusicCtrlData[3] & MusicCtrlDatabit3D1 ) SendSm <= SEND_1ST_BYTE;
  97.                                                                         end
  98.                                                                                
  99.                
  100.                
  101.                 SEND_1ST_BYTE                 :        SendSm <= SEND_1ST_BYTE_WAIT;
  102.                 SEND_1ST_BYTE_WAIT         :        if( ByteTxDone ) SendSm <= SEND_2ST_BYTE;
  103.                 SEND_2ST_BYTE                 :        SendSm <= SEND_2ST_BYTE_WAIT;
  104.                 SEND_2ST_BYTE_WAIT         :        if( ByteTxDone ) SendSm <= SEND_3ST_BYTE;
  105.                 SEND_3ST_BYTE                 :        SendSm <= SEND_3ST_BYTE_WAIT;
  106.                 SEND_3ST_BYTE_WAIT         :        if( ByteTxDone ) SendSm <= SEND_4ST_BYTE;
  107.                 SEND_4ST_BYTE                 :        SendSm <= SEND_4ST_BYTE_WAIT;
  108.                 SEND_4ST_BYTE_WAIT         :        if( ByteTxDone ) SendSm <= TX_IDLE;
  109.                 default                                :        ;
  110.                 endcase
  111.         end
  112.        
  113.        
  114.         //localparam CHECK_PLAY_CMD = 32'haa0100ab;
  115.         localparam PLAY_CMD = 32'haa0200ac;
  116.         localparam STOP_CMD = 32'haa0400ae;
  117.         localparam LAST_CMD = 32'haa0500af;
  118.         localparam NEXT_CMD = 32'haa0600b0;
  119.         localparam VOLU_CMD = 32'haa1400be;
  120.         localparam VOLD_CMD = 32'haa1500bf;
  121.         //localparam CHECK_DISK_CMD = 32'haa0900b3;
  122.         //localparam CHECK_DISK_PLAY_CMD = 32'haa0a00b4;
  123.         //localparam CHECK_MUSIC_TOTAL_CMD = 32'haa0c00b6;
  124.         //localparam CHECK_MUSIC_CUR_CMD = 32'haa0d00b7;
  125.        
  126.        
  127.         assign ByteTx = SendData[31:24];
  128.        
  129.         always @ ( posedge TxClk )
  130.         begin
  131.                 case( SendSm )
  132.                 TX_IDLE                         :        begin TxTriger <= 1'b0; SendData <= 32'b0; end
  133.                 SEND_1ST_BYTE                 :        begin
  134.                                                                         TxTriger <= 1'b1;
  135.                                                                         if(  MusicCtrlData[6] ) SendData <= STOP_CMD;
  136.                                                                        
  137.                                                                         else if( ~MusicCtrlData[4] )
  138.                                                                                 begin
  139.                                                                                 if( MusicCtrlData[5] ) SendData <= LAST_CMD;
  140.                                                                                 else SendData <= VOLU_CMD;
  141.                                                                                 end
  142.                                                                                
  143.                                                                         else if( ~MusicCtrlData[3] )
  144.                                                                                 begin
  145.                                                                                 if( MusicCtrlData[5] ) SendData <= NEXT_CMD;
  146.                                                                                 else SendData <= VOLD_CMD;
  147.                                                                                 end
  148.                                                                                
  149.                                                                         else SendData <= PLAY_CMD;        
  150.                                                                                
  151.                                                                 end
  152.                 SEND_2ST_BYTE                 :        begin TxTriger <= 1'b1; SendData <= {SendData[23:0],8'b0}; end
  153.                 SEND_3ST_BYTE                 :        begin TxTriger <= 1'b1; SendData <= {SendData[23:0],8'b0}; end
  154.                 SEND_4ST_BYTE                 :        begin TxTriger <= 1'b1; SendData <= {SendData[23:0],8'b0}; end
  155.                 default                                :        TxTriger <= 1'b0;
  156.                 endcase
  157.         end





  158.         endmodule

  1.    //------------------------------------------------------------------------------------------------
  2.    //------------------------------------------------------------------------------------------------
  3.         module uart_top #
  4.         (
  5.         parameter sys_clk_freq = 50000000,
  6.         parameter baud_rate    = 115200
  7.         )
  8.         (
  9.         //system signal
  10.         input                                Rs232SetRst,
  11.         input                                Rs232RxRst,
  12.         input                                Rs232TxRst,
  13.         //
  14.         input                                  SysClk ,
  15.         //
  16.         input                                   rx,
  17.         output                                tx,

  18.         output                           RxClk,
  19.         output                                 TxClk,



  20.         output                                ByteRxDone,
  21.         output        [7:0]                ByteRx,
  22.         input                                ByteRxRdDone,

  23.         input                                TxTriger,       
  24.         output                                ByteTxDone,
  25.         input        [7:0]                ByteTx
  26.         );

  27.        
  28. /*
  29.         wire [7:0]         ByteRx;
  30.         reg [4:0] cnt1;
  31.         wire TxTrigerAux;
  32.         always @ (posedge RxClk)
  33.         begin
  34.         if(Rs232RxRst) cnt1 <= 5'd0;
  35.         else if(cnt1 == 5'd25) cnt1 <= 5'd0;
  36.         else if(cnt1 != 5'd0) cnt1 <= cnt1  + 1;
  37.         else if(ByteRxDone) cnt1 <= cnt1  + 1;
  38.         end
  39.        

  40.         assign TxTrigerAux = (cnt1 != 5'd0) ? 1'b1 :1'b0;

  41.         reg TxTrigerAuxD1,TxTrigerAuxD2,TxTrigerAuxD3;
  42.         reg [7:0]        ByteRxD1,ByteRxD2;
  43.        
  44.        
  45.         always @ (posedge TxClk)
  46.         begin
  47.         TxTrigerAuxD1 <= TxTrigerAux;
  48.         TxTrigerAuxD2 <= TxTrigerAuxD1;
  49.         TxTrigerAuxD3 <= TxTrigerAuxD2;
  50.         ByteRxD1                <=  ByteRx;
  51.         ByteRxD2    <= ByteRxD1;
  52.         end
  53.        
  54.         wire TxTriger = ~TxTrigerAuxD3 & TxTrigerAuxD2;
  55.         wire         [7:0]         ByteTx = ByteRxD2;
  56.        
  57.        
  58.         reg TxTrigerD1, TxTrigerD2 , TxTrigerD3;
  59.         always @ (posedge RxClk)
  60.         begin
  61.         TxTrigerD1 <= TxTriger;
  62.         TxTrigerD2 <= TxTrigerD1;
  63.         TxTrigerD3 <= TxTrigerD2;
  64.         end
  65.        
  66.         wire  ByteRxRdDone = TxTrigerD3 & ~TxTrigerD2;
  67.        
  68.         */

  69.        
  70.        

  71.         //------------------------------------------------------------------------------------------------
  72.         uart_sets #
  73.         (
  74.         .sys_clk_freq ( sys_clk_freq ),
  75.         .baud_rate    ( baud_rate )
  76.         )
  77.         uart_system_setting
  78.         (
  79.         .sys_clk                (         SysClk                        ),
  80.         .rst                        (        Rs232SetRst                ),
  81.         .rx_clk                        (        RxClk                        ),
  82.         .tx_clk                        (        TxClk                        )
  83.         );
  84.    //------------------------------------------------------------------------------------------------
  85.    
  86.    
  87.    //------------------------------------------------------------------------------------------------
  88.         uart_rx uart_rx_logic
  89.         (
  90.         .clk16x                  (        RxClk                          ),
  91.         .rst                           (        Rs232RxRst                 ),
  92.         .rx_data                 (        rx                      ),
  93.         .ByteRxDone          (        ByteRxDone          ),       
  94.         .ByteRx                        (        ByteRx                        ),
  95.         .ByteRxRdDone        (        ByteRxRdDone        )
  96.         );
  97.    //------------------------------------------------------------------------------------------------
  98.    
  99.    
  100.    //------------------------------------------------------------------------------------------------
  101.         uart_tx uart_tx_logic
  102.         (
  103.         .clk1x                   (        TxClk                          ),
  104.         .rst                           (        Rs232TxRst                ),
  105.         .mcu_data                (        ByteTx                        ),
  106.         .TxTriger                  (        TxTriger                  ),
  107.         .tx_data                 (        tx                      ),
  108.         .ByteTxDone                (        ByteTxDone                )
  109.         );
  110.         //------------------------------------------------------------------------------------------------
  111.    
  112.    
  113.         endmodule

  114.        
  115.        
  116.        
  1.   module uart_sets
  2.                 #
  3.                 (
  4.                 parameter sys_clk_freq = 50000000,
  5.                 parameter baud_rate    = 115200
  6.                 )
  7.                 (
  8.                 input                                  sys_clk ,
  9.                 input                                  rst,
  10.        

  11.                 output                        rx_clk,
  12.                 output                        tx_clk
  13.                 );
  14.                 //
  15.                
  16.                 //
  17.                 reg                [15:0]        tx_clk_div        = 0;
  18.                 reg                [15:0]        rx_clk_div        = 0;

  19.                 reg                                        tx_clk_r = 0;
  20.                 reg                                        rx_clk_r        = 0;


  21.                 wire        [15:0]        div_tx;
  22.                 wire        [15:0]        div_rx;

  23.                 //the frequecy of sending clock must be the same as baud_rate,
  24.                 //"sys_clk_freq/baud_rate" is a divider,
  25.                 //"2" means two jump to guarantee the frequecy of tx_clk,
  26.                 //"16" is about the protocol of receiving clock in rs232.
  27.                 assign div_tx        = sys_clk_freq/(baud_rate*2);
  28.                 assign div_rx        = sys_clk_freq/(baud_rate*2*16);

  29.                 assign tx_clk        = tx_clk_r;
  30.                 assign rx_clk        = rx_clk_r;

  31.                 //data sending clock
  32.                 always @ ( posedge sys_clk )
  33.                 begin
  34.                 if( rst ) tx_clk_div        <= 0;
  35.                 else
  36.                         begin
  37.                         if(tx_clk_div < (div_tx - 1))
  38.                                 begin
  39.                                 tx_clk_div        <= tx_clk_div + 1'b1;
  40.                                 tx_clk_r        <= tx_clk_r;
  41.                                 end
  42.                         else
  43.                                 begin
  44.                                 tx_clk_div        <= 0;
  45.                                 tx_clk_r        <= ~tx_clk_r;
  46.                                 end       
  47.                         end
  48.                 end

  49.                 //data receiving clock
  50.                 always @ ( posedge sys_clk )
  51.                 begin
  52.                 if( rst ) rx_clk_div        <= 0;
  53.                 else
  54.                         begin
  55.                         if(rx_clk_div < (div_rx - 1))
  56.                                 begin
  57.                                 rx_clk_div        <= rx_clk_div + 1'b1;
  58.                                 rx_clk_r        <= rx_clk_r;
  59.                                 end
  60.                         else
  61.                                 begin
  62.                                 rx_clk_div        <= 0;
  63.                                 rx_clk_r        <= ~rx_clk_r;
  64.                                 end
  65.                         end
  66.                 end

  67.                 endmodule
  68.                
  69.                
  70.                
  71.                
  1. `timescale 1ns / 1ps
  2.         /////////////////////////////////////////////
  3.         module uart_rx
  4.         (
  5.         input               clk16x,
  6.         input                rst,
  7.         input                rx_data,

  8.         output               ByteRxDone,         
  9.         output [7:0]         ByteRx,
  10.         input                        ByteRxRdDone
  11.         );         
  12.    //
  13.         reg [3 : 0]   rx_shift    = 0;
  14.         reg           frame_valid = 0;
  15.         reg [3 : 0]   rx_cnt1     = 0;
  16.         reg           sampling7   = 1;
  17.         reg           sampling8   = 1;
  18.         reg           sampling9   = 1;
  19.         reg [3 : 0]   data_cnt    = 0;
  20.         reg [7 : 0]   rx_buf      = 0;
  21.    //
  22.         wire                 res;
  23.        
  24.         reg ByteRxDoneReg = 0;
  25.         reg [7:0] ByteRxReg;
  26.         //------------------------------------------------------------------------------------------------
  27.         //res shifter
  28.         always @ (posedge clk16x)
  29.         begin
  30.         if(rst) rx_shift <= 4'b0;
  31.         else if(frame_valid ) rx_shift <= 4'b0;
  32.         else rx_shift <= {rx_shift[2:0],rx_data};
  33.         end               
  34.        
  35.        
  36.        
  37.         //frame valid
  38.         always @ (posedge clk16x)
  39.         begin
  40.         if(rst)  frame_valid <= 1'b0;
  41.         else if(rx_shift == 4'b1100) frame_valid <= 1'b1;
  42.         else if(data_cnt == 4'd9)        frame_valid <= 1'b0;
  43.         end
  44.         //------------------------------------------------------------------------------------------------
  45.        
  46.        
  47.        
  48.    //------------------------------------------------------------------------------------------------
  49.    //---------------------------------------data sampling--------------------------------------------
  50.           
  51.         //bit sampling counter
  52.         always @ (posedge clk16x)
  53.         begin
  54.         if(rst) rx_cnt1 <= 4'd0;
  55.         else if( frame_valid ) rx_cnt1 <= rx_cnt1 + 1'b1;
  56.         else  rx_cnt1 <= 4'd0;
  57.         end
  58.        
  59.        
  60.         always @ (posedge clk16x)
  61.         begin
  62.         if(rst)  begin
  63.                                         sampling7 <= 1;
  64.                                         sampling8 <= 1;
  65.                                         sampling9 <= 1;
  66.                                         end
  67.         else if(rx_cnt1 == 4'd6) sampling7 <= rx_data;
  68.         else if(rx_cnt1 == 4'd7) sampling8 <= rx_data;
  69.         else if(rx_cnt1 == 4'd8) sampling9 <= rx_data;
  70.         end  

  71.         //caculate the sampling result
  72.    assign res = (sampling7&&sampling8)^(sampling8&&sampling9)
  73.                       ^(sampling7&&sampling9);                                          
  74.         //------------------------------------------------------------------------------------------------               




  75.        
  76.    //------------------------------------------------------------------------------------------------
  77.         //--------------------------------------data receive----------------------------------------------
  78.         always @ (posedge clk16x)
  79.         begin
  80.         if(rst) data_cnt <= 4'd0;
  81.         else if(frame_valid)
  82.                 begin
  83.                 if(&rx_cnt1) data_cnt <= data_cnt + 1'b1;
  84.                 end
  85.         else data_cnt <= 4'd0;
  86.         end       
  87.        
  88.        
  89.         //read interrupt
  90.         assign ByteRxDone = ByteRxDoneReg;       

  91.         always @ (posedge clk16x)
  92.         begin
  93.         if(rst) ByteRxDoneReg <= 0;
  94.         else if( (data_cnt == 4'd8) && (rx_cnt1 == 4'd11) ) ByteRxDoneReg <= 1;
  95.         else ByteRxDoneReg <= 0;
  96.         end
  97.        
  98.        
  99.         //rx_buf
  100.         //when frame_valid is high, and data_cnt count as "0",
  101.         //it is the frame start bit "0"
  102.         assign ByteRx = ByteRxReg;
  103.         always @ (posedge clk16x)
  104.         begin
  105.         if(rst) rx_buf <= 8'd0;
  106.         else if( frame_valid )
  107.                 begin
  108.                 if( data_cnt != 4'b0 )
  109.                         begin
  110.                         if(rx_cnt1 == 4'd10) rx_buf <= {res, rx_buf[7:1]};
  111.                         end
  112.                 end
  113.         end
  114.        
  115.        
  116.        
  117.         always @ (posedge clk16x)
  118.         begin
  119.         if(rst) ByteRxReg <= 8'd0;
  120.         else if(ByteRxRdDone) ByteRxReg <= 8'd0;
  121.         else if( frame_valid )
  122.                 begin
  123.                 if( data_cnt == 4'd8 )
  124.                         begin
  125.                         if(rx_cnt1 == 4'd11) ByteRxReg <= rx_buf;
  126.                         end
  127.                 end
  128.         end
  129.        
  130.         //assign chipscope_bus = {  213'b0 ,res , rx_buf,rx_cnt1,data_cnt,frame_valid};
  131.        
  132.        
  133.         endmodule




  1. `timescale 1ns / 1ps
  2.         //------------------------------------------------------------------------------------------------
  3.         module uart_tx(
  4.         input                clk1x,
  5.         input                 rst,
  6.         input [7 : 0]         mcu_data,
  7.         input                 TxTriger,
  8.         output                tx_data,
  9.         output                        ByteTxDone
  10.         );
  11.        
  12.        
  13.         (*keep = "true"*)reg [7 : 0] tx_buf       = 0;
  14.         reg [3 : 0] tx_cnt       = 0;//transmit counter
  15.         reg         data_valid   = 0;//transmit data valid
  16.         reg         tx_data_r    = 1;
  17.         reg         TxTrigerD1 = 0;
  18.         reg ByteTxDoneReg = 0;
  19.        
  20.        
  21.    //------------------------------------------------------------------------------------------------
  22.         always @ (posedge clk1x)
  23.         begin
  24.         if(rst) TxTrigerD1 <= 1'b0;
  25.         else  TxTrigerD1 <= TxTriger;
  26.         end
  27.        
  28.        
  29.         //transmit data buf
  30.         always @ (posedge clk1x)
  31.         begin
  32.         if(rst) tx_buf <= 8'd0;
  33.         else if(TxTrigerD1 & ~TxTriger) tx_buf <= mcu_data;
  34.         end

  35.        
  36.        
  37.         always @ (posedge clk1x)
  38.         begin
  39.         if(rst) data_valid <= 1'b0;
  40.         else if(tx_cnt == 4'd8) data_valid <= 1'b0;
  41.         else if(TxTrigerD1 & ~TxTriger) data_valid <= 1'b1;
  42.         end
  43.        
  44.        
  45.        
  46.        
  47.         //transmit counter
  48.         always @ (posedge clk1x)
  49.         begin
  50.         if(rst) tx_cnt <= 4'd0;
  51.         else if( data_valid ) tx_cnt <= tx_cnt + 1'b1;         
  52.         else tx_cnt <= 4'd0;
  53.         end          
  54.         //------------------------------------------------------------------------------------------------
  55.        


  56.         //------------------------------------------------------------------------------------------------
  57.         assign tx_data = tx_data_r;
  58.         always @ (posedge clk1x)
  59.         begin
  60.         if(rst) tx_data_r <= 1;
  61.         else
  62.                 case(tx_cnt)
  63.                 4'd1: tx_data_r <= 0;
  64.                 4'd2: tx_data_r <= tx_buf[0];
  65.                 4'd3: tx_data_r <= tx_buf[1];
  66.                 4'd4: tx_data_r <= tx_buf[2];
  67.                 4'd5: tx_data_r <= tx_buf[3];
  68.                 4'd6: tx_data_r <= tx_buf[4];
  69.                 4'd7: tx_data_r <= tx_buf[5];
  70.                 4'd8: tx_data_r <= tx_buf[6];
  71.                 4'd9: tx_data_r <= tx_buf[7];
  72.                 default: tx_data_r <= 1;       
  73.                 endcase
  74.         end
  75.         //------------------------------------------------------------------------------------------------

  76.        
  77.        
  78.         //------------------------------------------------------------------------------------------------
  79.         assign ByteTxDone = ByteTxDoneReg;
  80.         always @ (posedge clk1x)
  81.         begin
  82.         if(rst) ByteTxDoneReg <= 0;
  83.         else if(tx_cnt == 4'd9) ByteTxDoneReg <= 0;
  84.         else if(tx_cnt == 4'd8) ByteTxDoneReg <= 1;
  85.         end
  86.         //------------------------------------------------------------------------------------------------
  87.        
  88.        
  89.         endmodule
  90.        
  91.        
  92.        
  93.        
  94.        
  95.        
































本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:WX:feihu612 免费合作开发ECAT主从站

171

主题

1029

帖子

101

粉丝
快速回复 在线客服 返回列表 返回顶部