当前位置:   article > 正文

FPGA与stm32实现串口通信(stm32发,FPGA收)_stm32 fpga

stm32 fpga

要使用FPGA与STM32实现串口通信,以下是一般的步骤:

  1. 配置STM32的串口模块:使用STM32的库函数或者寄存器配置,选择一个可用的串口模块(例如USART1、USART2等)并设置相应的波特率、数据位、停止位等参数。确保STM32串口的引脚与FPGA连接正确。

  2. 配置FPGA与STM32之间的通信接口:确定FPGA与STM32之间的通信接口,通常使用串口通信需要至少两个信号线:一个用于发送数据(TX),一个用于接收数据(RX)。确保FPGA的引脚与STM32的串口引脚相连。

  3. 在FPGA中实现串口通信接口:使用HDL(硬件描述语言,如Verilog或VHDL)编写FPGA逻辑,实现串口通信接口。这包括发送和接收数据的逻辑,以及与STM32的串口模块进行数据交换的逻辑。

  4. 在STM32中编写串口通信代码:使用STM32的开发环境(如Keil或STM32CubeIDE)编写串口通信的代码。这包括配置STM32串口模块、发送和接收数据的代码。

  5. 在FPGA中进行数据的发送和接收:通过FPGA的串口通信接口将数据发送到STM32,或从STM32接收数据。确保数据的格式和协议在FPGA和STM32之间匹配。

  6. 在STM32中进行数据的发送和接收:使用STM32的串口通信代码,接收来自FPGA的数据或将数据发送到FPGA。确保STM32的串口配置与FPGA的串口配置匹配。

  7. 测试与调试:使用示波器或串口调试工具监视串口数据的发送和接收。检查数据的准确性和完整性,并进行必要的调试和修复。

需要注意的是,FPGA和STM32之间的串口通信需要确保数据格式、波特率等参数的一致性。另外,还需要关注引脚连接和信号电平的匹配,以确保正确的数据传输。具体的实现细节和代码编写可能因具体的FPGA型号和STM32型号而有所不同,你可以参考相关的开发文档和例程来帮助你完成串口通信的实现。

       以下为本人做无人船时使用的FPGA与stm32串口通信过程。

       首先为FPGA输出PWM波控制两个电机的过程:

  1. //FPGA 控制舵机程序(verilog)
  2. module pwm_gen(
  3. input nreset,
  4. input clk,
  5. input en,//1
  6. input [31:0] period,
  7. input [31:0] h_time,
  8. output reg pwm
  9. );
  10. reg [31:0] CNT;
  11. always @ (posedge clk)
  12. begin
  13. if(nreset)
  14. CNT <= 0;
  15. else if(CNT >= period - 1 )
  16. CNT <= 0;
  17. else
  18. CNT <= CNT + 1;
  19. end
  20. always @ (posedge clk)
  21. begin
  22. if(nreset)
  23. pwm <= 0;
  24. else //nreset = 1
  25. begin
  26. if(en == 0)
  27. pwm <= 0;
  28. else //en = 1
  29. begin
  30. if(CNT <= h_time - 1)
  31. pwm <= 1;
  32. else
  33. pwm <= 0;
  34. end
  35. end
  36. end
  37. endmodule
  38. //125M 20M
  39. //例化可控制三个舵机
  40. module PWM1(clk,nreset,uart_rxd,pwm3,pwm4);
  41. input clk;
  42. input nreset;
  43. input uart_rxd;
  44. output pwm3;//[2:0]
  45. output pwm4;//[2:0]
  46. //reg pwm2;
  47. wire [31:0]left0;
  48. wire [31:0]right0;
  49. wire clkp0;
  50. wire uart_rx_done;
  51. wire uart_rx_data;
  52. wire locked;
  53. pwm_gen a1(
  54. .nreset(nreset),
  55. .clk(clk),
  56. .en(1),
  57. .period(2500000),
  58. .h_time(left0),
  59. .pwm(pwm3)
  60. );
  61. pwm_gen a2(
  62. .nreset(nreset),
  63. .clk(clk),
  64. .en(1),
  65. .period(2500000),
  66. .h_time(right0),
  67. .pwm(pwm4)
  68. );
  69. // pwm_gen a2(nreset,clk,1,2500000,right0,pwm4); //125000 250000
  70. // pwm_gen a2(clk,nreset,1,2500000,1500_000,pwm3[1]);
  71. // pwm_gen a3(clk,nreset,1,2500000,2000_000,pwm3[2]);
  72. //例化被测试的接收模块
  73. //uart_rx #(
  74. // .BPS (9600), //波特率9600
  75. // .SYS_CLK_FRE (50_000_000)//时钟频率50M
  76. //)
  77. uart_rx u_uart_rx (
  78. .sys_clk (clkp0),
  79. .sys_rst_n (sys_rst_n),
  80. .uart_rxd (uart_rxd),
  81. .uart_rx_done (uart_rx_done),
  82. .uart_rx_data (uart_rx_data) ,
  83. .left(left0),
  84. .right(right0)
  85. );
  86. clk_wiz_0 uu0
  87. (
  88. // Clock out ports
  89. .clk_out1(clkp0),
  90. .reset(nreset),
  91. .locked(),
  92. // Clock in ports
  93. .clk_in1(clk)
  94. );
  95. // 1000 2000
  96. //1000_000 1500_000 2000_000
  97. endmodule

      其次建立FPGA的uart模块:

  1. //`timescale 1ns / 1ps
  2. //
  3. // Company:
  4. // Engineer:
  5. //
  6. // Create Date: 2023/06/16 18:08:02
  7. // Design Name:
  8. // Module Name: uart
  9. // Project Name:
  10. // Target Devices:
  11. // Tool Versions:
  12. // Description:
  13. //
  14. // Dependencies:
  15. //
  16. // Revision:
  17. // Revision 0.01 - File Created
  18. // Additional Comments:
  19. //
  20. //
  21. module uart_rx(
  22. input sys_clk, //50M系统时钟
  23. input sys_rst_n, //系统复位
  24. input uart_rxd, //接收数据线
  25. output reg uart_rx_done, //数据接收完成标志
  26. output reg [7:0]uart_rx_data, //接收到的数据
  27. output reg [31:0] left, //数据接收完成标志
  28. output reg [31:0] right //数据接收完成标志
  29. );
  30. //常量化波特率,可更改
  31. parameter BPS=115200; //波特率9600bps,可更改
  32. parameter SYS_CLK_FRE=50_000_000; //50M系统时钟
  33. localparam BPS_CNT=SYS_CLK_FRE/BPS; //传输一位数据所需要的时钟个数
  34. reg uart_rx_d0; //寄存1
  35. reg uart_rx_d1; //寄存2
  36. reg [15:0] clk_cnt; //时钟计数器
  37. reg [3:0] rx_cnt; //接收计数器
  38. reg rx_flag; //接收标志位
  39. reg [7:0] uart_rx_data_reg; //数据寄存
  40. reg [3:0] cnt_dj;//电机PWM值计数
  41. reg [31:0] count0 = 10'd100;
  42. wire neg_uart_rx_data; //数据的下降沿
  43. reg [31:0] lefft;
  44. reg [31:0] lefft1;
  45. assign neg_uart_rx_data=uart_rx_d1 & (~uart_rx_d0); //捕获数据线的下降沿,用来标志数据传输开始
  46. //将数据线打两拍,作用1:同步不同时钟域信号,防止亚稳态;作用2:用以捕获下降沿
  47. always@(posedge sys_clk or negedge sys_rst_n)begin
  48. if(sys_rst_n)begin
  49. uart_rx_d0<=1'b0;
  50. uart_rx_d1<=1'b0;
  51. end
  52. else begin
  53. uart_rx_d0<=uart_rxd;
  54. uart_rx_d1<=uart_rx_d0;
  55. end
  56. end
  57. //捕获到数据下降沿(起始位0)后,拉高传输开始标志位,并在第9个数据(终止位)的传输过程正中(数据比较稳定)再将传输开始标志位拉低,标志传输结束
  58. always@(posedge sys_clk or negedge sys_rst_n)begin
  59. if(sys_rst_n)
  60. rx_flag<=1'b0;
  61. else begin
  62. if(neg_uart_rx_data)
  63. rx_flag<=1'b1;
  64. else if((rx_cnt==4'd9)&&(clk_cnt==BPS_CNT/2))//在第9个数据(终止位)的传输过程正中(数据比较稳定)再将传输开始标志位拉低,标志传输结束
  65. rx_flag<=1'b0;
  66. else
  67. rx_flag<=rx_flag;
  68. end
  69. end
  70. //时钟每计数一个BPS_CNT(传输一位数据所需要的时钟个数),即将数据计数器加1,并清零时钟计数器
  71. always@(posedge sys_clk or negedge sys_rst_n)begin
  72. if(sys_rst_n)begin
  73. rx_cnt<=4'd0;
  74. clk_cnt<=16'd0;
  75. end
  76. else if(rx_flag)begin
  77. if(clk_cnt<BPS_CNT-1'b1)begin
  78. clk_cnt<=clk_cnt+1'b1;
  79. rx_cnt<=rx_cnt;
  80. end
  81. else begin
  82. clk_cnt<=16'd0;
  83. rx_cnt<=rx_cnt+1'b1;
  84. end
  85. end
  86. else begin
  87. rx_cnt<=4'd0;
  88. clk_cnt<=16'd0;
  89. end
  90. end
  91. //在每个数据的传输过程正中(数据比较稳定)将数据线上的数据赋值给数据寄存器
  92. always@(posedge sys_clk or negedge sys_rst_n)begin
  93. if(sys_rst_n)
  94. uart_rx_data_reg<=8'd0;
  95. else if(rx_flag)
  96. if(clk_cnt==BPS_CNT/2) begin
  97. case(rx_cnt)
  98. 4'd1:uart_rx_data_reg[0]<=uart_rxd;
  99. 4'd2:uart_rx_data_reg[1]<=uart_rxd;
  100. 4'd3:uart_rx_data_reg[2]<=uart_rxd;
  101. 4'd4:uart_rx_data_reg[3]<=uart_rxd;
  102. 4'd5:uart_rx_data_reg[4]<=uart_rxd;
  103. 4'd6:uart_rx_data_reg[5]<=uart_rxd;
  104. 4'd7:uart_rx_data_reg[6]<=uart_rxd;
  105. 4'd8:uart_rx_data_reg[7]<=uart_rxd;
  106. default:;
  107. endcase
  108. end
  109. else
  110. uart_rx_data_reg<=uart_rx_data_reg;
  111. else
  112. uart_rx_data_reg<=8'd0;
  113. end
  114. //当数据传输到终止位时,拉高传输完成标志位,并将数据输出
  115. always@(posedge sys_clk or negedge sys_rst_n)begin
  116. if(sys_rst_n)
  117. begin
  118. uart_rx_done=1'b0;
  119. left=32'd125000;
  120. lefft=32'd0;
  121. lefft1=32'd0;
  122. right=32'd0;
  123. cnt_dj=4'd0;
  124. uart_rx_data=8'd0;
  125. end
  126. else if(rx_cnt==4'd9)
  127. begin//接收完判断
  128. uart_rx_done=1'b1;
  129. uart_rx_data=uart_rx_data_reg;
  130. // rx_cnt<=4'd0;
  131. if(uart_rx_data==16'hFF &&cnt_dj==4'd0)
  132. begin
  133. cnt_dj=4'd1;
  134. uart_rx_data=8'd0;
  135. left=32'd0;
  136. right=32'd0;
  137. end
  138. else if(uart_rx_data!=16'hFF &&cnt_dj==4'd1)
  139. begin
  140. left=uart_rx_data*count0;
  141. cnt_dj=4'd2;
  142. end
  143. else if(uart_rx_data==16'hFE &&cnt_dj==4'd2)
  144. begin
  145. cnt_dj=4'd3;
  146. uart_rx_data=8'd0;
  147. end
  148. else if(uart_rx_data!=16'hFE &&cnt_dj==4'd3)
  149. begin
  150. left=left+uart_rx_data;
  151. left=left*10'd125;
  152. cnt_dj=4'd4;
  153. end
  154. else if(uart_rx_data==16'hFD &&cnt_dj==4'd4)
  155. begin
  156. cnt_dj=4'd5;
  157. uart_rx_data=8'd0;
  158. end
  159. else if(uart_rx_data!=16'hFD &&cnt_dj==4'd5)
  160. begin
  161. right=uart_rx_data*count0;
  162. cnt_dj=4'd6;
  163. end
  164. else if(uart_rx_data==16'hFC &&cnt_dj==4'd6)
  165. begin
  166. cnt_dj=4'd7;
  167. uart_rx_data=8'd0;
  168. end
  169. else if(uart_rx_data!=16'hFC &&cnt_dj==4'd7)
  170. begin
  171. right=right+uart_rx_data;
  172. right=right*10'd125;
  173. cnt_dj=4'd0;
  174. end
  175. end
  176. else
  177. begin
  178. uart_rx_done<=1'b0;
  179. uart_rx_data=8'd0;
  180. end
  181. end
  182. endmodule
  183. // if(uart_rx_data==16'hFF &&cnt_dj==4'd0)
  184. // begin
  185. // cnt_dj=4'd1;
  186. // uart_rx_data=8'd0;
  187. // left=32'd0;
  188. // right=32'd0;
  189. // end
  190. // else if(uart_rx_data!=16'hFF)
  191. // begin
  192. // if(cnt_dj==4'd4)
  193. // begin
  194. // right=right+uart_rx_data;
  195. // cnt_dj=4'd0;
  196. // end
  197. // if(cnt_dj==4'd3)
  198. // begin
  199. // right=uart_rx_data*100;
  200. // cnt_dj=4'd4;
  201. // end
  202. // if(cnt_dj==4'd2)
  203. // begin
  204. // left=left+uart_rx_data;
  205. // lefft1=left;
  206. // cnt_dj=4'd3;
  207. // end
  208. // if(cnt_dj==4'd1)
  209. // begin
  210. // left=uart_rx_data*count0;
  211. // lefft<=left;
  212. // cnt_dj=4'd2;
  213. // end
  214. // end

       由于两模块间需要进行分频处理,将125MHZ分成50MHZ,我们采用vivado自带的IP核进行分频处理,具体步骤如下图所示:

       仿真模块如下所示:

  1. `timescale 1ns/1ps
  2. //module tb;
  3. // reg sys_clk;
  4. // reg sys_rst_n;
  5. // wire PWMA_H, PWMA_L, PWMB_H, PWMB_L, PWMC_H, PWMC_L;
  6. // // Reset generation
  7. // initial begin
  8. // sys_rst_n = 0;
  9. // sys_clk=0;
  10. // #10;
  11. // sys_rst_n = 1;
  12. // #100;
  13. // $finish; // End simulation after some time
  14. // end
  15. // // Clock generation
  16. // always #5 sys_clk = ~sys_clk;
  17. // // Testbench logic
  18. // reg clk_counter = 0;
  19. // // Instantiate the PWM module
  20. //PWM1 a4(sys_clk,sys_rst_n,PWMA_H);
  21. // always @(posedge sys_clk) begin
  22. // if (sys_rst_n) begin
  23. // clk_counter <= clk_counter + 1;
  24. // // Read PWM output signals
  25. // $display("Time: %t, PWMA_H: %b, PWMA_L: %b, PWMB_H: %b, PWMB_L: %b, PWMC_H: %b, PWMC_L: %b",
  26. // $time, PWMA_H, PWMA_L, PWMB_H, PWMB_L, PWMC_H, PWMC_L);
  27. // // Add your testbench assertions or other test logic here
  28. // // Stop simulation after a certain number of clock cycles
  29. // if (clk_counter == 1000)
  30. // $finish;
  31. // end
  32. // end
  33. //endmodule
  34. //模块、接口定义
  35. module uart_rx_tb();
  36. reg sys_clk;
  37. reg sys_rst_n;
  38. reg uart_rxd;
  39. wire locked;
  40. wire clkp0;
  41. wire PWMA_H;
  42. wire uart_rx_done;
  43. wire uart_rx_data;
  44. wire pwm3;
  45. wire pwm4;
  46. wire [31:0] left0;
  47. wire [31:0] right0;
  48. pwm_gen a1(sys_rst_n,sys_clk,1,2000000,left0,pwm3);
  49. pwm_gen a2(sys_rst_n,sys_clk,1,2000000,right0,pwm4);
  50. //例化被测试的接收模块
  51. uart_rx #(
  52. .BPS (9600), //波特率9600
  53. .SYS_CLK_FRE (50_000_000)//时钟频率50M
  54. )
  55. u_uart_rx(
  56. .sys_clk (clkp0),
  57. .sys_rst_n (sys_rst_n),
  58. .uart_rxd (uart_rxd),
  59. .uart_rx_done (uart_rx_done),
  60. .uart_rx_data (uart_rx_data),
  61. .left(left0),
  62. .right(right0)
  63. );
  64. clk_wiz_1 uu1
  65. (
  66. // Clock out ports
  67. .clk_out1(clkp0),
  68. .reset(sys_rst_n),
  69. .locked(locked),
  70. // Clock in ports
  71. .clk_in1(sys_clk)
  72. );
  73. // PWM1 a4(sys_clk,sys_rst_n,PWMA_H);
  74. localparam CNT=50_000_000/9600*20; //计算出传输每个时钟所需要的时间
  75. initial begin //传输8位数据 8'b01010101
  76. //初始时刻定义
  77. sys_clk <=1'b0;
  78. sys_rst_n<=1'b0;
  79. uart_rxd<=1'b1;
  80. #20 //系统开始工作
  81. sys_rst_n<=1'b1;
  82. #20 //系统开始工作
  83. sys_rst_n<=1'b0;
  84. #(CNT/2)
  85. uart_rxd<=1'b0;//开始传输起始位
  86. #CNT
  87. uart_rxd<=1'b1;//传输最低位,第1
  88. #CNT
  89. uart_rxd<=1'b0;//传输第2位
  90. #CNT
  91. uart_rxd<=1'b1;//传输第3
  92. #CNT
  93. uart_rxd<=1'b0; //传输第4位
  94. #CNT
  95. uart_rxd<=1'b1;//传输第5
  96. #CNT
  97. uart_rxd<=1'b0;//传输第6位
  98. #CNT
  99. uart_rxd<=1'b1;//传输第7
  100. #CNT
  101. uart_rxd<=1'b0; //传输最高位,第8位
  102. #CNT
  103. uart_rxd<=1'b1; //传输终止位
  104. //FF
  105. #(CNT/2)
  106. uart_rxd<=1'b1;//开始传输起始位
  107. #(CNT/2)
  108. uart_rxd<=1'b0;//开始传输起始位
  109. #CNT
  110. uart_rxd<=1'b1;//传输最低位,第1位
  111. #CNT
  112. uart_rxd<=1'b1;//传输第2
  113. #CNT
  114. uart_rxd<=1'b1;//传输第3位
  115. #CNT
  116. uart_rxd<=1'b1; //传输第4
  117. #CNT
  118. uart_rxd<=1'b1;//传输第5位
  119. #CNT
  120. uart_rxd<=1'b1;//传输第6
  121. #CNT
  122. uart_rxd<=1'b1;//传输第7位
  123. #CNT
  124. uart_rxd<=1'b1; //传输最高位,第8
  125. #CNT
  126. uart_rxd<=1'b1; //传输终止位
  127. // 左右电机的数
  128. #(CNT/2)
  129. uart_rxd<=1'b1;//开始传输起始位
  130. #(CNT/2)
  131. uart_rxd<=1'b0;//开始传输起始位
  132. #CNT
  133. uart_rxd<=1'b0;//传输最低位,第1
  134. #CNT
  135. uart_rxd<=1'b1;//传输第2位
  136. #CNT
  137. uart_rxd<=1'b0;//传输第3
  138. #CNT
  139. uart_rxd<=1'b1; //传输第4位
  140. #CNT
  141. uart_rxd<=1'b0;//传输第5
  142. #CNT
  143. uart_rxd<=1'b0;//传输第6位
  144. #CNT
  145. uart_rxd<=1'b0;//传输第7
  146. #CNT
  147. uart_rxd<=1'b0; //传输最高位,第8位
  148. #CNT
  149. uart_rxd<=1'b1; //传输终止位
  150. //FE
  151. #(CNT/2)
  152. uart_rxd<=1'b1;//开始传输起始位
  153. #(CNT/2)
  154. uart_rxd<=1'b0;//开始传输起始位
  155. #CNT
  156. uart_rxd<=1'b0;//传输最低位,第1位
  157. #CNT
  158. uart_rxd<=1'b1;//传输第2
  159. #CNT
  160. uart_rxd<=1'b1;//传输第3位
  161. #CNT
  162. uart_rxd<=1'b1; //传输第4
  163. #CNT
  164. uart_rxd<=1'b1;//传输第5位
  165. #CNT
  166. uart_rxd<=1'b1;//传输第6
  167. #CNT
  168. uart_rxd<=1'b1;//传输第7位
  169. #CNT
  170. uart_rxd<=1'b1; //传输最高位,第8
  171. #CNT
  172. uart_rxd<=1'b1; //传输终止位
  173. #(CNT) //00
  174. #(CNT/2)
  175. uart_rxd<=1'b1;//开始传输起始位
  176. #(CNT/2)
  177. uart_rxd<=1'b0;//开始传输起始位
  178. #CNT
  179. uart_rxd<=1'b0;//传输最低位,第1
  180. #CNT
  181. uart_rxd<=1'b0;//传输第2位
  182. #CNT
  183. uart_rxd<=1'b0;//传输第3
  184. #CNT
  185. uart_rxd<=1'b0; //传输第4位
  186. #CNT
  187. uart_rxd<=1'b0;//传输第5
  188. #CNT
  189. uart_rxd<=1'b0;//传输第6位
  190. #CNT
  191. uart_rxd<=1'b0;//传输第7
  192. #CNT
  193. uart_rxd<=1'b0; //传输最高位,第8位
  194. #CNT
  195. uart_rxd<=1'b1; //传输终止位
  196. //FD
  197. #(CNT/2)
  198. uart_rxd<=1'b1;//开始传输起始位
  199. #(CNT/2)
  200. uart_rxd<=1'b0;//开始传输起始位
  201. #CNT
  202. uart_rxd<=1'b1;//传输最低位,第1位
  203. #CNT
  204. uart_rxd<=1'b0;//传输第2
  205. #CNT
  206. uart_rxd<=1'b1;//传输第3位
  207. #CNT
  208. uart_rxd<=1'b1; //传输第4
  209. #CNT
  210. uart_rxd<=1'b1;//传输第5位
  211. #CNT
  212. uart_rxd<=1'b1;//传输第6
  213. #CNT
  214. uart_rxd<=1'b1;//传输第7位
  215. #CNT
  216. uart_rxd<=1'b1; //传输最高位,第8
  217. #CNT
  218. uart_rxd<=1'b1; //传输终止位
  219. //右
  220. #(CNT/2)
  221. uart_rxd<=1'b1;//开始传输起始位
  222. #(CNT/2)
  223. uart_rxd<=1'b0;//开始传输起始位
  224. #CNT
  225. uart_rxd<=1'b0;//传输最低位,第1
  226. #CNT
  227. uart_rxd<=1'b0;//传输第2位
  228. #CNT
  229. uart_rxd<=1'b1;//传输第3
  230. #CNT
  231. uart_rxd<=1'b0; //传输第4位
  232. #CNT
  233. uart_rxd<=1'b1;//传输第5
  234. #CNT
  235. uart_rxd<=1'b0;//传输第6位
  236. #CNT
  237. uart_rxd<=1'b0;//传输第7
  238. #CNT
  239. uart_rxd<=1'b0; //传输最高位,第8位
  240. #CNT
  241. uart_rxd<=1'b1; //传输终止位
  242. //FC
  243. #(CNT/2)
  244. uart_rxd<=1'b1;//开始传输起始位
  245. #(CNT/2)
  246. uart_rxd<=1'b0;//开始传输起始位
  247. #CNT
  248. uart_rxd<=1'b0;//传输最低位,第1位
  249. #CNT
  250. uart_rxd<=1'b0;//传输第2
  251. #CNT
  252. uart_rxd<=1'b1;//传输第3位
  253. #CNT
  254. uart_rxd<=1'b1; //传输第4
  255. #CNT
  256. uart_rxd<=1'b1;//传输第5位
  257. #CNT
  258. uart_rxd<=1'b1;//传输第6
  259. #CNT
  260. uart_rxd<=1'b1;//传输第7位
  261. #CNT
  262. uart_rxd<=1'b1; //传输最高位,第8
  263. #CNT
  264. uart_rxd<=1'b1; //传输终止位
  265. //00
  266. #(CNT/2)
  267. uart_rxd<=1'b1;//开始传输起始位
  268. #(CNT/2)
  269. uart_rxd<=1'b0;//开始传输起始位
  270. #CNT
  271. uart_rxd<=1'b0;//传输最低位,第1
  272. #CNT
  273. uart_rxd<=1'b0;//传输第2位
  274. #CNT
  275. uart_rxd<=1'b0;//传输第3
  276. #CNT
  277. uart_rxd<=1'b0; //传输第4位
  278. #CNT
  279. uart_rxd<=1'b0;//传输第5
  280. #CNT
  281. uart_rxd<=1'b0;//传输第6位
  282. #CNT
  283. uart_rxd<=1'b0;//传输第7
  284. #CNT
  285. uart_rxd<=1'b0; //传输最高位,第8位
  286. #CNT
  287. uart_rxd<=1'b1; //传输终止位
  288. end
  289. always begin
  290. #5 sys_clk=~sys_clk; //时钟20ns,100M
  291. end
  292. // always begin
  293. // #10 sys_clk=~sys_clk; //时钟20ns,50M
  294. //end
  295. endmodule

        以上便实现了FPGA的接收功能,此时FPGA可以接收FF--FE--FD--FC--的信号,其中--代表16进制数,FF后的16进制数乘100加FE后面的16进制数及为左电机的电机值,同理,FD后面的乘100加FC后面的为右电机的电机值,我们只需要在单片机上实现发送FF--FE--FD--FC--的信号的功能即可完成全部过程。 

       仿真图如下所示:

      从仿真可以看出实验非常成功,对应项目的无人船而言也十分成功。欢迎大家积极讨论留言!!!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/455844
推荐阅读
相关标签
  

闽ICP备14008679号