├── u_top_z-top_z.v
├── top_zhiwen_yuyin.v
├── 百度LBS开放平台显示的HTML代码
├── 显示.png
└── html代码.txt
├── gps.v
├── chuli.v
├── smg2.v
├── top_gy_26.v
├── x7seg_msg.v
├── bps_set.v
├── bps_set_115200.v
├── bps_set_9600.v
├── bps_set_lora.v
├── bps_set_gy_26.v
├── bps_set_57600.v
├── zhiwen.v
├── top_lora_tx.v
├── top_zhiwen.v
├── Top_gy_25_tx.v
├── top_uart_rx.v
├── top_uart_rx_gy_26.v
├── top_hongwai.v
├── Top_uart_tx_zhiwen.v
├── top_gps.v
├── div_25HZ.v
├── uart_bps.v
├── uart_bps_1.v
├── uart_bps_9600.v
├── lora_rx.v
├── top_rx_surf.v
├── control.v
├── HC_SR04.v
├── hc_sr042.v
├── uart_tx_dzj.v
├── 盲人家中板子的FPGA代码
├── bps_set.v
├── bps_set_115200.v
├── Top_uart_tx.v
├── lora.v
├── Top_uart_tx_dzj_test.v
├── Top_uart_tx_test.v
├── fangdou.v
├── Top_uart_tx_dzj.v
├── lora_rx.v
├── uart_tx.v
├── lora_rx_chuli.v
├── uart_rx_dzj_lora.v
├── x7seg_msg.v
├── uart_rx.v
├── lora_rx_test.v
└── uart_tx_dzj.v
├── TOP_GY_25.v
├── select_addr.v
├── top_xinlv.v
├── uart_tx_lora.v
├── uart_tx.v
├── tb_top.v
├── tp_z.v
├── top_bizhng.v
├── top2.v
├── top_music.v
├── uart_sentdata_mess.v
├── uart_receive.v
├── uart_receive_1.v
├── uart_receive_9600.v
├── uart_receive_xinlv.v
├── uart_rx.v
├── uart_rx_dzj.v
├── time_.v
├── top_calling.v
├── judge_Red_Green.v
├── top.v
├── data_extract.v
├── top_duanxin.v
├── shumaguan.v
├── bcd2.v
├── bin_bcd.v
├── GY25_RX.v
├── VGA.v
├── zhuti.v
├── bizhang.v
├── xinlv_rx.v
├── top_surf_net.v
├── calling.v
├── hongwai_rx.v
├── gsm.v
├── VGA_square.v
├── gps_rx.v
├── Arudino代码
└── Tricycle_For_Arduino.ino
└── pick_up_rx.v
/u_top_z-top_z.v:
--------------------------------------------------------------------------------
1 | module u_top_z-top_z( );
2 |
3 |
4 |
5 | endmodule
6 |
--------------------------------------------------------------------------------
/top_zhiwen_yuyin.v:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yuezhao1/ANLU_fpga/HEAD/top_zhiwen_yuyin.v
--------------------------------------------------------------------------------
/百度LBS开放平台显示的HTML代码/显示.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yuezhao1/ANLU_fpga/HEAD/百度LBS开放平台显示的HTML代码/显示.png
--------------------------------------------------------------------------------
/gps.v:
--------------------------------------------------------------------------------
1 | module gps_yuyin(
2 | input key,
3 | input clk,
4 | input rst_n,
5 | output reg [17:0]shijian
6 | );
7 | always@(posedge clk or negedge rst_n)
8 | begin
9 | if(~rst_n)
10 | shijian<=1'b0;
11 | else if(key)
12 | shijian<=18'd102444;
13 | end
14 |
15 | endmodule
--------------------------------------------------------------------------------
/chuli.v:
--------------------------------------------------------------------------------
1 | module chuli(
2 | input clk,
3 | input rst_n,
4 | input [7:0]angle,
5 |
6 | output reg [1:0]led
7 | );
8 | always@(posedge clk or negedge rst_n)
9 | begin
10 | if(!rst_n)
11 | led<=2'b00;
12 | else if(angle>=6'd45) //大于45度盲人将要摔倒
13 | led<=2'b01;
14 | else led<=2'b10;
15 | end
16 |
17 |
18 | endmodule
--------------------------------------------------------------------------------
/smg2.v:
--------------------------------------------------------------------------------
1 | module smg2(input [9:0] x,
2 | input clk,
3 | input rst_n,
4 | //output reg [6:0] smg_duan,
5 | //output reg [3:0] smg_wei,
6 | //output reg dp,
7 | output reg led0,
8 | output [9:0]hz
9 | );
10 |
11 | assign hz = x[3:0]*1 + x[7:4]*10 + x[9:8]*100;
12 |
13 |
14 | always@(posedge clk or negedge rst_n)
15 | if(!rst_n)
16 | led0 <= 0;
17 | else if(hz <=40)
18 | led0 <= 1;
19 | else
20 | led0 <= 0;
21 |
22 |
23 | endmodule
24 |
--------------------------------------------------------------------------------
/top_gy_26.v:
--------------------------------------------------------------------------------
1 | module top_gy_26(
2 | input flag_gy26,
3 | input clk,
4 | input rst,
5 | input data_rx,
6 | output RX232,
7 | output [9:0]jiaodu
8 | );
9 | Top_uart_tx_gy_26 a (
10 | .flag_gy26(flag_gy26),
11 | .clk(clk),
12 | .rst(rst),
13 | .RX232(RX232),
14 | .over_all(over_all),
15 | .over_rx(over_rx)
16 | );
17 | top_uart_rx_gy_26 b (
18 | .clk(clk),
19 | .rst(rst),
20 | .data_rx(data_rx),
21 | .jiaodu(jiaodu)
22 | );
23 |
24 | endmodule
25 |
--------------------------------------------------------------------------------
/x7seg_msg.v:
--------------------------------------------------------------------------------
1 | module x7seg_msg(
2 | input [9:0] x,
3 | input clk,
4 | input rst_n,
5 | //output reg [6:0] smg_duan,
6 | //output reg [3:0] smg_wei,
7 | //output reg dp,
8 | output reg led1,
9 | output [9:0]hq
10 | );
11 |
12 |
13 | assign hq = x[3:0]*1 + x[7:4]*10 + x[9:8]*100;
14 |
15 |
16 | always@(posedge clk or negedge rst_n)
17 | if(rst_n==0)
18 | led1 <= 0;
19 | else if(hq <= 60)
20 | led1 <= 1;
21 | else
22 | led1 <= 0;
23 | endmodule
24 |
--------------------------------------------------------------------------------
/bps_set.v:
--------------------------------------------------------------------------------
1 | module bps_set(
2 | input clk,
3 | input rst_n,
4 | input bps_start,
5 | output bps_clk
6 | );
7 | reg[12:0]cnt_bps;
8 | parameter bps=13'd5208; //(50_000_000/9600)
9 | always@(posedge clk or negedge rst_n)
10 | begin
11 | if(!rst_n) cnt_bps<= 13'd0;
12 | else if(cnt_bps==bps-1'b1) cnt_bps<= 13'd0;
13 | else if(bps_start) cnt_bps<= cnt_bps+1'b1;
14 | else cnt_bps<= 1'b0;
15 | end
16 | assign bps_clk=(cnt_bps==13'd2604)?1'b1:1'b0;
17 | endmodule
18 |
--------------------------------------------------------------------------------
/bps_set_115200.v:
--------------------------------------------------------------------------------
1 | module bps_set_115200(
2 | input clk,
3 | input rst_n,
4 | input bps_start,
5 | output bps_clk
6 | );
7 | reg[12:0]cnt_bps;
8 | parameter bps=13'd434; //(50_000_000/115200)
9 | always@(posedge clk or negedge rst_n)
10 | begin
11 | if(!rst_n) cnt_bps<= 13'd0;
12 | else if(cnt_bps==bps-1'b1) cnt_bps<= 13'd0;
13 | else if(bps_start) cnt_bps<= cnt_bps+1'b1;
14 | else cnt_bps<= 1'b0;
15 | end
16 | assign bps_clk=(cnt_bps==13'd217)?1'b1:1'b0;
17 | endmodule
--------------------------------------------------------------------------------
/bps_set_9600.v:
--------------------------------------------------------------------------------
1 | module bps_set_9600(
2 | input clk,
3 | input rst_n,
4 | input bps_start,
5 | output bps_clk
6 | );
7 | reg[12:0]cnt_bps;
8 | parameter bps=13'd5208; //(50_000_000/9600)
9 | always@(posedge clk or negedge rst_n)
10 | begin
11 | if(!rst_n) cnt_bps<= 13'd0;
12 | else if(cnt_bps==bps-1'b1) cnt_bps<= 13'd0;
13 | else if(bps_start) cnt_bps<= cnt_bps+1'b1;
14 | else cnt_bps<= 1'b0;
15 | end
16 | assign bps_clk=(cnt_bps==13'd2604)?1'b1:1'b0;
17 | endmodule
18 |
--------------------------------------------------------------------------------
/bps_set_lora.v:
--------------------------------------------------------------------------------
1 | module bps_set_lora(
2 | input clk,
3 | input rst_n,
4 | input bps_start,
5 | output bps_clk
6 | );
7 | reg[12:0]cnt_bps;
8 | parameter bps=13'd434; //(50_000_000/9600)
9 | always@(posedge clk or negedge rst_n)
10 | begin
11 | if(!rst_n) cnt_bps<= 13'd0;
12 | else if(cnt_bps==bps-1'b1) cnt_bps<= 13'd0;
13 | else if(bps_start) cnt_bps<= cnt_bps+1'b1;
14 | else cnt_bps<= 1'b0;
15 | end
16 | assign bps_clk=(cnt_bps==13'd217)?1'b1:1'b0;
17 | endmodule
18 |
--------------------------------------------------------------------------------
/bps_set_gy_26.v:
--------------------------------------------------------------------------------
1 | module bps_set_gy_26(
2 | input clk,
3 | input rst,
4 | input bps_start,
5 | output bps_clk
6 | );
7 | reg[12:0]cnt_bps;
8 | parameter bps=13'd5208; //(50_000_000/9600)
9 | always@(posedge clk or negedge rst)
10 | begin
11 | if(!rst) cnt_bps<= 13'd0;
12 | else if(cnt_bps==bps-1'b1) cnt_bps<= 13'd0;
13 | else if(bps_start) cnt_bps<= cnt_bps+1'b1;
14 | else cnt_bps<= 1'b0;
15 | end
16 | assign bps_clk=(cnt_bps==13'd2604)?1'b1:1'b0;
17 |
18 |
19 | endmodule
20 |
--------------------------------------------------------------------------------
/bps_set_57600.v:
--------------------------------------------------------------------------------
1 | module bps_set_57600(
2 | input clk,
3 | input rst_n,
4 | input bps_start,
5 | output bps_clk
6 | );
7 | reg[12:0]cnt_bps;
8 | parameter bps=13'd868; //(50_000_000/57600)
9 | always@(posedge clk or negedge rst_n)
10 | begin
11 | if(!rst_n) cnt_bps<= 13'd0;
12 | else if(cnt_bps==bps-1'b1) cnt_bps<= 13'd0;
13 | else if(bps_start) cnt_bps<= cnt_bps+1'b1;
14 | else cnt_bps<= 1'b0;
15 | end
16 | assign bps_clk=(cnt_bps==13'd434)?1'b1:1'b0; //868/2=434
17 | endmodule
18 |
--------------------------------------------------------------------------------
/zhiwen.v:
--------------------------------------------------------------------------------
1 | module zhiwen(
2 | input chumo,
3 | input over_all,
4 | input zhongzhi,
5 | //input clk,
6 | //input rst_n,
7 |
8 | output reg tx_en
9 | );
10 | /*reg [25:0]cnt;
11 | always@(posedge clk or negedge rst_n) //这里需要有1s的延迟 再检测指纹
12 | begin
13 | if(!rst_n)
14 | cnt<=1'b0;
15 | else if(cnt==26'd49_999)
16 | cnt<=1'b0;
17 | else cnt<=cnt+1'b1;
18 | end*/
19 | always@(*)
20 | begin
21 | if(zhongzhi)
22 | tx_en=1'b1;
23 | else if(over_all)
24 | tx_en=1'b0;
25 | else if(chumo/*&cnt==26'd49_999*/)
26 | tx_en=1'b1;
27 | else tx_en=1'b0;
28 | end
29 | endmodule
30 |
--------------------------------------------------------------------------------
/top_lora_tx.v:
--------------------------------------------------------------------------------
1 | module top_lora_tx(
2 | input clk,
3 | input rst_n,
4 | input send_en,
5 | input [7:0] data_rx,
6 |
7 | output RX232,
8 | output over_rx
9 | );
10 |
11 | wire bps_start_1;
12 |
13 | bps_set_lora u_bps_set_lora(
14 | .clk(clk),
15 | .rst_n(rst_n),
16 | .bps_start(bps_start_1),
17 | .bps_clk(bps_clk)
18 | );
19 |
20 | uart_tx_lora u_uart_tx_lora(
21 | .clk(clk),
22 | .bps_clk(bps_clk),
23 | .send_en(send_en),
24 | .rst_n(rst_n),
25 | .data_rx(data_rx),
26 | .RX232(RX232),
27 | .over_rx(over_rx),
28 | .bps_start(bps_start_1)
29 | );
30 |
31 |
32 | endmodule
33 |
--------------------------------------------------------------------------------
/top_zhiwen.v:
--------------------------------------------------------------------------------
1 | module top_zhiwen(
2 | input clk,
3 | input rst_n,
4 | input chumo,
5 | input data_rx,
6 |
7 | output RX232,
8 | output [1:0]flag
9 |
10 | );
11 | Top_uart_tx_zhiwen a (
12 | .flag(tx_en),
13 | .clk(clk),
14 | .rst_n(rst_n),
15 | .RX232(RX232),
16 | .over_rx(over_rx),
17 | .over_all(over_all)
18 | );
19 | zhiwen ab (
20 | .zhongzhi(zhongzhi),
21 | .chumo(chumo),
22 | .over_all(over_all),
23 | .tx_en(tx_en)
24 | );
25 | top_uart_rx abc (
26 | .clk(clk),
27 | .rst_n(rst_n),
28 | .data_rx(data_rx),
29 | .flag(flag)
30 | );
31 | assign zhongzhi = flag[0];
32 |
33 |
34 |
35 | endmodule
36 |
--------------------------------------------------------------------------------
/Top_gy_25_tx.v:
--------------------------------------------------------------------------------
1 | module Top_gy_25_tx(
2 | input clk,
3 | input rst_n,
4 |
5 | output RX232,
6 | output over_rx,
7 | output over_all
8 | );
9 | wire [7:0]data_rx;
10 | uart_tx_dzj a (
11 | .clk(clk),
12 | .rst_n(rst_n),
13 | .over_tx(over_rx),
14 | .data_rx(data_rx),
15 | .send_en(send_en),
16 | .over_all(over_all)
17 | );
18 | uart_tx_GY25 abc (
19 | .clk(clk),
20 | .bps_clk(bps_clk),
21 | .send_en(send_en),
22 | .rst_n(rst_n),
23 | .data_rx(data_rx),
24 | .RX232(RX232),
25 | .over_rx(over_rx),
26 | .bps_start(bps_start)
27 | );
28 | bps_set_115200 abcd (
29 | .clk(clk),
30 | .rst_n(rst_n),
31 | .bps_start(bps_start),
32 | .bps_clk(bps_clk)
33 | );
34 |
35 |
36 | endmodule
--------------------------------------------------------------------------------
/top_uart_rx.v:
--------------------------------------------------------------------------------
1 | module top_uart_rx(
2 | input clk,
3 | input rst_n,
4 | input data_rx,
5 | //input over_all,
6 | output [1:0]flag,
7 | output over_rx
8 | );
9 | wire [7:0]data_tx;
10 | bps_set_57600 a (
11 | .clk(clk),
12 | .rst_n(rst_n),
13 | .bps_start(bps_start),
14 | .bps_clk(bps_clk)
15 | );
16 | uart_rx ab (
17 | .nedge(nedge),
18 | .clk(clk),
19 | .rst_n(rst_n),
20 | .bps_clk(bps_clk),
21 | .data_rx(data_rx),
22 | .data_tx(data_tx),
23 | .over_rx(over_rx),
24 | .bps_start(bps_start)
25 | );
26 | uart_rx_dzj_zhiwen abc (
27 | .clk(clk),
28 | //.over_all(over_all),
29 | .rst_n(rst_n),
30 | .data_tx(data_tx),
31 | .nedge(nedge),
32 | .over_rx(over_rx),
33 | .flag(flag)
34 | );
35 | endmodule
36 |
--------------------------------------------------------------------------------
/top_uart_rx_gy_26.v:
--------------------------------------------------------------------------------
1 | module top_uart_rx_gy_26(
2 | input clk,
3 | input rst,
4 | input data_rx,
5 |
6 | output [9:0] jiaodu,
7 | output over_rx
8 | );
9 |
10 | wire [7:0]data_tx;
11 |
12 | bps_set_gy_26 a (
13 | .clk(clk),
14 | .rst(rst),
15 | .bps_start(bps_start),
16 | .bps_clk(bps_clk)
17 | );
18 | uart_rx_gy_26 ab (
19 | .nedge(nedge),
20 | .clk(clk),
21 | .rst(rst),
22 | .bps_clk(bps_clk),
23 | .data_rx(data_rx),
24 | .data_tx(data_tx),
25 | .over_rx(over_rx),
26 | .bps_start(bps_start)
27 | );
28 | uart_rx_dzj_gy_26 abc (
29 | .clk(clk),
30 | .rst(rst),
31 | .data_tx(data_tx),
32 | .over_rx(over_rx),
33 | .nedge(nedge),
34 | .jiaodu(jiaodu)
35 | );
36 |
37 |
38 | endmodule
39 |
--------------------------------------------------------------------------------
/top_hongwai.v:
--------------------------------------------------------------------------------
1 | module top_hongwai(
2 | input clk,
3 | input rst_n,
4 | input data_rx,
5 |
6 | output [1:0] flag_tu_ao
7 | );
8 |
9 | wire [7:0] data_tx;
10 | wire rx_int;
11 |
12 | hongwai_rx u_hongwai_rx (
13 | .clk(clk),
14 | .rst_n(rst_n),
15 | .data_rx(data_tx),
16 | .rx_int(rx_int),
17 | .flag_tu_ao(flag_tu_ao)
18 | );
19 |
20 | uart_bps_9600 u_uart_bps_9600 (
21 | .clk(clk),
22 | .rst_n(rst_n),
23 | .cnt_start(bps_start),
24 | .bps_sig(clk_bps)
25 | );
26 |
27 | uart_receive u_uart_receive (
28 | .clk(clk),
29 | .rst_n(rst_n),
30 | .clk_bps(clk_bps),
31 | .data_rx(data_rx),
32 |
33 | .rx_int(rx_int),
34 | .data_tx(data_tx),
35 | .bps_start(bps_start)
36 | );
37 |
38 |
39 | endmodule
40 |
--------------------------------------------------------------------------------
/Top_uart_tx_zhiwen.v:
--------------------------------------------------------------------------------
1 | module Top_uart_tx_zhiwen(
2 | input flag,
3 | input clk,
4 | input rst_n,
5 |
6 | output RX232,
7 | output over_rx,
8 | output over_all
9 | );
10 | wire [7:0]data_rx;
11 | uart_tx_dzj_zhiwen a (
12 | .flag(flag),
13 | .clk(clk),
14 | .rst_n(rst_n),
15 | .over_tx(over_rx),
16 | .data_rx(data_rx),
17 | .send_en(send_en),
18 | .over_all(over_all)
19 | );
20 | uart_tx abc (
21 | .clk(clk),
22 | .bps_clk(bps_clk),
23 | .send_en(send_en),
24 | .rst_n(rst_n),
25 | .data_rx(data_rx),
26 | .RX232(RX232),
27 | .over_rx(over_rx),
28 | .bps_start(bps_start)
29 | );
30 | bps_set_57600 abcd (
31 | .clk(clk),
32 | .rst_n(rst_n),
33 | .bps_start(bps_start),
34 | .bps_clk(bps_clk)
35 | );
36 |
37 |
38 | endmodule
--------------------------------------------------------------------------------
/top_gps.v:
--------------------------------------------------------------------------------
1 | module top_gps(
2 | input clk,
3 | input rst_n,
4 | input data_rx,
5 |
6 | output [383:0] data_rx_end
7 | );
8 | wire [7:0]data_tx;
9 | gps_rx a (
10 | .clk(clk),
11 | .rst_n(rst_n),
12 | .data_rx(data_tx),
13 | .rx_int(rx_int),
14 |
15 | .data_rx_end(data_rx_end),
16 | .ymr_out(ymr_out),
17 | .time_out(time_out)
18 | );
19 |
20 | uart_bps_9600 u_uart_bps_9600 (
21 | .clk(clk),
22 | .rst_n(rst_n),
23 | .cnt_start(bps_start),
24 |
25 | .bps_sig(clk_bps)
26 | );
27 |
28 | uart_receive_9600 u_uart_receive_9600 (
29 | .clk(clk),
30 | .rst_n(rst_n),
31 | .clk_bps(clk_bps),
32 | .data_rx(data_rx),
33 |
34 | .rx_int(rx_int),
35 | .data_tx(data_tx),
36 | .bps_start(bps_start)
37 | );
38 |
39 | endmodule
40 |
--------------------------------------------------------------------------------
/div_25HZ.v:
--------------------------------------------------------------------------------
1 | `timescale 1ns / 1ps
2 | //////////////////////////////////////////////////////////////////////////////////
3 | // Company:
4 | // Engineer:
5 | //
6 | // Create Date: 22:34:21 11/02/2019
7 | // Design Name:
8 | // Module Name: div_25HZ
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 div_25HZ(
22 | input clk,
23 | input rst_n,
24 |
25 | output reg VGA_clk
26 | );
27 |
28 | //2分频
29 | always @(posedge clk or negedge rst_n)begin
30 | if(!rst_n)
31 | VGA_clk <= 1'b0;
32 | else
33 | VGA_clk <= ~VGA_clk;
34 | end
35 | endmodule
36 |
--------------------------------------------------------------------------------
/uart_bps.v:
--------------------------------------------------------------------------------
1 | module uart_bps(clk,rst_n,cnt_start,bps_sig
2 | );
3 | input clk;
4 | input rst_n;
5 | input cnt_start;
6 | output bps_sig;
7 |
8 | reg [12:0]cnt_bps;
9 | wire bps_sig;
10 |
11 | parameter bps_t = 13'd433;//5207
12 |
13 | always@(posedge clk or negedge rst_n)
14 | begin
15 | if(!rst_n)
16 | begin
17 | cnt_bps <= 13'd0;
18 | end
19 | else if(cnt_bps == bps_t)
20 | begin
21 | cnt_bps <= 13'd0;
22 | end
23 | else if(cnt_start)
24 | begin
25 | cnt_bps <= cnt_bps + 1'b1;
26 | end
27 | else
28 | begin
29 | cnt_bps <= 1'b0;
30 | end
31 | end
32 |
33 | assign bps_sig = (cnt_bps == 13'd217) ? 1'b1 : 1'b0; //将采集数据的时刻放在波特率计数器每次循环计数的中间位置
34 |
35 | endmodule
--------------------------------------------------------------------------------
/uart_bps_1.v:
--------------------------------------------------------------------------------
1 | module uart_bps_1(clk,rst_n,cnt_start,bps_sig
2 | );
3 | input clk;
4 | input rst_n;
5 | input cnt_start;
6 | output bps_sig;
7 |
8 | reg [12:0]cnt_bps;
9 | wire bps_sig;
10 |
11 | parameter bps_t = 13'd5207;
12 |
13 | always@(posedge clk or negedge rst_n)
14 | begin
15 | if(!rst_n)
16 | begin
17 | cnt_bps <= 13'd0;
18 | end
19 | else if(cnt_bps == bps_t)
20 | begin
21 | cnt_bps <= 13'd0;
22 | end
23 | else if(cnt_start)
24 | begin
25 | cnt_bps <= cnt_bps + 1'b1;
26 | end
27 | else
28 | begin
29 | cnt_bps <= 1'b0;
30 | end
31 | end
32 |
33 | assign bps_sig = (cnt_bps == 13'd2604) ? 1'b1 : 1'b0; //将采集数据的时刻放在波特率计数器每次循环计数的中间位置
34 |
35 | endmodule
--------------------------------------------------------------------------------
/uart_bps_9600.v:
--------------------------------------------------------------------------------
1 | module uart_bps_9600(clk,rst_n,cnt_start,bps_sig
2 | );
3 | input clk;
4 | input rst_n;
5 | input cnt_start;
6 | output bps_sig;
7 |
8 | reg [12:0]cnt_bps;
9 | wire bps_sig;
10 |
11 | parameter bps_t = 13'd5207;
12 |
13 | always@(posedge clk or negedge rst_n)
14 | begin
15 | if(!rst_n)
16 | begin
17 | cnt_bps <= 13'd0;
18 | end
19 | else if(cnt_bps == bps_t)
20 | begin
21 | cnt_bps <= 13'd0;
22 | end
23 | else if(cnt_start)
24 | begin
25 | cnt_bps <= cnt_bps + 1'b1;
26 | end
27 | else
28 | begin
29 | cnt_bps <= 1'b0;
30 | end
31 | end
32 |
33 | assign bps_sig = (cnt_bps == 13'd2604) ? 1'b1 : 1'b0; //将采集数据的时刻放在波特率计数器每次循环计数的中间位置
34 |
35 | endmodule
--------------------------------------------------------------------------------
/lora_rx.v:
--------------------------------------------------------------------------------
1 | module lora_rx(
2 | input clk,
3 | input rst_n,
4 | input data_rx,
5 | input over_all,
6 |
7 | output [1:0] flag_lora,
8 | output over_rx
9 |
10 | );
11 | wire [7:0]data_tx;
12 |
13 | bps_set_115200 a (
14 | .clk(clk),
15 | .rst_n(rst_n),
16 | .bps_start(bps_start),
17 | .bps_clk(bps_clk)
18 | );
19 | uart_rx ab (
20 | .nedge(nedge),
21 | .clk(clk),
22 | .rst_n(rst_n),
23 | .bps_clk(bps_clk),
24 | .data_rx(data_rx),
25 | .data_tx(data_tx),
26 | .over_rx(over_rx),
27 | .bps_start(bps_start)
28 | );
29 | uart_rx_dzj_lora abc (
30 | .clk(clk),
31 | .over_all(over_all),
32 | .rst_n(rst_n),
33 | .data_tx(data_tx),
34 | .nedge(nedge),
35 | .over_rx(over_rx),
36 | .flag_lora(flag_lora)
37 | );
38 |
39 |
40 | endmodule
41 |
--------------------------------------------------------------------------------
/top_rx_surf.v:
--------------------------------------------------------------------------------
1 | module top_rx_surf(
2 | input clk,
3 | input rst_n,
4 | input data_rx,
5 |
6 | output flag_en_1,//存使能
7 | output [7:0] addr_daohang_data,
8 | output [92:0] data_rx_end_internet
9 | );
10 |
11 |
12 | wire [7:0] data_tx;
13 |
14 |
15 | surf_internet_rx u_surf_internet_rx (
16 | .clk(clk),
17 | .rst_n(rst_n),
18 | .data_rx(data_tx),
19 | .rx_int(rx_int),
20 | .flag_en_1(flag_en_1),
21 | .addr_daohang_data(addr_daohang_data),
22 | .data_rx_end_internet(data_rx_end_internet)
23 | );
24 |
25 | uart_bps_1 u_uart_bps_1 (
26 | .clk(clk),
27 | .rst_n(rst_n),
28 | .cnt_start(bps_start),
29 | .bps_sig(clk_bps)
30 | );
31 |
32 | uart_receive_1 u_uart_receive_1 (
33 | .clk(clk),
34 | .rst_n(rst_n),
35 | .clk_bps(clk_bps),
36 | .data_rx(data_rx),
37 |
38 | .rx_int(rx_int),
39 | .data_tx(data_tx),
40 | .bps_start(bps_start)
41 | );
42 |
43 | endmodule
44 |
--------------------------------------------------------------------------------
/control.v:
--------------------------------------------------------------------------------
1 | module control(clk,rst,led0,led1,dianji0,dianji2,dianji,led2,led3,flag1
2 | );
3 | input clk;
4 | input rst;
5 | input led0;//z
6 | input led1;//q
7 | input flag1;
8 | input [1:0]dianji0;
9 | input [1:0]dianji2;
10 | output reg[1:0]dianji;
11 | output reg led2;
12 | output reg led3;
13 | always@(posedge clk or negedge rst)
14 | if(!rst)
15 | dianji <= 2'd0;
16 | else if(led0==0&&led1==0 && flag1 == 0)
17 | begin
18 | dianji <= dianji0;
19 | led2 <= 1;
20 | led3 <= 0;
21 | end
22 | else if((led1==1||led0 == 1)&& flag1 ==1 )
23 | begin
24 | dianji <= dianji2;
25 | led3 <= 1;
26 | led2 <= 0;
27 | end
28 | else
29 | begin
30 | dianji <= dianji;
31 | led2 <= 0;
32 | led3 <= 0;
33 | end
34 |
35 | /*always@(posedge clk or negedge rst)
36 | if(!rst)
37 | begin
38 | led2 <= 0;
39 | led3 <= 0;
40 | end
41 | else if(dianji == dianji0)
42 | led2 <= 1;
43 | else if(dianji == dianji2)
44 | led3 <= 1;
45 | else
46 | begin
47 | led2 <= 0;
48 | led3 <= 0;
49 | end*/
50 | endmodule
51 |
--------------------------------------------------------------------------------
/HC_SR04.v:
--------------------------------------------------------------------------------
1 | module HC_SR04(
2 | input clk,
3 | input rst_n,
4 | input en,
5 | input echo ,
6 | output reg trig,
7 | output [8:0] dis
8 | );
9 | reg [23:0]cnt;
10 | reg [31:0] cnt_t;
11 | parameter T=24'd15000000;//300ms
12 | parameter C=10'd600;
13 | always@(posedge clk or negedge rst_n)
14 | begin
15 | if(!rst_n)
16 | cnt<=0;
17 | else if(cnt==T-1)
18 | cnt<=0;
19 | else
20 | cnt<=cnt+1;
21 |
22 | end
23 |
24 | always@(posedge clk or negedge rst_n)
25 | begin
26 | if(!rst_n)
27 | trig<=0;
28 | else if(cnt>=1&&cnt<=C)
29 | trig<=1;
30 | else
31 | trig<=0;
32 | end
33 |
34 | always@(posedge clk or negedge rst_n)
35 | begin
36 | if(!rst_n)
37 | cnt_t<=0;
38 | else if(echo==1)
39 | cnt_t<=cnt_t+1;
40 | else if(cnt==T-1)
41 | cnt_t<=0;
42 | else
43 | cnt_t<=cnt_t;
44 | end
45 | reg [31:0]distance ;
46 | always@(posedge clk or negedge rst_n)
47 | begin
48 | if(!rst_n)
49 | distance<=0;
50 | else if(cnt==T-2'd2)
51 | distance<=(cnt_t*11)>>15;
52 | end
53 |
54 | assign dis=distance;
55 |
56 | endmodule
57 |
--------------------------------------------------------------------------------
/hc_sr042.v:
--------------------------------------------------------------------------------
1 | module hc_sr042(input clk,
2 | input rst_n,
3 | input en,
4 | input echo2 ,
5 | output reg trig2,
6 | output [8:0] dis
7 | );
8 | reg [23:0]cnt;
9 | reg [31:0] cnt_t;
10 | parameter T=24'd15000000;//300ms
11 | parameter C=10'd600;
12 | always@(posedge clk or negedge rst_n)
13 | begin
14 | if(!rst_n)
15 | cnt<=0;
16 | else if(cnt==T-1)
17 | cnt<=0;
18 | else
19 | cnt<=cnt+1;
20 |
21 | end
22 |
23 | always@(posedge clk or negedge rst_n)
24 | begin
25 | if(!rst_n)
26 | trig2<=0;
27 | else if(cnt>=1&&cnt<=C)
28 | trig2<=1;
29 | else
30 | trig2<=0;
31 | end
32 |
33 | always@(posedge clk or negedge rst_n)
34 | begin
35 | if(!rst_n)
36 | cnt_t<=0;
37 | else if(echo2==1)
38 | cnt_t<=cnt_t+1;
39 | else if(cnt==T-1)
40 | cnt_t<=0;
41 | else
42 | cnt_t<=cnt_t;
43 | end
44 | reg [31:0]distance ;
45 | always@(posedge clk or negedge rst_n)
46 | begin
47 | if(!rst_n)
48 | distance<=0;
49 | else if(cnt==T-2'd2)
50 | distance<=(cnt_t*11)>>15;
51 | end
52 |
53 | assign dis=distance;
54 |
55 |
56 | endmodule
57 |
--------------------------------------------------------------------------------
/uart_tx_dzj.v:
--------------------------------------------------------------------------------
1 | module uart_tx_dzj(
2 | input clk,
3 | input rst_n,
4 | input over_tx,
5 |
6 | output reg [7:0]data_rx,
7 | output reg send_en,
8 | output reg over_all
9 | );
10 | reg[3:0] cnt; //最大要记到14 I like FPGA,too 一共14个字符
11 | always@(posedge clk or negedge rst_n) //数每个字符结束 递 下一个字符的计数器
12 | begin
13 | if(!rst_n)begin
14 | cnt<=1'b0;over_all<=1'b0;end
15 | else if(cnt==4'd5)
16 | cnt<=1'b0;
17 | else if(cnt==4'd4)
18 | over_all<=1'b1;
19 | else if(over_tx)
20 | cnt<=cnt+1'b1;
21 | else begin cnt<=cnt; over_all<=over_all; end
22 | end
23 |
24 | always@(posedge clk or negedge rst_n)
25 | begin
26 | if(!rst_n)
27 | send_en<=1'b1;
28 | else if(cnt==4'b0011&over_tx)
29 | send_en<=1'b0;
30 | else send_en<=send_en;
31 | end
32 |
33 | always@(*)
34 | begin
35 | case(cnt)
36 | 4'd1 : data_rx <= 8'hA5; //0xA5+0x51:查询模式,直接返回角度值,需每次读取都发送
37 | 4'd2 : data_rx <= 8'h54; //矫正俯仰角0度
38 | 4'd3 : data_rx <= 8'hA5; //0xA5+0x52:自动模式,直接返回角度值,只需要初始化时发一次
39 | 4'd4 : data_rx <= 8'h52;
40 | endcase
41 | end
42 | endmodule
--------------------------------------------------------------------------------
/盲人家中板子的FPGA代码/bps_set.v:
--------------------------------------------------------------------------------
1 | `timescale 1ns / 1ps
2 | //////////////////////////////////////////////////////////////////////////////////
3 | // Company:
4 | // Engineer:
5 | //
6 | // Create Date: 17:08:22 11/20/2018
7 | // Design Name:
8 | // Module Name: bps_set
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 bps_set(
22 | input clk,
23 | input rst_n,
24 | input bps_start,
25 | output bps_clk
26 | );
27 | reg[12:0]cnt_bps;
28 | parameter bps=13'd434; //(50_000_000/9600)
29 | always@(posedge clk or negedge rst_n)
30 | begin
31 | if(!rst_n) cnt_bps<= 13'd0;
32 | else if(cnt_bps==bps-1'b1) cnt_bps<= 13'd0;
33 | else if(bps_start) cnt_bps<= cnt_bps+1'b1;
34 | else cnt_bps<= 1'b0;
35 | end
36 | assign bps_clk=(cnt_bps==13'd217)?1'b1:1'b0;
37 | endmodule
38 |
--------------------------------------------------------------------------------
/盲人家中板子的FPGA代码/bps_set_115200.v:
--------------------------------------------------------------------------------
1 | `timescale 1ns / 1ps
2 | //////////////////////////////////////////////////////////////////////////////////
3 | // Company:
4 | // Engineer:
5 | //
6 | // Create Date: 17:08:22 11/20/2018
7 | // Design Name:
8 | // Module Name: bps_set_9600
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 bps_set_115200(
22 | input clk,
23 | input rst_n,
24 | input bps_start,
25 | output bps_clk
26 | );
27 | reg[12:0]cnt_bps;
28 | parameter bps=13'd434; //(50_000_000/115200)
29 | always@(posedge clk or negedge rst_n)
30 | begin
31 | if(!rst_n) cnt_bps<= 13'd0;
32 | else if(cnt_bps==bps-1'b1) cnt_bps<= 13'd0;
33 | else if(bps_start) cnt_bps<= cnt_bps+1'b1;
34 | else cnt_bps<= 1'b0;
35 | end
36 | assign bps_clk=(cnt_bps==13'd217)?1'b1:1'b0;
37 | endmodule
38 |
--------------------------------------------------------------------------------
/盲人家中板子的FPGA代码/Top_uart_tx.v:
--------------------------------------------------------------------------------
1 | `timescale 1ns / 1ps
2 | //////////////////////////////////////////////////////////////////////////////////
3 | // Company:
4 | // Engineer:
5 | //
6 | // Create Date: 19:40:43 11/24/2018
7 | // Design Name:
8 | // Module Name: Top_uart_tx
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 Top_uart_tx(
22 | input clk,
23 | input send_en,
24 | input rst_n,
25 | input[7:0]data_rx,
26 |
27 | output RX232,
28 | output over_rx //结束后会有一个高电平
29 | );
30 | bps_set a (
31 | .clk(clk),
32 | .rst_n(rst_n),
33 | .bps_start(bps_start),
34 | .bps_clk(bps_clk)
35 | );
36 | uart_tx ab (
37 | .clk(clk),
38 | .bps_clk(bps_clk),
39 | .send_en(send_en),
40 | .rst_n(rst_n),
41 | .data_rx(data_rx),
42 | .RX232(RX232),
43 | .over_rx(over_rx),
44 | .bps_start(bps_start)
45 | );
46 |
47 |
48 |
49 |
50 | endmodule
51 |
--------------------------------------------------------------------------------
/TOP_GY_25.v:
--------------------------------------------------------------------------------
1 | module TOP_GY_25(
2 | input clk_24m,
3 | input rst_n,
4 | input rs232_rx,
5 |
6 | output RX232,
7 | output [1:0]led
8 | );
9 | wire [7:0]bps_cnt;
10 | wire [7:0]data_byte;
11 | wire [7:0]angle;
12 |
13 | wire clk_72m;
14 | wire clk_50m;
15 |
16 |
17 | PLL_50M_GY_25 u_PLL_50M_GY_25(
18 | .refclk(clk_24m),
19 | .clk0_out(clk_72m),
20 | .clk1_out(clk_50m)
21 | );
22 |
23 |
24 |
25 | GY25_RX a (
26 | .clk(clk_50m),
27 | .rst_n(rst_n),
28 | .rs232_rx(rs232_rx),
29 | .data_byte(data_byte),
30 | .rx_done(rx_done),
31 | .bps_cnt(bps_cnt)
32 | );
33 |
34 | data_extract ab (
35 | .clk(clk_50m),
36 | .rst_n(rst_n),
37 | .date_byte(data_byte),
38 | .angle(angle),
39 | .rx_done(rx_done),
40 | .bps_cnt(bps_cnt),
41 | .byte1(byte1)
42 | );
43 |
44 |
45 |
46 | Top_gy_25_tx abc (
47 | .clk(clk_50m),
48 | .rst_n(rst_n),
49 | .RX232(RX232),
50 | .over_rx(over_rx),
51 | .over_all(over_all)
52 | );
53 |
54 | chuli abcd (
55 | .clk(clk_50m),
56 | .rst_n(rst_n),
57 | .angle(angle),
58 | .led(led)
59 | );
60 |
61 |
62 |
63 | endmodule
64 |
--------------------------------------------------------------------------------
/select_addr.v:
--------------------------------------------------------------------------------
1 | `timescale 1ns / 1ps
2 | //////////////////////////////////////////////////////////////////////////////////
3 | // Company:
4 | // Engineer:
5 | //
6 | // Create Date: 22:35:57 11/02/2019
7 | // Design Name:
8 | // Module Name: select_addr
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 select_addr(
22 | input clk,
23 | input rst_n,
24 | input [15:0] flag_square_begin,
25 | input [15:0] rom_addr13,//VGA_square
26 | input [15:0] rom_addr16,//VGA_bsprite
27 |
28 | output [15:0] rom_addr //选择后的地址
29 |
30 | );
31 |
32 |
33 | assign rom_addr = (flag_square_begin > 3*200)? rom_addr16 : rom_addr13;
34 |
35 |
36 |
37 | //3行像素数量
38 | //always @ (posedge clk or negedge rst_n)begin
39 | // if(!rst_n)
40 | // rom_addr <= 13'd0;
41 | // else if(flag_square_begin > 3*200)
42 | // rom_addr <= rom_addr16;
43 | // else
44 | // rom_addr <= rom_addr13;
45 | // end
46 |
47 |
48 |
49 | endmodule
50 |
51 |
--------------------------------------------------------------------------------
/盲人家中板子的FPGA代码/lora.v:
--------------------------------------------------------------------------------
1 | `timescale 1ns / 1ps
2 | //////////////////////////////////////////////////////////////////////////////////
3 | // Company:
4 | // Engineer:
5 | //
6 | // Create Date: 22:18:20 11/21/2019
7 | // Design Name:
8 | // Module Name: lora
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 lora(
22 | input [3:0]in_key_en,
23 | input clk,
24 | input rst_n,
25 | input co,
26 | input zhendong,
27 | input data_rx,
28 |
29 | output [6:0] smg_duan,
30 | output [3:0] smg_wei,
31 | output dp,
32 | output RX232,
33 | output fengshan
34 | );
35 | Top_uart_tx_dzj tx (
36 | .in_key_en(in_key_en),
37 | .clk(clk),
38 | .rst_n(rst_n),
39 | .co(co),
40 | .zhendong(zhendong),
41 | .RX232(RX232),
42 | .over_rx(),
43 | .fengshan(fengshan)
44 | );
45 | lora_rx rx (
46 | .clk(clk),
47 | .rst_n(rst_n),
48 | .data_rx(data_rx),
49 | .smg_duan(smg_duan),
50 | .smg_wei(smg_wei),
51 | .dp(dp)
52 | );
53 | endmodule
54 |
--------------------------------------------------------------------------------
/top_xinlv.v:
--------------------------------------------------------------------------------
1 | module top_xinlv(
2 | input clk,
3 | input rst_n,
4 | input data_rx,
5 |
6 | output reg [7:0] xinlv
7 | );
8 |
9 | wire [7:0] data_tx;
10 | wire rx_int;
11 | wire [7:0] xinlv_1;
12 |
13 | reg [25:0] cnt;
14 |
15 | always @(posedge clk or negedge rst_n)begin
16 | if(!rst_n)
17 | cnt <= 26'd0;
18 | else if(cnt == 26'd5000_0000 - 1)
19 | cnt <= 26'd0;
20 | else
21 | cnt <= cnt + 1;
22 | end
23 |
24 |
25 | always @(posedge clk or negedge rst_n)begin
26 | if(!rst_n)
27 | xinlv <= 8'b0;
28 | else if(cnt == 26'd5000_0000 - 1)
29 | xinlv <= xinlv_1;
30 | else
31 | xinlv <= xinlv;
32 | end
33 |
34 |
35 | xinlv_rx xinlv_rx (
36 | .clk(clk),
37 | .rst_n(rst_n),
38 | .data_rx(data_tx),
39 | .rx_int(rx_int),
40 | .xinlv(xinlv_1)
41 | );
42 |
43 | uart_bps_xinlv u_uart_bps_xinlv (
44 | .clk(clk),
45 | .rst_n(rst_n),
46 | .cnt_start(bps_start),
47 | .bps_sig(clk_bps)
48 | );
49 |
50 | uart_receive_xinlv u_uart_receive_xinlv (
51 | .clk(clk),
52 | .rst_n(rst_n),
53 | .clk_bps(clk_bps),
54 | .data_rx(data_rx),
55 | .rx_int(rx_int),
56 | .data_tx(data_tx),
57 | .bps_start(bps_start)
58 | );
59 |
60 |
61 | endmodule
62 |
--------------------------------------------------------------------------------
/uart_tx_lora.v:
--------------------------------------------------------------------------------
1 | module uart_tx_lora(
2 | input clk,
3 | input bps_clk,
4 | input send_en,
5 | input rst_n,
6 | input[7:0]data_rx,
7 |
8 | output reg RX232,
9 | output reg over_rx, //结束后会有一个高电平
10 | output reg bps_start
11 | );
12 | reg [3:0]cnt; //数高电平用的计数器
13 | always@(posedge clk or negedge rst_n) //计数器
14 | begin
15 | if(!rst_n)
16 | cnt<=1'b0;
17 | else if(cnt==4'd11)
18 | cnt<=4'd0;
19 | else if(bps_clk)
20 | cnt<=cnt+1'b1;
21 | else cnt<=cnt;
22 | end
23 |
24 | always@(posedge clk or negedge rst_n)
25 | begin
26 | if(!rst_n)
27 | over_rx<=1'b0;
28 | else if(cnt==4'd11)
29 | over_rx<=1'b1;
30 | else over_rx<=1'b0;
31 | end
32 |
33 | always@(posedge clk or negedge rst_n)
34 | begin
35 | if(!rst_n)
36 | bps_start<=1'b0;
37 | else if(send_en)
38 | bps_start<=1'b1;
39 | else if(over_rx)
40 | bps_start<=1'b0;
41 | else bps_start<=bps_start;
42 | end
43 |
44 | always@(posedge clk or negedge rst_n)
45 | begin
46 | if(!rst_n)
47 | RX232<=1'b1;
48 | else
49 | begin
50 | case(cnt)
51 | 0: RX232<=1'b1;
52 | 1: RX232<=1'b0;
53 | 2: RX232<=data_rx[0];
54 | 3: RX232<=data_rx[1];
55 | 4: RX232<=data_rx[2];
56 | 5: RX232<=data_rx[3];
57 | 6: RX232<=data_rx[4];
58 | 7: RX232<=data_rx[5];
59 | 8: RX232<=data_rx[6];
60 | 9: RX232<=data_rx[7];
61 | 10:RX232<=1'b1;
62 | endcase
63 | end
64 | end
65 | endmodule
66 |
--------------------------------------------------------------------------------
/uart_tx.v:
--------------------------------------------------------------------------------
1 | module uart_tx(
2 | input clk,
3 | input bps_clk,
4 | input send_en,
5 | input rst_n,
6 | input[7:0]data_rx,
7 |
8 | output reg RX232,
9 | output reg over_rx, //结束后会有一个高电平
10 | output reg bps_start
11 | );
12 | reg [3:0]cnt; //数高电平用的计数器
13 | always@(posedge clk or negedge rst_n) //计数器
14 | begin
15 | if(!rst_n)
16 | cnt<=1'b0;
17 | else if(cnt==4'd11)
18 | cnt<=4'd0;
19 | else if(bps_clk)
20 | cnt<=cnt+1'b1;
21 | else cnt<=cnt;
22 | end
23 |
24 | always@(posedge clk or negedge rst_n)
25 | begin
26 | if(!rst_n)
27 | over_rx<=1'b0;
28 | else if(cnt==4'd11)
29 | over_rx<=1'b1;
30 | else over_rx<=1'b0;
31 | end
32 |
33 | always@(posedge clk or negedge rst_n)
34 | begin
35 | if(!rst_n)
36 | bps_start<=1'b0;
37 | else if(send_en)
38 | bps_start<=1'b1;
39 | else if(over_rx)
40 | bps_start<=1'b0;
41 | else bps_start<=bps_start;
42 | end
43 |
44 | always@(posedge clk or negedge rst_n)
45 | begin
46 | if(!rst_n)
47 | RX232<=1'b1;
48 | else
49 | begin
50 | case(cnt)
51 | 0: RX232<=1'b1;
52 | 1: RX232<=1'b0;
53 | 2: RX232<=data_rx[0];
54 | 3: RX232<=data_rx[1];
55 | 4: RX232<=data_rx[2];
56 | 5: RX232<=data_rx[3];
57 | 6: RX232<=data_rx[4];
58 | 7: RX232<=data_rx[5];
59 | 8: RX232<=data_rx[6];
60 | 9: RX232<=data_rx[7];
61 | 10:RX232<=1'b1;
62 | endcase
63 | end
64 | end
65 | endmodule
66 |
67 |
68 |
--------------------------------------------------------------------------------
/tb_top.v:
--------------------------------------------------------------------------------
1 | `timescale 1ns / 1ps
2 |
3 | ////////////////////////////////////////////////////////////////////////////////
4 | // Company:
5 | // Engineer:
6 | //
7 | // Create Date: 22:45:40 11/02/2019
8 | // Design Name: top
9 | // Module Name: C:/Users/13743/Desktop/DongNan/VGA_200_164/tb_top.v
10 | // Project Name: VGA_200_164
11 | // Target Device:
12 | // Tool versions:
13 | // Description:
14 | //
15 | // Verilog Test Fixture created by ISE for module: top
16 | //
17 | // Dependencies:
18 | //
19 | // Revision:
20 | // Revision 0.01 - File Created
21 | // Additional Comments:
22 | //
23 | ////////////////////////////////////////////////////////////////////////////////
24 |
25 | module tb_top;
26 |
27 | // Inputs
28 | reg clk;
29 | reg rst_n;
30 | reg pic_en;
31 |
32 | // Outputs
33 | wire VGA_HS;
34 | wire VGA_VS;
35 | wire [1:0] Red_Green;
36 | wire [7:0] RGB;
37 |
38 | // Instantiate the Unit Under Test (UUT)
39 | top uut (
40 | .clk(clk),
41 | .rst_n(rst_n),
42 | .pic_en(pic_en),
43 | .VGA_HS(VGA_HS),
44 | .VGA_VS(VGA_VS),
45 | .Red_Green(Red_Green),
46 | .RGB(RGB)
47 | );
48 |
49 | initial begin
50 | // Initialize Inputs
51 | clk = 0;
52 | rst_n = 0;
53 |
54 | // Wait 100 ns for global reset to finish
55 | #100;
56 | rst_n = 1'b1;
57 | pic_en = 1'b1;
58 | // Add stimulus here
59 |
60 | end
61 |
62 | always #10 clk = ~clk;
63 |
64 |
65 |
66 |
67 | endmodule
68 |
69 |
--------------------------------------------------------------------------------
/盲人家中板子的FPGA代码/Top_uart_tx_dzj_test.v:
--------------------------------------------------------------------------------
1 | `timescale 1ns / 1ps
2 |
3 | ////////////////////////////////////////////////////////////////////////////////
4 | // Company:
5 | // Engineer:
6 | //
7 | // Create Date: 12:08:43 11/25/2018
8 | // Design Name: Top_uart_tx_dzj
9 | // Module Name: F:/Xilinx/uart/uart_tx/Top_uart_tx_dzj_test.v
10 | // Project Name: uart_tx
11 | // Target Device:
12 | // Tool versions:
13 | // Description:
14 | //
15 | // Verilog Test Fixture created by ISE for module: Top_uart_tx_dzj
16 | //
17 | // Dependencies:
18 | //
19 | // Revision:
20 | // Revision 0.01 - File Created
21 | // Additional Comments:
22 | //
23 | ////////////////////////////////////////////////////////////////////////////////
24 |
25 | module Top_uart_tx_dzj_test;
26 |
27 | // Inputs
28 | reg [3:0] in_key_en;
29 | reg clk;
30 | reg rst_n;
31 |
32 | // Outputs
33 | wire RX232;
34 | wire over_rx;
35 |
36 | // Instantiate the Unit Under Test (UUT)
37 | Top_uart_tx_dzj uut (
38 | .in_key_en(in_key_en),
39 | .clk(clk),
40 | .rst_n(rst_n),
41 | .RX232(RX232),
42 | .over_rx(over_rx)
43 | );
44 |
45 | initial begin
46 | // Initialize Inputs
47 | in_key_en = 0;
48 | clk = 0;
49 | rst_n = 0;
50 |
51 | // Wait 100 ns for global reset to finish
52 | #10;
53 | rst_n=1'b1;
54 | in_key_en=4'b0100;
55 | #1000000;
56 | in_key_en=4'b0;
57 | // Add stimulus here
58 |
59 | end
60 | always #10 clk=~clk;
61 | endmodule
62 |
63 |
--------------------------------------------------------------------------------
/tp_z.v:
--------------------------------------------------------------------------------
1 | module tp_z(
2 |
3 | clk,rst,du_en,flag_gy26,data_rx,RX232,smg_duan,smg_wei,dp,a,b,dianji
4 | );
5 | input clk;
6 | input rst;
7 | input du_en;
8 | input a;
9 | input b;
10 | input flag_gy26;
11 | input data_rx;
12 |
13 | output RX232;
14 | output [1:0]dianji;
15 | output [6:0]smg_duan;
16 | output [3:0]smg_wei;
17 | output dp;
18 |
19 |
20 | wire [9:0]jiaodu;
21 | wire [60:0]jishu;
22 | wire rst;
23 |
24 | wire [7:0]licheng;
25 |
26 | //wire [9:0]jiaodu;
27 |
28 | shumaguan sh (
29 | .jishu(jishu),
30 | .jiaodu(jiaodu),
31 | .clk(clk),
32 | .smg_duan(smg_duan),
33 | .smg_wei(smg_wei),
34 | .dp(dp),
35 | .rst(rst),
36 | .licheng1(licheng)
37 | );
38 | zhuti zh (
39 | .clk(clk),
40 | .rst(rst),
41 | .du_en(du_en),
42 | .a(a),
43 | .b(b),
44 | .jiaodu(jiaodu),
45 | .dianji(dianji),
46 | .baidu_JD(baidu_JD),
47 | .jishu(jishu),
48 | .JD(JD),
49 | .licheng(licheng)
50 | );
51 | top_gy_26 to (
52 | .flag_gy26(flag_gy26),
53 | .clk(clk),
54 | .rst(rst),
55 | .data_rx(data_rx),
56 | .jiaodu(jiaodu),
57 | .RX232(RX232)
58 | );
59 |
60 | /*top to (
61 | .clk(clk),
62 | .rst(rst),
63 | .a(a),
64 | .b(b),
65 | .smg_duan(smg_duan),
66 | .smg_wei(smg_wei),
67 | .dp(dp),
68 | .turn1(turn1),
69 | .key1(key1),
70 | .key2(key2)
71 | );*/
72 |
73 |
74 | endmodule
75 |
--------------------------------------------------------------------------------
/盲人家中板子的FPGA代码/Top_uart_tx_test.v:
--------------------------------------------------------------------------------
1 | `timescale 1ns / 1ps
2 |
3 | ////////////////////////////////////////////////////////////////////////////////
4 | // Company:
5 | // Engineer:
6 | //
7 | // Create Date: 20:00:08 11/24/2018
8 | // Design Name: Top_uart_tx
9 | // Module Name: F:/Xilinx/uart/uart_tx/Top_uart_tx_test.v
10 | // Project Name: uart_tx
11 | // Target Device:
12 | // Tool versions:
13 | // Description:
14 | //
15 | // Verilog Test Fixture created by ISE for module: Top_uart_tx
16 | //
17 | // Dependencies:
18 | //
19 | // Revision:
20 | // Revision 0.01 - File Created
21 | // Additional Comments:
22 | //
23 | ////////////////////////////////////////////////////////////////////////////////
24 |
25 | module Top_uart_tx_test;
26 |
27 | // Inputs
28 | reg clk;
29 | reg send_en;
30 | reg rst_n;
31 | reg [7:0] data_rx;
32 |
33 | // Outputs
34 | wire RX232;
35 | wire over_rx;
36 |
37 | // Instantiate the Unit Under Test (UUT)
38 | Top_uart_tx uut (
39 | .clk(clk),
40 | .send_en(send_en),
41 | .rst_n(rst_n),
42 | .data_rx(data_rx),
43 | .RX232(RX232),
44 | .over_rx(over_rx)
45 | );
46 |
47 | initial begin
48 | // Initialize Inputs
49 | clk = 0;
50 | send_en = 0;
51 | rst_n = 0;
52 | data_rx = 0;
53 |
54 | // Wait 100 ns for global reset to finish
55 | #10;
56 | send_en=1'b1;
57 | rst_n=1'b1;
58 | data_rx=8'b01001001;
59 |
60 | // Add stimulus here
61 |
62 | end
63 | always #10 clk=~clk;
64 | endmodule
65 |
66 |
--------------------------------------------------------------------------------
/top_bizhng.v:
--------------------------------------------------------------------------------
1 | module top_bizhng(clk,rst,echo,trig,dianji2,flag,echo2,trig2,data_rx,RX232,led1,led0,jiaodu,led4,led5,led6,led7,flag1
2 | );
3 | input clk;
4 | input rst;
5 | input echo;
6 | input echo2;
7 | input flag;
8 | input data_rx;
9 | output RX232;
10 | output [9:0]jiaodu;
11 | output trig;
12 | output trig2;
13 | output led1;
14 | output led0;
15 | output led7;
16 | output led6;
17 | output led5;
18 | output led4;
19 | output [1:0]dianji2;
20 | output flag1;
21 | wire [9:0]jiaodu;
22 | wire [9:0]jiaodu1;
23 | wire [9:0]hq;
24 | wire [9:0]hz;
25 | wire rst;
26 | bizhang bi (
27 | .clk(clk),
28 | .rst(rst),
29 | .hq(hq),
30 | .hz(hz),
31 | .jiaodu(jiaodu),
32 | .dianji2(dianji2),
33 | .led7(led7),
34 | .led6(led6),
35 | .led5(led5),
36 | .led4(led4),
37 | .jiaodu1(jiaodu1),
38 | .flag1(flag1)
39 | );
40 |
41 | top2 st (
42 | .clk(clk),
43 | .rst_n(rst),
44 | .echo2(echo2),
45 | .trig2(trig2),
46 | .led0(led0),
47 | .hz(hz)
48 | );
49 | top to (
50 | .clk(clk),
51 | .rst_n(rst),
52 | .echo(echo),
53 | .trig(trig),
54 | .led1(led1),
55 | .hq(hq)
56 | );
57 | /*top_gy_26 na (
58 | .flag(flag),
59 | .clk(clk),
60 | .rst_n(rst),
61 | .data_rx(data_rx),
62 | .RX232(RX232),
63 | .jiaodu(jiaodu)
64 | );*/
65 | top_gy_26 na (
66 | .flag(flag),
67 | .clk(clk),
68 | .rst(rst),
69 | .data_rx(data_rx),
70 | .jiaodu(jiaodu),
71 | .RX232(RX232)
72 | );
73 | endmodule
74 |
--------------------------------------------------------------------------------
/top2.v:
--------------------------------------------------------------------------------
1 | module top2(
2 | input clk ,
3 | input rst_n ,
4 | input echo2 ,
5 |
6 | //output [6:0] smg_duan,
7 | // output [3:0] smg_wei ,
8 | //output dp ,
9 | output trig2,
10 | output led0,
11 | output [9:0]hz
12 | );
13 |
14 |
15 | wire [8:0] dis ;
16 | wire tran_en;
17 |
18 | hc_sr042 HC_SR04_inst(
19 | .clk (clk ),
20 | .rst_n (rst_n ),
21 | .en (1'b1 ),
22 | .echo2 (echo2 ),
23 | .trig2 (trig2 ),
24 | .dis (dis )
25 | );
26 |
27 | reg [ 8:0] dis_reg;
28 | wire [ 8:0] dis_wire;
29 | wire [15:0] bcd;
30 | always @(posedge clk or negedge rst_n) begin
31 | if (!rst_n)
32 | dis_reg <= 0;
33 | else
34 | dis_reg <= dis;
35 | end
36 |
37 | assign dis_wire = dis_reg;
38 | assign tran_en = (dis_reg != dis)? 1'd1:1'd0;
39 |
40 | bcd2 bin_bcd_inst(
41 | .clk (clk ),
42 | .rst_n (rst_n ),
43 | .tran_en (1'd1 ),
44 | .data_in ({7'd0,dis_wire}),
45 | .tran_done ( ),
46 | .bcd (bcd )
47 |
48 | );
49 |
50 | smg2 x7seg_msg_inst(
51 | .x (bcd ),
52 | .clk (clk ),
53 | .rst_n (rst_n ),
54 | //.smg_duan (smg_duan),
55 | //.smg_wei (smg_wei ),
56 | //.dp (dp ),
57 | .led0 (led0),
58 | .hz(hz)
59 | );
60 |
61 | endmodule
62 |
--------------------------------------------------------------------------------
/盲人家中板子的FPGA代码/fangdou.v:
--------------------------------------------------------------------------------
1 | `timescale 1ns / 1ps
2 | //////////////////////////////////////////////////////////////////////////////////
3 | // Company:
4 | // Engineer:
5 | //
6 | // Create Date: 17:31:17 10/26/2018
7 | // Design Name:
8 | // Module Name: fangdou
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 fangdou(in_key_en,rst_n,clk,out_key_en);
22 | input [3:0]in_key_en;
23 | input clk,rst_n;
24 |
25 | output [3:0]out_key_en;
26 |
27 | parameter clk190 = 18'd263157;
28 |
29 | reg [24:0]cnt;
30 | reg [3:0]delay1,delay2,delay3;
31 | wire [3:0]out_key_en_r;
32 | reg [3:0]out_key_en_rr;
33 |
34 | always @(posedge clk or negedge rst_n)
35 | begin
36 | if(!rst_n)
37 | cnt <= 0;
38 | else if(cnt == clk190)
39 | cnt <= 0;
40 | else
41 | cnt <= cnt + 1;
42 | end
43 |
44 | always @(posedge clk or negedge rst_n)
45 | begin
46 | if(!rst_n)
47 | begin
48 | delay1 <= 4'b0000;
49 | delay2 <= 4'b0000;
50 | delay3 <= 4'b0000;
51 | end
52 | else if(cnt == clk190)
53 | begin
54 | delay1 <= in_key_en;
55 | delay2 <= delay1;
56 | delay3 <= delay2;
57 | end
58 | end
59 |
60 | assign out_key_en_r = delay1 & delay2 & delay3 ;
61 |
62 | always@(posedge clk)
63 | out_key_en_rr <= out_key_en_r;
64 |
65 | assign out_key_en = out_key_en_r & ~out_key_en_rr; //原始信号 & ~延时后的信号
66 |
67 | endmodule
68 |
--------------------------------------------------------------------------------
/top_music.v:
--------------------------------------------------------------------------------
1 | module top_music(
2 | //input key,
3 | input clk,
4 | input rst_n,
5 | input music_rx,
6 | input [17:0]shijian,
7 | input [1:0]flag_zhiwen,
8 | input [1:0]flag_GY25,
9 | input flag_music,//语音输入放歌
10 | input [1:0]flag_tu_ao,
11 |
12 | //input talk_rx,
13 | input flag_shijian,
14 | output RX232,
15 | output led,
16 | output over_all,
17 | output sj_en
18 | );
19 | //wire [17:0]shijian;
20 | wire [3:0]shi_1,shi_2,fen_1,fen_2;
21 | Top_uart_tx_dzj_music a (
22 | .shi_1(shi_1),
23 | .shi_2(shi_2),
24 | .fen_1(fen_1),
25 | .fen_2(fen_2),
26 | .flag_zhiwen(flag_zhiwen),
27 | .flag_music(flag_music),
28 | .flag_tu_ao(flag_tu_ao),
29 | .flag_GY25(flag_GY25),
30 | .sj_en(sj_en),
31 | .clk(clk),
32 | .rst_n(rst_n),
33 | .tx_en(tx_en),
34 | .shijian_en(flag_shijian),
35 | .RX232(RX232),
36 | .over_all(over_all)
37 | );
38 | uart_rx_dzj_music ab (
39 | .clk(clk),
40 | //.over_all(over_all),
41 | .rst_n(rst_n),
42 | .data_rx(music_rx),
43 | .flag(tx_en),
44 | .led(led)
45 | );
46 | /*uart_rx_talk abc (
47 | .clk(clk),
48 | .over_all(over_all),
49 | .rst_n(rst_n),
50 | .data_rx(talk_rx),
51 | .flag(shijian_en)
52 | );*/
53 | /*gps abcd (
54 | .key(key),
55 | .clk(clk),
56 | .rst_n(rst_n),
57 | .shijian(shijian)
58 | );*/
59 | time_ abcde (
60 | .shijian(shijian),
61 | .clk(clk),
62 | .rst_n(rst_n),
63 | .shijian_en(flag_shijian),
64 | .shi_1(shi_1),
65 | .shi_2(shi_2),
66 | .fen_1(fen_1),
67 | .fen_2(fen_2),
68 | .sj_en(sj_en)
69 | );
70 |
71 | endmodule
72 |
--------------------------------------------------------------------------------
/盲人家中板子的FPGA代码/Top_uart_tx_dzj.v:
--------------------------------------------------------------------------------
1 | `timescale 1ns / 1ps
2 | //////////////////////////////////////////////////////////////////////////////////
3 | // Company:
4 | // Engineer:
5 | //
6 | // Create Date: 11:45:17 11/25/2018
7 | // Design Name:
8 | // Module Name: Top_uart_tx_dzj
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 Top_uart_tx_dzj(
22 | input [3:0]in_key_en,
23 | input clk,
24 | input rst_n,
25 | input co,
26 | input zhendong,
27 |
28 | output RX232,
29 | output over_rx,
30 | output fengshan
31 | );
32 | wire [7:0]data_rx;
33 | wire [3:0]out_key_en;
34 | uart_tx_dzj a (
35 | .co(co),
36 | .zhendong(zhendong),
37 | .in_key_en(out_key_en),
38 | .clk(clk),
39 | .rst_n(rst_n),
40 | .over_tx(over_rx),
41 | .data_rx(data_rx),
42 | .send_en(send_en),
43 | .fengshan(fengshan)
44 | );
45 | fangdou ab (
46 | .in_key_en(in_key_en),
47 | .rst_n(rst_n),
48 | .clk(clk),
49 | .out_key_en(out_key_en)
50 | );
51 | uart_tx abc (
52 | .clk(clk),
53 | .bps_clk(bps_clk),
54 | .send_en(send_en),
55 | .rst_n(rst_n),
56 | .data_rx(data_rx),
57 | .RX232(RX232),
58 | .over_rx(over_rx),
59 | .bps_start(bps_start)
60 | );
61 | bps_set abcd (
62 | .clk(clk),
63 | .rst_n(rst_n),
64 | .bps_start(bps_start),
65 | .bps_clk(bps_clk)
66 | );
67 |
68 |
69 | endmodule
70 |
--------------------------------------------------------------------------------
/盲人家中板子的FPGA代码/lora_rx.v:
--------------------------------------------------------------------------------
1 | `timescale 1ns / 1ps
2 | //////////////////////////////////////////////////////////////////////////////////
3 | // Company:
4 | // Engineer:
5 | //
6 | // Create Date: 00:28:55 10/05/2019
7 | // Design Name:
8 | // Module Name: uart_rx_talk
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 lora_rx(
22 | input clk,
23 | input rst_n,
24 | input data_rx,
25 | input over_all,
26 |
27 | output [6:0] smg_duan,
28 | output [3:0] smg_wei,
29 | output dp
30 |
31 | );
32 | wire [7:0]data_tx;
33 | bps_set_115200 a (
34 | .clk(clk),
35 | .rst_n(rst_n),
36 | .bps_start(bps_start),
37 | .bps_clk(bps_clk)
38 | );
39 | uart_rx ab (
40 | .nedge(nedge),
41 | .clk(clk),
42 | .rst_n(rst_n),
43 | .bps_clk(bps_clk),
44 | .data_rx(data_rx),
45 | .data_tx(data_tx),
46 | .over_rx(over_rx),
47 | .bps_start(bps_start)
48 | );
49 | /*uart_rx_dzj_lora abc (
50 | .clk(clk),
51 | .over_all(over_all),
52 | .rst_n(rst_n),
53 | .data_tx(data_tx),
54 | .nedge(nedge),
55 | .over_rx(over_rx),
56 | .flag_lora(flag_lora)
57 | );*/
58 | wire [15:0] x;
59 | lora_rx_chuli abcd (
60 | .clk(clk),
61 | .rst_n(rst_n),
62 | .data_tx(data_tx),
63 | .x(x)
64 | );
65 | x7seg_msg abcde (
66 | .x(x),
67 | .clk(clk),
68 | .clr(!rst_n),
69 | .smg_duan(smg_duan),
70 | .smg_wei(smg_wei),
71 | .dp(dp)
72 | );
73 |
74 |
75 | endmodule
76 |
--------------------------------------------------------------------------------
/uart_sentdata_mess.v:
--------------------------------------------------------------------------------
1 | module uart_sentdata_mess(clk,rst,bps_sig,tx_data,tx,tx_enable,tx_done
2 | );
3 | input clk;
4 | input rst;
5 | input [7:0] tx_data;
6 | input tx_enable;
7 | input bps_sig;
8 | output tx;
9 | output tx_done;
10 |
11 | reg tx;
12 | reg tx_done;
13 | reg [3:0]stata;
14 |
15 | always@(posedge clk or negedge rst)
16 | begin
17 | if(!rst)
18 | begin
19 | stata <= 4'd0;
20 | tx <= 1'b1;
21 | tx_done <= 1'b0;
22 | end
23 | else
24 | begin
25 | case(stata)
26 | 0: if(tx_enable & bps_sig)
27 | begin
28 | stata <= stata + 1'b1;
29 | tx <= 1'b0;
30 | end
31 | else
32 | begin
33 | stata <= stata;
34 | tx <= 1'b1;
35 | end
36 | 1,2,3,4,5,6,7,8: if(bps_sig)
37 | begin
38 | tx <= tx_data[stata - 1'b1];
39 | stata <= stata + 1'b1;
40 | end
41 | else
42 | begin
43 | stata <= stata;
44 | tx <= tx;
45 | end
46 | 9,10: if(bps_sig)
47 | begin
48 | stata <= stata + 1'b1;
49 | tx <= 1'b1;
50 | end
51 | 11: begin
52 | stata <= stata + 1'b1;
53 | tx_done <= 1'b1;
54 | end
55 | 12: begin
56 | stata <= 1'b0;
57 | tx_done <= 1'b0;
58 | end
59 | endcase
60 | end
61 | end
62 |
63 | endmodule
64 |
--------------------------------------------------------------------------------
/百度LBS开放平台显示的HTML代码/html代码.txt:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
9 |
10 | 单个标注点沿直线的轨迹运动
11 |
12 |
13 |
14 |
15 |
16 |
--------------------------------------------------------------------------------
/uart_receive.v:
--------------------------------------------------------------------------------
1 | module uart_receive(
2 | input clk,
3 | input rst_n,
4 | input clk_bps,//clk_bps控制的反馈的拍子
5 | input data_rx,//接收数据
6 | output reg rx_int,//反馈信号,正常接收信号反馈“1”,接收结束停止接收反馈“0”。
7 | output [7:0] data_tx,//接收到数据后发送个uart_tx
8 | output reg bps_start //开始检测到uart_rx接受完数据了,启动clk_bps模块,调节时钟
9 | );
10 |
11 | //-------------------------
12 | reg [1:0] rx;
13 |
14 | always@(posedge clk or negedge rst_n)begin
15 | if(!rst_n) rx <= 2'b11;
16 | else begin
17 | rx[0] <= data_rx;
18 | rx[1] <= rx[0];
19 | end
20 | end
21 | wire nege_edge;
22 | assign nege_edge= rx[1] &~rx[0];//检测下降沿
23 |
24 | reg [3:0]num;
25 |
26 | always@(posedge clk or negedge rst_n)begin
27 | if(!rst_n) begin
28 | bps_start <= 1'b0;
29 | rx_int <= 1'b0;
30 | end
31 | else if(nege_edge)begin
32 | bps_start <= 1'b1;
33 | rx_int <= 1'b1;
34 | end
35 | else if(num == 4'd10)begin
36 | bps_start <= 1'b0;
37 | rx_int <= 1'b0;
38 | end
39 | end
40 |
41 | reg [7:0] rx_data_temp_r;//当前数据接收寄存器
42 | reg [7:0] rx_data_r;//用来锁存数据
43 | always@(posedge clk or negedge rst_n)begin
44 | if(!rst_n) begin
45 | rx_data_r <= 8'd0;
46 | rx_data_temp_r <= 8'd0;
47 | num <= 4'd0;
48 | end
49 | else if(rx_int)begin
50 | if(clk_bps)begin
51 | num <= num + 1'b1;
52 | case(num)
53 | 4'd1: rx_data_temp_r[0] <= data_rx; //锁存第0bit
54 | 4'd2: rx_data_temp_r[1] <= data_rx; //锁存第1bit
55 | 4'd3: rx_data_temp_r[2] <= data_rx; //锁存第2bit
56 | 4'd4: rx_data_temp_r[3] <= data_rx; //锁存第3bit
57 | 4'd5: rx_data_temp_r[4] <= data_rx; //锁存第4bit
58 | 4'd6: rx_data_temp_r[5] <= data_rx; //锁存第5bit
59 | 4'd7: rx_data_temp_r[6] <= data_rx; //锁存第6bit
60 | 4'd8: rx_data_temp_r[7] <= data_rx; //锁存第7bit
61 | default: ;
62 | endcase
63 | end
64 | else if(num == 4'd10)begin
65 | rx_data_r <=rx_data_temp_r;
66 | num <= 4'd0;
67 | end
68 | end
69 | end
70 |
71 | assign data_tx = rx_data_r;
72 |
73 | endmodule
74 |
--------------------------------------------------------------------------------
/uart_receive_1.v:
--------------------------------------------------------------------------------
1 | module uart_receive_1(
2 | input clk,
3 | input rst_n,
4 | input clk_bps,//clk_bps控制的反馈的拍子
5 | input data_rx,//接收数据
6 | output reg rx_int,//反馈信号,正常接收信号反馈“1”,接收结束停止接收反馈“0”。
7 | output [7:0] data_tx,//接收到数据后发送个uart_tx
8 | output reg bps_start //开始检测到uart_rx接受完数据了,启动clk_bps模块,调节时钟
9 | );
10 |
11 | //-------------------------
12 | reg [1:0] rx;
13 |
14 | always@(posedge clk or negedge rst_n)begin
15 | if(!rst_n) rx <= 2'b11;
16 | else begin
17 | rx[0] <= data_rx;
18 | rx[1] <= rx[0];
19 | end
20 | end
21 | wire nege_edge;
22 | assign nege_edge= rx[1] & ~rx[0];//检测下降沿
23 |
24 | reg [3:0]num;
25 |
26 | always@(posedge clk or negedge rst_n)begin
27 | if(!rst_n) begin
28 | bps_start <= 1'b0;
29 | rx_int <= 1'b0;
30 | end
31 | else if(nege_edge)begin
32 | bps_start <= 1'b1;
33 | rx_int <= 1'b1;
34 | end
35 | else if(num == 4'd10)begin
36 | bps_start <= 1'b0;
37 | rx_int <= 1'b0;
38 | end
39 | end
40 |
41 | reg [7:0] rx_data_temp_r;//当前数据接收寄存器
42 | reg [7:0] rx_data_r;//用来锁存数据
43 | always@(posedge clk or negedge rst_n)begin
44 | if(!rst_n) begin
45 | rx_data_r <= 8'd0;
46 | rx_data_temp_r <= 8'd0;
47 | num <= 4'd0;
48 | end
49 | else if(rx_int)begin
50 | if(clk_bps)begin
51 | num <= num + 1'b1;
52 | case(num)
53 | 4'd1: rx_data_temp_r[0] <= data_rx; //锁存第0bit
54 | 4'd2: rx_data_temp_r[1] <= data_rx; //锁存第1bit
55 | 4'd3: rx_data_temp_r[2] <= data_rx; //锁存第2bit
56 | 4'd4: rx_data_temp_r[3] <= data_rx; //锁存第3bit
57 | 4'd5: rx_data_temp_r[4] <= data_rx; //锁存第4bit
58 | 4'd6: rx_data_temp_r[5] <= data_rx; //锁存第5bit
59 | 4'd7: rx_data_temp_r[6] <= data_rx; //锁存第6bit
60 | 4'd8: rx_data_temp_r[7] <= data_rx; //锁存第7bit
61 | default: ;
62 | endcase
63 | end
64 | else if(num == 4'd10)begin
65 | rx_data_r <=rx_data_temp_r;
66 | num <= 4'd0;
67 | end
68 | end
69 | end
70 |
71 | assign data_tx = rx_data_r;
72 |
73 | endmodule
74 |
--------------------------------------------------------------------------------
/uart_receive_9600.v:
--------------------------------------------------------------------------------
1 | module uart_receive_9600(
2 | input clk,
3 | input rst_n,
4 | input clk_bps,//clk_bps控制的反馈的拍子
5 | input data_rx,//接收数据
6 | output reg rx_int,//反馈信号,正常接收信号反馈“1”,接收结束停止接收反馈“0”。
7 | output [7:0] data_tx,//接收到数据后发送个uart_tx
8 | output reg bps_start //开始检测到uart_rx接受完数据了,启动clk_bps模块,调节时钟
9 | );
10 |
11 | //-------------------------
12 | reg [1:0] rx;
13 |
14 | always@(posedge clk or negedge rst_n)begin
15 | if(!rst_n) rx <= 2'b11;
16 | else begin
17 | rx[0] <= data_rx;
18 | rx[1] <= rx[0];
19 | end
20 | end
21 | wire nege_edge;
22 | assign nege_edge= rx[1] &~rx[0];//检测下降沿
23 |
24 | reg [3:0]num;
25 |
26 | always@(posedge clk or negedge rst_n)begin
27 | if(!rst_n) begin
28 | bps_start <= 1'b0;
29 | rx_int <= 1'b0;
30 | end
31 | else if(nege_edge)begin
32 | bps_start <= 1'b1;
33 | rx_int <= 1'b1;
34 | end
35 | else if(num == 4'd10)begin
36 | bps_start <= 1'b0;
37 | rx_int <= 1'b0;
38 | end
39 | end
40 |
41 | reg [7:0] rx_data_temp_r;//当前数据接收寄存器
42 | reg [7:0] rx_data_r;//用来锁存数据
43 | always@(posedge clk or negedge rst_n)begin
44 | if(!rst_n) begin
45 | rx_data_r <= 8'd0;
46 | rx_data_temp_r <= 8'd0;
47 | num <= 4'd0;
48 | end
49 | else if(rx_int)begin
50 | if(clk_bps)begin
51 | num <= num + 1'b1;
52 | case(num)
53 | 4'd1: rx_data_temp_r[0] <= data_rx; //锁存第0bit
54 | 4'd2: rx_data_temp_r[1] <= data_rx; //锁存第1bit
55 | 4'd3: rx_data_temp_r[2] <= data_rx; //锁存第2bit
56 | 4'd4: rx_data_temp_r[3] <= data_rx; //锁存第3bit
57 | 4'd5: rx_data_temp_r[4] <= data_rx; //锁存第4bit
58 | 4'd6: rx_data_temp_r[5] <= data_rx; //锁存第5bit
59 | 4'd7: rx_data_temp_r[6] <= data_rx; //锁存第6bit
60 | 4'd8: rx_data_temp_r[7] <= data_rx; //锁存第7bit
61 | default: ;
62 | endcase
63 | end
64 | else if(num == 4'd10)begin
65 | rx_data_r <=rx_data_temp_r;
66 | num <= 4'd0;
67 | end
68 | end
69 | end
70 |
71 | assign data_tx = rx_data_r;
72 |
73 | endmodule
74 |
--------------------------------------------------------------------------------
/uart_receive_xinlv.v:
--------------------------------------------------------------------------------
1 | module uart_receive_xinlv(
2 | input clk,
3 | input rst_n,
4 | input clk_bps,//clk_bps控制的反馈的拍子
5 | input data_rx,//接收数据
6 | output reg rx_int,//反馈信号,正常接收信号反馈“1”,接收结束停止接收反馈“0”。
7 | output [7:0] data_tx,//接收到数据后发送个uart_tx
8 | output reg bps_start //开始检测到uart_rx接受完数据了,启动clk_bps模块,调节时钟
9 | );
10 |
11 | //-------------------------
12 | reg [1:0] rx;
13 |
14 | always@(posedge clk or negedge rst_n)begin
15 | if(!rst_n) rx <= 2'b11;
16 | else begin
17 | rx[0] <= data_rx;
18 | rx[1] <= rx[0];
19 | end
20 | end
21 | wire nege_edge;
22 | assign nege_edge= rx[1] & ~rx[0];//检测下降沿
23 |
24 | reg [3:0]num;
25 |
26 | always@(posedge clk or negedge rst_n)begin
27 | if(!rst_n) begin
28 | bps_start <= 1'b0;
29 | rx_int <= 1'b0;
30 | end
31 | else if(nege_edge)begin
32 | bps_start <= 1'b1;
33 | rx_int <= 1'b1;
34 | end
35 | else if(num == 4'd10)begin
36 | bps_start <= 1'b0;
37 | rx_int <= 1'b0;
38 | end
39 | end
40 |
41 | reg [7:0] rx_data_temp_r;//当前数据接收寄存器
42 | reg [7:0] rx_data_r;//用来锁存数据
43 | always@(posedge clk or negedge rst_n)begin
44 | if(!rst_n) begin
45 | rx_data_r <= 8'd0;
46 | rx_data_temp_r <= 8'd0;
47 | num <= 4'd0;
48 | end
49 | else if(rx_int)begin
50 | if(clk_bps)begin
51 | num <= num + 1'b1;
52 | case(num)
53 | 4'd1: rx_data_temp_r[0] <= data_rx; //锁存第0bit
54 | 4'd2: rx_data_temp_r[1] <= data_rx; //锁存第1bit
55 | 4'd3: rx_data_temp_r[2] <= data_rx; //锁存第2bit
56 | 4'd4: rx_data_temp_r[3] <= data_rx; //锁存第3bit
57 | 4'd5: rx_data_temp_r[4] <= data_rx; //锁存第4bit
58 | 4'd6: rx_data_temp_r[5] <= data_rx; //锁存第5bit
59 | 4'd7: rx_data_temp_r[6] <= data_rx; //锁存第6bit
60 | 4'd8: rx_data_temp_r[7] <= data_rx; //锁存第7bit
61 | default: ;
62 | endcase
63 | end
64 | else if(num == 4'd10)begin
65 | rx_data_r <=rx_data_temp_r;
66 | num <= 4'd0;
67 | end
68 | end
69 | end
70 |
71 | assign data_tx = rx_data_r;
72 |
73 | endmodule
74 |
--------------------------------------------------------------------------------
/盲人家中板子的FPGA代码/uart_tx.v:
--------------------------------------------------------------------------------
1 | `timescale 1ns / 1ps
2 | //////////////////////////////////////////////////////////////////////////////////
3 | // Company:
4 | // Engineer:
5 | //
6 | // Create Date: 17:05:49 11/24/2018
7 | // Design Name:
8 | // Module Name: uart_tx
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_tx(
22 | input clk,
23 | input bps_clk,
24 | input send_en,
25 | input rst_n,
26 | input[7:0]data_rx,
27 |
28 | output reg RX232,
29 | output reg over_rx, //结束后会有一个高电平
30 | output reg bps_start
31 | );
32 | reg [3:0]cnt; //数高电平用的计数器
33 | always@(posedge clk or negedge rst_n) //计数器
34 | begin
35 | if(!rst_n)
36 | cnt<=1'b0;
37 | else if(cnt==4'd11)
38 | cnt<=4'd0;
39 | else if(bps_clk)
40 | cnt<=cnt+1'b1;
41 | else cnt<=cnt;
42 | end
43 |
44 | always@(posedge clk or negedge rst_n)
45 | begin
46 | if(!rst_n)
47 | over_rx<=1'b0;
48 | else if(cnt==4'd11)
49 | over_rx<=1'b1;
50 | else over_rx<=1'b0;
51 | end
52 |
53 | always@(posedge clk or negedge rst_n)
54 | begin
55 | if(!rst_n)
56 | bps_start<=1'b0;
57 | else if(send_en)
58 | bps_start<=1'b1;
59 | else if(over_rx)
60 | bps_start<=1'b0;
61 | else bps_start<=bps_start;
62 | end
63 |
64 | always@(posedge clk or negedge rst_n)
65 | begin
66 | if(!rst_n)
67 | RX232<=1'b1;
68 | else
69 | begin
70 | case(cnt)
71 | 0: RX232<=1'b1;
72 | 1: RX232<=1'b0;
73 | 2: RX232<=data_rx[0];
74 | 3: RX232<=data_rx[1];
75 | 4: RX232<=data_rx[2];
76 | 5: RX232<=data_rx[3];
77 | 6: RX232<=data_rx[4];
78 | 7: RX232<=data_rx[5];
79 | 8: RX232<=data_rx[6];
80 | 9: RX232<=data_rx[7];
81 | 10:RX232<=1'b1;
82 | endcase
83 | end
84 | end
85 | endmodule
86 |
--------------------------------------------------------------------------------
/盲人家中板子的FPGA代码/lora_rx_chuli.v:
--------------------------------------------------------------------------------
1 | `timescale 1ns / 1ps
2 | //////////////////////////////////////////////////////////////////////////////////
3 | // Company:
4 | // Engineer:
5 | //
6 | // Create Date: 12:57:18 11/20/2019
7 | // Design Name:
8 | // Module Name: lora_rx_chuli
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 lora_rx_chuli(
22 | input clk,
23 | input rst_n,
24 | input [7:0]data_tx,
25 |
26 | output reg [15:0] x
27 | );
28 | reg [7:0]data;
29 | reg [25:0]cnt_1s;
30 | always@(posedge clk or negedge rst_n) //1秒计数器
31 | begin
32 | if(!rst_n)
33 | cnt_1s<=1'b0;
34 | else if(cnt_1s==26'd50000000)//else if(cnt_1s==26'd50000000)
35 | cnt_1s<=1'b0;
36 | else cnt_1s<=cnt_1s+1'b1;
37 | end
38 | reg [15:0] x_reg;
39 | reg flag;
40 | always@(posedge clk or negedge rst_n)
41 | begin
42 | if(!rst_n)
43 | begin x_reg<=1'b0; data<=1'b0;flag<=1'b0; end
44 | else
45 | begin
46 | if(cnt_1s==26'd50000000)//if(cnt_1s==26'd50000000) //1秒
47 | begin data<=data_tx; x_reg<=1'b0;end
48 | else if(data>=10'd1000)
49 | begin
50 | x_reg[15:12]<=x_reg[15:12]+1'b1;
51 | data<=data-10'd1000;
52 | end
53 | else if(data>=8'd100)
54 | begin
55 | x_reg[11:8]<=x_reg[11:8]+1'b1;
56 | data<=data-8'd100;
57 | end
58 | else if(data>=4'd10)
59 | begin
60 | x_reg[7:4]<=x_reg[7:4]+1'b1;
61 | data<=data-4'd10;
62 | end
63 | else if(data>=1'd1)
64 | begin
65 | x_reg[3:0]<=x_reg[3:0]+1'b1;
66 | data<=data-1'd1;
67 | flag<=1'b1;
68 | end
69 | else if(data==1'd0)
70 | flag<=1'b1;
71 | else flag<=1'b0;
72 | end
73 | end
74 | always@(*)
75 | begin
76 | if(flag)
77 | x<=x_reg;
78 | else x<=x;
79 | end
80 | endmodule
81 |
--------------------------------------------------------------------------------
/uart_rx.v:
--------------------------------------------------------------------------------
1 | module uart_rx(
2 | input clk,
3 | input rst_n,
4 | input bps_clk,
5 | input data_rx,
6 | output [7:0]data_tx,
7 | output reg over_rx, //接受结束标志 0表示没在接受数据 1表示正在接受数据
8 | output reg bps_start,
9 | output nedge //开始位 下降沿检测标志
10 | );
11 | reg [1:0]tmp_rx; //下降沿检测所用寄存器
12 |
13 | reg[3:0]num; //最大到10 计数
14 | reg[7:0]data_rx0; //第一个寄存器 存每个bit位的数据
15 | reg[7:0]data_rx1; //第二个寄存器 存一个字节的
16 | always@(posedge clk or negedge rst_n) //移位寄存器 检测下降沿
17 | begin
18 | if(!rst_n) tmp_rx<=2'b11;
19 | else
20 | begin
21 | tmp_rx[0]<=data_rx;
22 | tmp_rx[1]<=tmp_rx[0];
23 | end
24 | end
25 | assign nedge=~tmp_rx[0]&tmp_rx[1];
26 |
27 | always@(posedge clk or negedge rst_n)
28 | begin
29 | if(!rst_n)
30 | begin
31 | bps_start<=1'b0;
32 | over_rx <=1'b0;
33 | end
34 | else if(!over_rx)
35 | begin
36 | if(nedge)
37 | begin
38 | bps_start<=1'b1;
39 | over_rx <=1'b1;
40 | end
41 | end
42 | else if(num==4'd10)
43 | begin
44 | bps_start<=1'b0;
45 | over_rx <=1'b0;
46 | end
47 | end
48 |
49 | always@(posedge clk or negedge rst_n)
50 | begin
51 | if(!rst_n)
52 | begin
53 | data_rx0<=1'd0;
54 | data_rx1<=1'd0;
55 | num <=1'd0;
56 | end
57 | else if(over_rx)
58 | begin
59 | if(bps_clk)
60 | begin
61 | num<=num+1'b1;
62 | case(num)
63 | 4'd1: data_rx0[0]<=data_rx;
64 | 4'd2: data_rx0[1]<=data_rx;
65 | 4'd3: data_rx0[2]<=data_rx;
66 | 4'd4: data_rx0[3]<=data_rx;
67 | 4'd5: data_rx0[4]<=data_rx;
68 | 4'd6: data_rx0[5]<=data_rx;
69 | 4'd7: data_rx0[6]<=data_rx;
70 | 4'd8: data_rx0[7]<=data_rx;
71 | default: ;
72 | endcase
73 | end
74 | else if(num==4'd10)
75 | begin
76 | data_rx1<=data_rx0;
77 | num<=4'd0;
78 | end
79 | end
80 | end
81 | assign data_tx=data_rx1;
82 | endmodule
83 |
--------------------------------------------------------------------------------
/uart_rx_dzj.v:
--------------------------------------------------------------------------------
1 | module uart_rx_dzj(
2 | input clk,
3 | input rst_n,
4 | input [7:0]data_tx,
5 | input over_rx,
6 | input nedge,
7 |
8 | output reg [9:0] jiaodu
9 | );
10 |
11 | wire nedge_over_rx;
12 | reg [1:0]tmp_rx; //下降沿检测所用寄存器
13 | always@(posedge clk or negedge rst_n) //移位寄存器 检测下降沿
14 | begin
15 | if(!rst_n) tmp_rx<=2'b11;
16 | else
17 | begin
18 | tmp_rx[0]<=over_rx;
19 | tmp_rx[1]<=tmp_rx[0];
20 | end
21 | end
22 | assign nedge_over_rx=~tmp_rx[0]&tmp_rx[1];
23 |
24 | parameter s0=4'd0,s1=4'd1,s2=4'd2,s3=4'd3,s4=4'd4,s5=4'd5;//,s6=4'd6,s7=4'd7,s8=4'd8,s9=4'd9,s10=4'd10,s11=4'd12;
25 | reg[3:0] present_state,next_state;
26 | always@(posedge clk or negedge rst_n)
27 | begin
28 | if(!rst_n)
29 | begin
30 | present_state<=s0;
31 | end
32 | else if(~over_rx&nedge) present_state<=next_state;
33 | end
34 | //[9:8]百位 [7:4]十位 [3:0]个位
35 | reg[1:0]baiwei;
36 | reg[3:0]shiwei;
37 | reg[3:0]gewei;
38 | always@(posedge clk or negedge rst_n)
39 | begin
40 | if(!rst_n)
41 | begin next_state<=s0; baiwei<=1'b0;shiwei<=1'b0;gewei<=1'b0;end
42 | else begin
43 | case(present_state)
44 | s0: if(data_tx==8'h0D/*8'b01001001*/) //0D
45 | next_state<=s1;
46 | else next_state<=s0;
47 | s1: if(data_tx==8'h0A) //0A
48 | next_state<=s2;
49 | else next_state<=s0;
50 | s2: if(data_tx[7:4]==4'b0011)
51 | begin //角度百位
52 | if(nedge_over_rx)begin next_state<=s3;
53 | baiwei<=data_tx[3:0]; end
54 | end
55 | else next_state<=s0;
56 | s3: if(data_tx[7:4]==4'b0011)
57 | begin
58 | if(nedge_over_rx) begin next_state<=s4; //角度十位
59 | shiwei<=data_tx[3:0]; end
60 | end
61 | else next_state<=s0;
62 | s4: if(data_tx[7:4]==4'b0011)
63 | begin //角度个位
64 | if(nedge_over_rx) begin next_state<=s5;
65 | gewei<=data_tx[3:0]; end
66 | end
67 | else next_state<=s0;
68 | s5: next_state<=s0;
69 |
70 | default: next_state<=s0;
71 | endcase
72 | end
73 | end
74 | always@(posedge clk or negedge rst_n)
75 | begin
76 | if(!rst_n)
77 | jiaodu<=1'b0;
78 | else if(next_state==s5)
79 | jiaodu<={baiwei,shiwei,gewei};
80 | else jiaodu<=jiaodu;
81 | end
82 | endmodule
--------------------------------------------------------------------------------
/time_.v:
--------------------------------------------------------------------------------
1 | module time_(
2 | input [17:0]shijian,
3 | input clk,
4 | input rst_n,
5 | input shijian_en, //语音输入一个高电平
6 | output reg [3:0]shi_1,
7 | output reg [3:0]shi_2,
8 | output reg [3:0]fen_1,
9 | output reg [3:0]fen_2,
10 | output reg sj_en
11 | );
12 |
13 | /* always@(*) //拿出时分各位
14 | begin
15 | if((shijian%10000+4'd8)>5'd24) //UTC时间加8为北京时间
16 | begin
17 | shi_1<=(shijian%10000+4'd8-5'd24)%10;
18 | shi_2<=(shijian%10000+4'd8-5'd24)-shi_1*10;
19 | end
20 | else begin
21 | shi_1<=(shijian%10000+4'd8)%10;
22 | shi_2<=(shijian%10000+4'd8)-shi_1*10;
23 | end
24 | fen_1<=(shijian%1000-(shijian%10000)*10);
25 | fen_2<=(shijian%100-(shijian%1000)*10);
26 | end*/
27 |
28 | reg [1:0]tmp_rx; //shijian_en信号上升沿检测所用寄存器
29 | wire podge;
30 | always@(posedge clk or negedge rst_n) //移位寄存器 检测上升沿
31 | begin
32 | if(!rst_n) tmp_rx<=2'b00;
33 | else
34 | begin
35 | tmp_rx[0]<=shijian_en;
36 | tmp_rx[1]<=tmp_rx[0];
37 | end
38 | end
39 | assign podge=tmp_rx[0]&~tmp_rx[1];
40 | reg [17:0]sj;
41 | always@(posedge clk or negedge rst_n) //拿出时分各位
42 | begin
43 | if(!rst_n)
44 | begin shi_1<=4'd0; shi_2<=4'd0;sj<=1'b0;
45 | fen_1<=4'd0; fen_2<=4'd0; sj_en<=1'b0;end
46 | else if(podge)begin sj<=shijian; shi_1<=4'd0; shi_2<=4'd0;fen_1<=4'd0; fen_2<=4'd0;end
47 | else if(sj>=17'd100000)begin
48 | sj<=sj-17'd100000;
49 | shi_1<=shi_1+1'b1; end
50 | else if(sj>=14'd10000)begin
51 | sj<=sj-14'd10000;
52 | shi_2<=shi_2+1'b1; end
53 | else if((shi_1*4'd10+shi_2+4'd8)>5'd24) //UTC时间加8为北京时间
54 | begin //eg 小时是28 28-24=4 再把0和4拿出来
55 | /*sj_yichu<=shi_1*4'd10+shi_2+4'd8-5'd24;
56 | if(sj_yichu<4'd10) //时间最多235959 23+8=31 31-24=7 所以最多就是7
57 | begin shi_2<=sj_yichu;
58 | shi_1<=1'b0; end*/
59 | shi_2<=shi_1*4'd10+shi_2+4'd8-5'd24;
60 | shi_1<=1'b0;
61 | end
62 | else if(sj>=10'd1000) begin
63 | sj<=sj-10'd1000;
64 | fen_1<=fen_1+1'b1; end
65 | else if(sj>=7'd100) begin
66 | sj<=sj-7'd100;
67 | fen_2<=fen_2+1'b1;end
68 | else if(sj>1'b1&sj<7'd100)sj_en<=1'b1;
69 | else sj_en<=1'b0;
70 | end
71 | endmodule
72 |
--------------------------------------------------------------------------------
/盲人家中板子的FPGA代码/uart_rx_dzj_lora.v:
--------------------------------------------------------------------------------
1 | `timescale 1ns / 1ps
2 | //////////////////////////////////////////////////////////////////////////////////
3 | // Company:
4 | // Engineer:
5 | //
6 | // Create Date: 00:34:12 10/05/2019
7 | // Design Name:
8 | // Module Name: uart_rx_dzj_talk
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_dzj_lora(
22 | input clk,
23 | input rst_n,
24 | input [7:0]data_tx,
25 | input over_rx,
26 | input nedge,
27 | input over_all,
28 | output reg flag_lora
29 | );
30 |
31 | always@(posedge clk or negedge rst_n)
32 | begin
33 | if(!rst_n)
34 | flag_lora<=2'b00;
35 | else if(data_tx==8'd01) //烟雾
36 | flag_lora<=2'b01;
37 | else if(data_tx==8'd2) //震动
38 | flag_lora<=2'b10;
39 | else if(data_tx==8'd3) //门铃
40 | flag_lora<=2'b11;
41 | else flag_lora<=flag_lora;
42 | end
43 |
44 |
45 | //parameter s0=4'd0,s1=4'd1,s2=4'd2,s3=4'd3,s4=4'd4;
46 | // reg[3:0] present_state,next_state;
47 | // always@(posedge clk or negedge rst_n)
48 | // begin
49 | // if(!rst_n)
50 | // begin
51 | // present_state<=s0;
52 | // end
53 | // else if(~over_rx&nedge) present_state<=next_state;
54 | // end
55 | //
56 | // always@(*)
57 | // begin
58 | // case(present_state)
59 | // s0: if(data_tx==8'h31/*8'b01001001*/) //时间
60 | // next_state<=s1;
61 | // else next_state<=s0;
62 | // s1: if(data_tx==8'h02/*8'b00100000*/)
63 | // next_state<=s2;
64 | // else next_state<=s0;
65 | // s2: if(data_tx==8'h80/*8'b01001100*/)
66 | // next_state<=s3;
67 | // else next_state<=s0;
68 | // s3: if(data_tx==8'hEF/*8'b01101001*/)
69 | // next_state<=s4;
70 | // else next_state<=s0;
71 | // s4: if(data_tx==8'hAA/*8'b01001001*/)
72 | // next_state<=s1;
73 | // else next_state<=s0;
74 | // default: next_state<=s0;
75 | // endcase
76 | // end
77 | // always@(posedge clk or negedge rst_n)
78 | // begin
79 | // if(!rst_n)
80 | // flag<=0;
81 | // /*else if(over_all)
82 | // flag<=1'b0;*/
83 | // else if(next_state==s1)
84 | // flag<=1'b1;
85 | // else flag<=flag;
86 | // end
87 | endmodule
88 |
--------------------------------------------------------------------------------
/top_calling.v:
--------------------------------------------------------------------------------
1 | module top_calling(
2 | input clk,
3 | input rst_n,
4 | input calling_sent_en_cheng, //打电话使能,连接按键
5 | input calling_sent_en_zhi, //第二个紧急联系人
6 |
7 | output calling_tx
8 |
9 | );
10 |
11 | wire bps_sig;
12 | wire cnt_start;
13 | wire rx_int;
14 | wire [7:0] data1;
15 | wire [47:0] ymr_out;
16 | wire [47:0] time_out;
17 | wire calling_sent_en_1;
18 |
19 | assign calling_sent_en_1 = ~calling_sent_en_cheng;
20 | assign calling_sent_en_2 = ~calling_sent_en_zhi;
21 |
22 |
23 | reg tx_enable;
24 | reg [7:0] tx_data;
25 | wire bps_sig_tx;
26 | wire tx_done;
27 | wire [7:0] tx_data2 ;
28 | wire tx_enable1;
29 | wire tx_enable2;
30 | wire tx_enable3;
31 | wire tx_enable4;
32 | wire [7:0] tx_data1;
33 | wire bps_sig_ring;
34 | wire cnt_start_ring;
35 |
36 |
37 | uart_receive u1_uart_receive (
38 | .clk(clk),
39 | .rst_n(rst_n),
40 | .clk_bps(bps_sig),
41 | .data_rx(data_rx),
42 | .rx_int(rx_int),
43 | .data_tx(data1),
44 | .bps_start(cnt_start)
45 | );
46 |
47 | uart_bps u11_uart_bps (
48 | .clk(clk),
49 | .rst_n(rst_n),
50 | .cnt_start(cnt_start),
51 | .bps_sig(bps_sig)
52 | );
53 |
54 | pick_up_rx u2_pick_up_rx (
55 | .clk(clk),
56 | .rst_n(rst_n),
57 | .data_rx(data1),
58 | .rx_int(rx_int),
59 | .data_rx_end(data_rx_end),
60 | .time_out(time_out),
61 | .ymr_out(ymr_out)
62 | );
63 |
64 | uart_bps mess_u1_uart_bps (
65 | .clk(clk),
66 | .rst_n(rst_n),
67 | .cnt_start(cnt_start_ring),
68 | .bps_sig(bps_sig_ring)
69 | );
70 |
71 | //打电话
72 | calling mess_u5_calling (
73 | .tx_enable(tx_enable2),
74 | .tx_data(tx_data2),
75 | .clk(clk),
76 | .rst(rst_n),
77 | .tx_done(tx_done),
78 | .calling_sent_enable_1(calling_sent_en_1),
79 | .calling_sent_enable_2(calling_sent_en_2)
80 | );
81 |
82 |
83 | uart_bps_mess u2_uart_bps_mess (
84 | .clk(clk),
85 | .rst_n(rst_n),
86 | .bps_sig(bps_sig_tx),
87 | .cnt_start(tx_enable2)
88 | );
89 |
90 | uart_sentdata_mess u3_uart_sentdata_mess (
91 | .clk(clk),
92 | .rst(rst_n),
93 | .bps_sig(bps_sig_tx),
94 | .tx_data(tx_data2),
95 | .tx(calling_tx),
96 | .tx_enable(tx_enable2),
97 | .tx_done(tx_done)
98 | );
99 |
100 | endmodule
101 |
102 |
--------------------------------------------------------------------------------
/盲人家中板子的FPGA代码/x7seg_msg.v:
--------------------------------------------------------------------------------
1 | `timescale 1ns / 1ps
2 | //////////////////////////////////////////////////////////////////////////////////
3 | // Company:
4 | // Engineer:
5 | //
6 | // Create Date: 16:08:19 10/26/2017
7 | // Design Name:
8 | // Module Name: x7seg_msg
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 x7seg_msg(
22 | input [15:0] x,
23 | input clk,
24 | input clr,
25 | output reg [6:0] smg_duan,
26 | output reg [3:0] smg_wei,
27 | output reg dp
28 | );
29 |
30 | reg [1:0] s;
31 | reg [3:0] digit;
32 | wire [3:0] aen;
33 |
34 | parameter t1=18'd250000;
35 | reg [17:0] cnt1;
36 |
37 | assign aen=4'b1111;
38 |
39 | always@(posedge clk or posedge clr)
40 | begin
41 | if(clr==1) begin
42 | cnt1<=0;
43 | end
44 | else if(cnt1==t1-1) begin
45 | cnt1<=0;
46 | end
47 | else begin
48 | cnt1<=cnt1+1;
49 | end
50 | end
51 |
52 | always@(*)
53 | begin
54 | case(s)
55 | 0: digit=x[3:0];
56 | 1: digit=x[7:4];
57 | 2: digit=x[11:8];
58 | 3: digit=x[15:12];
59 | default: digit=x[3:0];
60 | endcase
61 | end
62 |
63 | //7段解码器
64 | always@(*)
65 | begin
66 | case(digit)
67 | 0: smg_duan=7'b0000001;
68 | 1: smg_duan=7'b1001111;
69 | 2: smg_duan=7'b0010010;
70 | 3: smg_duan=7'b0000110;
71 | 4: smg_duan=7'b1001100;
72 | 5: smg_duan=7'b0100100;
73 | 6: smg_duan=7'b0100000;
74 | 7: smg_duan=7'b0001111;
75 | 8: smg_duan=7'b0000000;
76 | 9: smg_duan=7'b0000100;
77 | 'ha: smg_duan=7'b0001000;
78 | 'hb: smg_duan=7'b1100000;
79 | 'hc: smg_duan=7'b0110001;
80 | 'hd: smg_duan=7'b1000010;
81 | 'he: smg_duan=7'b0110000;
82 | 'hf: smg_duan=7'b0111000;//空白
83 | default:smg_duan=7'b1111111;
84 | endcase
85 | end
86 |
87 | //数字选择
88 | always@(*)
89 | begin
90 | smg_wei=4'b1111;
91 | if(aen[s]==1)
92 | smg_wei[s]=0;
93 | end
94 |
95 | //2位计数器
96 | always@(posedge clk or posedge clr)
97 | begin
98 | if(clr==1) begin
99 | s<=0;
100 | dp<=1;
101 | end
102 | else if(cnt1==t1-1) begin
103 | s<=s+1;
104 | if(s==1) begin
105 | dp<=0;
106 | end
107 | else begin
108 | dp<=1;
109 | end
110 | end
111 | else begin
112 | s<=s;
113 | end
114 | end
115 | endmodule
116 |
--------------------------------------------------------------------------------
/judge_Red_Green.v:
--------------------------------------------------------------------------------
1 | `timescale 1ns / 1ps
2 | //////////////////////////////////////////////////////////////////////////////////
3 | // Company:
4 | // Engineer:
5 | //
6 | // Create Date: 22:35:32 11/02/2019
7 | // Design Name:
8 | // Module Name: judge_Red_Green
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 judge_Red_Green(
22 | input clk,
23 | input rst_n,
24 | input [7:0] RGB,
25 |
26 | output reg [1:0] Red_Green //01代表红色 , 10代表绿色
27 | );
28 |
29 |
30 | wire [7:0] r1;
31 | wire [7:0] g1;
32 | wire [7:0] b1;
33 | wire red0;
34 | wire green0;
35 | wire blue0;
36 | wire red1;
37 | wire green1;
38 | wire blue1;
39 | wire red_en;
40 | wire green_en;
41 |
42 |
43 | assign r1 = {RGB[7:5],RGB[7:5],RGB[7:6]};
44 | assign g1 = {RGB[4:2],RGB[4:2],RGB[4:3]};
45 | assign b1 = {RGB[1:0],RGB[1:0],RGB[1:0],RGB[1:0]};
46 |
47 | //红色阈值
48 | assign red0 = (r1 > 8'd0 && r1 <= 8'd185) ? 1'b1 : 1'b0;
49 | assign green0 = (g1 >= 8'd0 && g1 <= 8'd38) ? 1'b1 : 1'b0;
50 | assign blue0 = (b1 >= 8'd0 && b1 <= 8'd10) ? 1'b1 : 1'b0;
51 |
52 | //绿色阈值
53 | assign red1 = (r1 > 8'd0 && r1 <= 8'd20) ? 1'b1 : 1'b0;
54 | assign green1 = (g1 > 8'd0 && g1 <= 8'd70) ? 1'b1 : 1'b0;
55 | assign blue1 = (b1 > 8'd0 && b1 <= 8'd20) ? 1'b1 : 1'b0;
56 |
57 |
58 | assign red_en = (red0 && green0 && blue0) ? 1'b1 : 1'b0;
59 | assign green_en = (red1 && green1 && blue1) ? 1'b1 : 1'b0;
60 |
61 |
62 |
63 |
64 |
65 | reg [9:0] R_cnt;
66 |
67 |
68 | always @(posedge clk or negedge rst_n)
69 | begin
70 | if(!rst_n)
71 | R_cnt <= 10'd0;
72 | else if(red_en)
73 | R_cnt <= R_cnt + 1'b1;
74 | else
75 | R_cnt <= R_cnt;
76 | end
77 |
78 | reg [9:0] G_cnt;
79 |
80 | always @(posedge clk or negedge rst_n)
81 | begin
82 | if(!rst_n)
83 | G_cnt <= 10'd0;
84 | else if(green_en)
85 | G_cnt <= G_cnt + 1'b1;
86 | else
87 | G_cnt <= G_cnt;
88 | end
89 |
90 | always @(posedge clk or negedge rst_n)
91 | begin
92 | if(!rst_n)
93 | Red_Green <= 2'b0;
94 | else if(R_cnt >= 200)
95 | Red_Green <= 2'b01; //01代表红色
96 | else if(G_cnt >= 200)
97 | Red_Green <= 2'b10; //10代表绿色
98 | else
99 | Red_Green <= 2'b0;
100 | end
101 |
102 |
103 |
104 | endmodule
105 |
--------------------------------------------------------------------------------
/盲人家中板子的FPGA代码/uart_rx.v:
--------------------------------------------------------------------------------
1 | `timescale 1ns / 1ps
2 | //////////////////////////////////////////////////////////////////////////////////
3 | // Company:
4 | // Engineer:
5 | //
6 | // Create Date: 22:25:16 11/25/2018
7 | // Design Name:
8 | // Module Name: uart_rx
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 clk,
23 | input rst_n,
24 | input bps_clk,
25 | input data_rx,
26 | output [7:0]data_tx,
27 | output reg over_rx, //接受结束标志 0表示没在接受数据 1表示正在接受数据
28 | output reg bps_start,
29 | output nedge //开始位 下降沿检测标志
30 | );
31 | reg [1:0]tmp_rx; //下降沿检测所用寄存器
32 |
33 | reg[3:0]num; //最大到10 计数
34 | reg[7:0]data_rx0; //第一个寄存器 存每个bit位的数据
35 | reg[7:0]data_rx1; //第二个寄存器 存一个字节的
36 | always@(posedge clk or negedge rst_n) //移位寄存器 检测下降沿
37 | begin
38 | if(!rst_n) tmp_rx<=2'b11;
39 | else
40 | begin
41 | tmp_rx[0]<=data_rx;
42 | tmp_rx[1]<=tmp_rx[0];
43 | end
44 | end
45 | assign nedge=~tmp_rx[0]&tmp_rx[1];
46 |
47 | always@(posedge clk or negedge rst_n)
48 | begin
49 | if(!rst_n)
50 | begin
51 | bps_start<=1'b0;
52 | over_rx <=1'b0;
53 | end
54 | else if(!over_rx)
55 | begin
56 | if(nedge)
57 | begin
58 | bps_start<=1'b1;
59 | over_rx <=1'b1;
60 | end
61 | end
62 | else if(num==4'd10)
63 | begin
64 | bps_start<=1'b0;
65 | over_rx <=1'b0;
66 | end
67 | end
68 |
69 | always@(posedge clk or negedge rst_n)
70 | begin
71 | if(!rst_n)
72 | begin
73 | data_rx0<=1'd0;
74 | data_rx1<=1'd0;
75 | num <=1'd0;
76 | end
77 | else if(over_rx)
78 | begin
79 | if(bps_clk)
80 | begin
81 | num<=num+1'b1;
82 | case(num)
83 | 4'd1: data_rx0[0]<=data_rx;
84 | 4'd2: data_rx0[1]<=data_rx;
85 | 4'd3: data_rx0[2]<=data_rx;
86 | 4'd4: data_rx0[3]<=data_rx;
87 | 4'd5: data_rx0[4]<=data_rx;
88 | 4'd6: data_rx0[5]<=data_rx;
89 | 4'd7: data_rx0[6]<=data_rx;
90 | 4'd8: data_rx0[7]<=data_rx;
91 | default: ;
92 | endcase
93 | end
94 | else if(num==4'd10)
95 | begin
96 | data_rx1<=data_rx0;
97 | num<=4'd0;
98 | end
99 | end
100 | end
101 | assign data_tx=data_rx1;
102 | endmodule
103 |
--------------------------------------------------------------------------------
/top.v:
--------------------------------------------------------------------------------
1 | `timescale 1ns / 1ps
2 | //////////////////////////////////////////////////////////////////////////////////
3 | // Company:
4 | // Engineer:
5 | //
6 | // Create Date: 22:34:38 11/02/2019
7 | // Design Name:
8 | // Module Name: top
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 top(
22 | input clk,
23 | input rst_n,
24 | input pic_en,
25 |
26 | output VGA_HS,
27 | output VGA_VS,
28 | output [1:0] Red_Green,
29 | output [7:0] RGB
30 |
31 | );
32 |
33 | wire VGA_clk;
34 | wire disp_valid;//判断是否在有效的显示区域
35 | wire [7:0] M;
36 | wire [7:0] M_pic;
37 | wire [15:0] rom_addr16;
38 | wire [15:0] rom_addr13;
39 | wire flag_addr;
40 | wire [15:0] flag_square_begin;
41 | wire [15:0] flag_square_end;
42 | wire [6:0] cnt_x;
43 | wire [6:0] cnt_y;
44 | wire [7:0] a;
45 | wire [15:0] rom_addr;
46 |
47 |
48 |
49 | div_25HZ U_div_25HZ (
50 | .clk(clk),
51 | .rst_n(rst_n),
52 | .VGA_clk(VGA_clk)
53 | );
54 |
55 |
56 | VGA U_VGA (
57 | .clk(clk),
58 | .rst_n(rst_n),
59 | .M(a),
60 | .cnt_x(cnt_x),
61 | .cnt_y(cnt_y),
62 | .pic_en(pic_en),
63 | .VGA_HS(VGA_HS),
64 | .VGA_VS(VGA_VS),
65 | .flag_addr(flag_addr),
66 | .flag_square_begin(flag_square_begin),
67 | .flag_square_end(flag_square_end),
68 | .rom_addr16(rom_addr16),
69 | .RGB(RGB)
70 | );
71 |
72 |
73 | VGA_pic_double U_VGA_pic_double (
74 | .clka(VGA_clk), // input clka
75 | .addra(rom_addr), // input [12 : 0] addra
76 | .douta(a) // output [7 : 0] douta
77 | );
78 |
79 |
80 | VGA_square U_VGA_square (
81 | .clk(VGA_clk),
82 | .rst_n(rst_n),
83 | .M_pic(a),
84 | .cnt_x(cnt_x),
85 | .cnt_y(cnt_y),
86 | .flag_addr(flag_addr),
87 | .rom_addr13(rom_addr13),
88 | .flag_square_begin(flag_square_begin),
89 | .flag_square_end(flag_square_end)
90 | );
91 |
92 |
93 | judge_Red_Green U_judge_Red_Green (
94 | .clk(clk),
95 | .rst_n(rst_n),
96 | .RGB(RGB),
97 | .Red_Green(Red_Green)
98 | );
99 |
100 |
101 | select_addr U_select_addr (
102 | .clk(clk),
103 | .rst_n(rst_n),
104 | .flag_square_begin(flag_square_begin),
105 | .rom_addr13(rom_addr13), //VGA_square
106 | .rom_addr16(rom_addr16), //VGA_bsprite
107 | .rom_addr(rom_addr)
108 | );
109 |
110 |
111 | endmodule
112 |
--------------------------------------------------------------------------------
/盲人家中板子的FPGA代码/lora_rx_test.v:
--------------------------------------------------------------------------------
1 | `timescale 1ns / 1ps
2 |
3 | ////////////////////////////////////////////////////////////////////////////////
4 | // Company:
5 | // Engineer:
6 | //
7 | // Create Date: 17:28:52 11/20/2019
8 | // Design Name: lora_rx
9 | // Module Name: F:/Xilinx/lora_home_new/lora_rx_test.v
10 | // Project Name: uart_tx
11 | // Target Device:
12 | // Tool versions:
13 | // Description:
14 | //
15 | // Verilog Test Fixture created by ISE for module: lora_rx
16 | //
17 | // Dependencies:
18 | //
19 | // Revision:
20 | // Revision 0.01 - File Created
21 | // Additional Comments:
22 | //
23 | ////////////////////////////////////////////////////////////////////////////////
24 |
25 | module lora_rx_test;
26 |
27 | // Inputs
28 | reg clk;
29 | reg rst_n;
30 | reg data_rx;
31 | reg over_all;
32 |
33 | // Outputs
34 | wire [6:0] smg_duan;
35 | wire [3:0] smg_wei;
36 | wire dp;
37 |
38 | // Instantiate the Unit Under Test (UUT)
39 | lora_rx uut (
40 | .clk(clk),
41 | .rst_n(rst_n),
42 | .data_rx(data_rx),
43 | .over_all(over_all),
44 | .smg_duan(smg_duan),
45 | .smg_wei(smg_wei),
46 | .dp(dp)
47 | );
48 |
49 | initial begin
50 | // Initialize Inputs
51 | clk = 0;
52 | rst_n = 0;
53 | data_rx = 0;
54 | over_all = 0;
55 |
56 | // Wait 100 ns for global reset to finish
57 | #20;
58 | rst_n=1'b1;
59 | data_rx=1'b1;
60 | #8680; //434*20=8680
61 | data_rx=1'b0;
62 | #8680;
63 | data_rx=1'b1;
64 | #8680;
65 | data_rx=1'b1;
66 | #8680;
67 | data_rx=1'b1;
68 | #8680;
69 | data_rx=1'b1;
70 | #8680;
71 | data_rx=1'b1;
72 | #8680;
73 | data_rx=1'b0;
74 | #8680;
75 | data_rx=1'b0;
76 | #8680;
77 | data_rx=1'b0;
78 | #8680;
79 | data_rx=1'b1;//31
80 | #8680; //434*20=8680
81 | data_rx=1'b0;
82 | #8680;
83 | data_rx=1'b1;
84 | #8680;
85 | data_rx=1'b1;
86 | #8680;
87 | data_rx=1'b1;
88 | #8680;
89 | data_rx=1'b1;
90 | #8680;
91 | data_rx=1'b1;
92 | #8680;
93 | data_rx=1'b0;
94 | #8680;
95 | data_rx=1'b0;
96 | #8680;
97 | data_rx=1'b0;
98 | #8680;
99 | data_rx=1'b1;//31
100 | #8680; //434*20=8680
101 | data_rx=1'b0;
102 | #8680;
103 | data_rx=1'b1;
104 | #8680;
105 | data_rx=1'b1;
106 | #8680;
107 | data_rx=1'b1;
108 | #8680;
109 | data_rx=1'b1;
110 | #8680;
111 | data_rx=1'b0;
112 | #8680;
113 | data_rx=1'b0;
114 | #8680;
115 | data_rx=1'b1;
116 | #8680;
117 | data_rx=1'b0;
118 | #8680;
119 | data_rx=1'b1;//79
120 | #8680; //434*20=8680
121 | data_rx=1'b0;
122 | #8680;
123 | data_rx=1'b0;
124 | #8680;
125 | data_rx=1'b0;
126 | #8680;
127 | data_rx=1'b1;
128 | #8680;
129 | data_rx=1'b0;
130 | #8680;
131 | data_rx=1'b0;
132 | #8680;
133 | data_rx=1'b0;
134 | #8680;
135 | data_rx=1'b1;
136 | #8680;
137 | data_rx=1'b0;
138 | #8680;
139 | data_rx=1'b1;//68
140 | // Add stimulus here
141 |
142 | end
143 | always #10 clk=~clk;
144 | endmodule
145 |
146 |
--------------------------------------------------------------------------------
/data_extract.v:
--------------------------------------------------------------------------------
1 | module data_extract(clk,rst_n,date_byte,angle,rx_done,bps_cnt,byte1
2 | );
3 | input wire clk;
4 | input wire rst_n;
5 | input wire [7:0] date_byte;
6 | input wire rx_done;
7 | input wire [7:0] bps_cnt;
8 |
9 | output reg [7:0] angle;
10 | output reg [7:0] byte1 ;
11 |
12 | reg s_sign ; //帧头高电平标志
13 |
14 | reg s_sign_1;
15 | reg s_sign_2;
16 | wire neged ; //帧头高电平标志下降沿
17 | reg [1:0] fy_byte_cnt; //对俯仰角的BYTE计数
18 | reg [3:0] byte_cnt ; //对所有byte计数
19 | reg fuyang_angle; //俯仰角高电平标志
20 | reg [7:0] freq_cnt ; //采样频率计数器
21 | reg [7:0] byte2; //俯仰角高 8 位 ,航向角低 8 位
22 | wire [15:0] fs; //负数
23 |
24 | always @(posedge clk or negedge rst_n)
25 | begin
26 | if(!rst_n)
27 | byte_cnt <= 0;
28 | else if(byte_cnt==8) //帧结束标志
29 | byte_cnt <= 0;
30 | else if( rx_done == 1)
31 | byte_cnt <= byte_cnt + 1;
32 | else
33 | byte_cnt <= byte_cnt;
34 | end
35 |
36 | always @(posedge clk or negedge rst_n)
37 | begin
38 | if(!rst_n)
39 | s_sign <= 0;
40 | else if(byte_cnt==4'b0011)
41 | s_sign <= 1;
42 | else
43 | s_sign <= 0;
44 | end
45 | always @(posedge clk or negedge rst_n)
46 | begin
47 | if(!rst_n)
48 | begin
49 | s_sign_1 <= 0;
50 | s_sign_2 <= 0;
51 | end
52 | else
53 | begin
54 | s_sign_1 <= s_sign;
55 | s_sign_2 <= s_sign_1;
56 | end
57 | end
58 |
59 | assign neged = ~s_sign_1 & s_sign_2;
60 |
61 | always @(posedge clk or negedge rst_n)
62 | begin
63 | if(!rst_n)
64 | fuyang_angle <= 0;
65 | else if (neged == 1 && freq_cnt == 1 )
66 | fuyang_angle <= 1;
67 | else if(fy_byte_cnt == 2)
68 | fuyang_angle <= 0;
69 | else
70 | fuyang_angle <= fuyang_angle;
71 | end
72 |
73 | always @(posedge clk or negedge rst_n)
74 | begin
75 | if(!rst_n)
76 | freq_cnt <= 0 ;
77 | else if(freq_cnt == 3)
78 | freq_cnt <= 0;
79 | else if(neged == 1)
80 | freq_cnt <= freq_cnt+1;
81 | else
82 | freq_cnt <= freq_cnt;
83 | end
84 | always @(posedge clk or negedge rst_n)
85 | begin
86 | if(!rst_n)
87 | fy_byte_cnt <= 0;
88 | else if(freq_cnt == 2 && fuyang_angle == 1)
89 | if(rx_done == 1)
90 | fy_byte_cnt <= fy_byte_cnt + 1;
91 | else
92 | fy_byte_cnt <= fy_byte_cnt ;
93 | else
94 | fy_byte_cnt <= 0;
95 | end
96 | always @(posedge clk or negedge rst_n)
97 | begin
98 | if(!rst_n)
99 | begin
100 | byte1 <= 0;
101 | byte2 <= 0;
102 | end
103 | else if(fuyang_angle == 1)
104 | begin
105 | if(fy_byte_cnt == 0 && bps_cnt== 80)
106 | byte1 <= date_byte;
107 | else if(fy_byte_cnt == 1 && bps_cnt== 80)
108 | byte2 <= date_byte;
109 | else
110 | begin
111 | byte1 <= byte1;
112 | byte2 <= byte2;
113 | end
114 | end
115 | else
116 | begin
117 | byte1 <= byte1;
118 | byte2 <= byte2;
119 | end
120 | end
121 |
122 | assign fs = (byte1[7] == 1) ? ( ~{byte1[7:0], byte2[7:0]}) : 0;
123 | always@(posedge clk or negedge rst_n)
124 | begin
125 | if(!rst_n)
126 | angle <= 0;
127 | else if(fy_byte_cnt == 2)
128 | begin
129 | if(byte1[7] == 1'b1) //负数的时候取反加一
130 | angle <= (fs +1'b1)*41>>12; //*41>>12 = /100
131 | else
132 | angle <= ({byte1[7:0] , byte2[7:0]})*41>>12;
133 | end
134 | else
135 | angle <= angle;
136 | end
137 | endmodule
138 |
--------------------------------------------------------------------------------
/top_duanxin.v:
--------------------------------------------------------------------------------
1 | module top_duanxin(
2 | input clk,
3 | input rst_n,
4 | input mess_phone_number_prepared_enable,//短信发送使能,连接按键
5 | input data_rx,//gps的接收
6 |
7 | output gsm_tx
8 |
9 | );
10 |
11 | wire emergency_contact_1 = 1;//紧急联系人1
12 | wire emergency_contact_2 = 0;//紧急联系人2
13 | wire emergency_contact_3 = 0;//紧急联系人3
14 | wire bps_sig;
15 | wire cnt_start;
16 | wire rx_int;
17 | wire [7:0] data1;
18 | // wire [383:0] data_rx_end;
19 | wire [47:0] ymr_out;
20 | wire [47:0] time_out;
21 |
22 |
23 | reg [87:0] calling_number_end;
24 | reg [2:0] out_message_or_calling_en_or_receive;//选择输出,011是发短信功能,10是打电话功能,11是接电话功能
25 |
26 | always@(posedge clk )begin
27 | case ({0,emergency_contact_1,emergency_contact_2,emergency_contact_3})
28 | 4'b1000:calling_number_end<= 88'h0;
29 | 4'b0100:calling_number_end<= 88'h34_38_32_31_37_36_32_38_33_37_31;//程宁勃
30 | 4'b0010:calling_number_end<= 88'h30_36_34_38_34_33_31_39_36_37_31;//刘仰猛;
31 | 4'b0001:calling_number_end<= 88'h37_39_38_38_37_38_37_38_32_33_31;//张胜亭;
32 | default:calling_number_end<=calling_number_end;
33 | endcase
34 | end
35 |
36 | reg tx_enable;
37 | reg [7:0] tx_data;
38 | wire bps_sig_tx;
39 | wire tx_done;
40 | wire tx_enable1;
41 | wire tx_enable2;
42 | wire tx_enable3;
43 | wire tx_enable4;
44 | wire [7:0] tx_data1;
45 | wire bps_sig_ring;
46 | wire cnt_start_ring;
47 | wire [183:0] data_rx_end_jingduweidu;
48 |
49 |
50 | uart_receive u1_uart_receive (
51 | .clk(clk),
52 | .rst_n(rst_n),
53 | .clk_bps(bps_sig),
54 | .data_rx(data_rx),
55 | .rx_int(rx_int),
56 | .data_tx(data1),
57 | .bps_start(cnt_start)
58 | );
59 |
60 | uart_bps u11_uart_bps (
61 | .clk(clk),
62 | .rst_n(rst_n),
63 | .cnt_start(cnt_start),
64 | .bps_sig(bps_sig)
65 | );
66 |
67 | pick_up_rx u2_pick_up_rx (
68 | .clk(clk),
69 | .rst_n(rst_n),
70 | .data_rx(data1),
71 | .rx_int(rx_int),
72 | .data_rx_end(data_rx_end),
73 | .time_out(time_out),
74 | .ymr_out(ymr_out)
75 | );
76 |
77 | uart_bps mess_u1_uart_bps (
78 | .clk(clk),
79 | .rst_n(rst_n),
80 | .cnt_start(cnt_start_ring),
81 | .bps_sig(bps_sig_ring)
82 | );
83 |
84 | //短信的发送
85 | gsm mess_u4_gsm (
86 | .tx_enable(tx_enable1),
87 | .tx_data(tx_data1),
88 | .clk(clk),
89 | .rst(rst_n),
90 | .tx_done(tx_done),
91 | .mess_phone_number_prepared_enable(mess_phone_number_prepared_enable), //短信发送使能
92 | .TEXT_buf(data_rx_end_jingduweidu)
93 | );
94 |
95 | always@(posedge clk ) begin
96 | if(mess_phone_number_prepared_enable)
97 | out_message_or_calling_en_or_receive <= 3'b011;
98 | else
99 | out_message_or_calling_en_or_receive <= out_message_or_calling_en_or_receive;
100 | end
101 |
102 |
103 |
104 | always@(posedge clk )
105 | begin
106 | case(out_message_or_calling_en_or_receive)
107 | 3'b011: begin
108 | tx_data <= tx_data1;
109 | tx_enable <= tx_enable1;
110 | end
111 | default:;
112 | endcase
113 | end
114 |
115 | uart_bps_mess u2_uart_bps_mess (
116 | .clk(clk),
117 | .rst_n(rst_n),
118 | .bps_sig(bps_sig_tx),
119 | .cnt_start(tx_enable)
120 | );
121 |
122 | uart_sentdata_mess u3_uart_sentdata_mess (
123 | .clk(clk),
124 | .rst(rst_n),
125 | .bps_sig(bps_sig_tx),
126 | .tx_data(tx_data),
127 | .tx(gsm_tx),
128 | .tx_enable(tx_enable),
129 | .tx_done(tx_done)
130 | );
131 |
132 |
133 | top_gps u_top_gps(
134 | .clk(clk),
135 | .rst_n(rst_n),
136 | .data_rx(data_rx),//gps的接收端
137 | .data_rx_end(data_rx_end_jingduweidu)
138 | );
139 |
140 | endmodule
141 |
--------------------------------------------------------------------------------
/shumaguan.v:
--------------------------------------------------------------------------------
1 | module shumaguan( jishu,jiaodu,clk,smg_duan,smg_wei,dp,rst,licheng1
2 | );
3 | input [60:0] jishu;
4 | input [9:0]jiaodu;
5 | input clk;
6 | input rst;
7 | output reg [6:0] smg_duan;
8 | output reg [3:0] smg_wei;
9 | output reg dp;
10 | output [7:0]licheng1;
11 | reg [1:0] s;
12 | reg [3:0] digit;
13 | wire [3:0] aen;
14 |
15 | parameter t1=18'd250000;
16 | reg [17:0] cnt6;
17 |
18 | assign aen=4'b1111;
19 |
20 | always@(posedge clk or negedge rst)
21 | begin
22 | if(rst==0) begin
23 | cnt6<=0;
24 | end
25 | else if(cnt6==t1-1) begin
26 | cnt6<=0;
27 | end
28 | else begin
29 | cnt6<=cnt6+1;
30 | end
31 | end
32 |
33 | reg [60:0]jishu_dis;
34 | reg [60:0] jishu_reg1;
35 | reg [60:0] jishu_reg2;
36 | reg [7:0]a;
37 | reg [3:0]b;
38 | reg [3:0]c;
39 | reg [3:0]d;
40 | assign change = (jishu_reg1 == jishu_reg2)?0:1;
41 |
42 | always@(posedge clk or negedge rst)
43 | begin
44 | if(!rst)
45 | begin
46 | jishu_reg1 <= 39'b0;
47 | jishu_reg2 <= 39'b0;
48 | end
49 | else
50 | begin
51 | jishu_reg1 <= jishu;
52 | jishu_reg2 <= jishu_reg1;
53 | end
54 | end
55 |
56 | always@(posedge clk or negedge rst)
57 | begin
58 | if(!rst)
59 | begin
60 | jishu_dis <= 39'd0;
61 | a <= 4'd0;
62 | b <= 4'd0;
63 | c <= 4'd0;
64 | d <= 4'd0;
65 | end
66 | else if(change)
67 | begin
68 | a <= 4'd0;
69 | b <= 4'd0;
70 | c <= 4'd0;
71 | d <= 4'd0;
72 | jishu_dis <= jishu;
73 | end
74 | else
75 | begin
76 | if(jishu_dis >= 20'd1000000)//if(jishu_dis >= 16'd1000)
77 | begin
78 | jishu_dis <= jishu_dis - 20'd1000000;
79 | a <= a + 1;
80 | end
81 | else
82 | if(jishu_dis >= 17'd100000)//if(jishu_dis >= 16'd100)
83 | begin
84 | jishu_dis <= jishu_dis - 17'd100000;
85 | b <= b + 1;
86 | end
87 | else
88 | if(jishu_dis >= 14'd10000)//if(jishu_dis >= 16'd10)
89 | begin
90 | jishu_dis <= jishu_dis - 14'd10000;
91 | c <= c + 1;
92 | end
93 | else
94 | if(jishu_dis >= 10'd1000)//if(jishu_dis >= 16'd1)
95 | begin
96 | jishu_dis <= jishu_dis - 10'd1000;
97 | d <= d + 1;
98 | end
99 | else
100 | begin
101 | a <= a;
102 | b <= b;
103 | c <= c;
104 | d <= d;
105 | jishu_dis <= jishu_dis;
106 | end
107 | end
108 |
109 | end
110 |
111 | assign licheng1= d*1+c*10+b*100+a*1000;
112 | always@(*)
113 | begin
114 | case(s)
115 | 0: digit=d;// 0: digit=jiaodu[3:0];//0: digit=d;
116 | 1: digit=c;// 1: digit=jiaodu[7:4];//1: digit=c;
117 | 2: digit=b;// 2: digit=jiaodu[9:8];//2: digit=b;
118 | 3: digit=a;// 3: digit=1'b0; //3: digit=a;
119 | default: digit=a;//default: digit=jiaodu[3:0];
120 | endcase
121 | end
122 |
123 | //7段解码器
124 | always@(*)
125 | begin
126 | case(digit)
127 | 0: smg_duan=7'b0000001;
128 | 1: smg_duan=7'b1001111;
129 | 2: smg_duan=7'b0010010;
130 | 3: smg_duan=7'b0000110;
131 | 4: smg_duan=7'b1001100;
132 | 5: smg_duan=7'b0100100;
133 | 6: smg_duan=7'b0100000;
134 | 7: smg_duan=7'b0001111;
135 | 8: smg_duan=7'b0000000;
136 | 9: smg_duan=7'b0000100;
137 | 'ha: smg_duan=7'b0001000;
138 | 'hb: smg_duan=7'b1100000;
139 | 'hc: smg_duan=7'b0110001;
140 | 'hd: smg_duan=7'b1111110;
141 | 'he: smg_duan=7'b0110000;
142 | 'hf: smg_duan=7'b1111111;//空白
143 | default:smg_duan=7'b1111111;
144 | endcase
145 | end
146 |
147 | //数字选择
148 | always@(*)
149 | begin
150 | smg_wei=4'b1111;
151 | if(aen[s]==1)
152 | smg_wei[s]=0;
153 | end
154 |
155 | //2位计数器
156 | always@(posedge clk or negedge rst)
157 | begin
158 | if(rst==0) begin
159 | s<=0;
160 | dp<=1;
161 | end
162 | else if(cnt6==t1-1) begin
163 | s<=s+1;
164 | if(s==1) begin
165 | dp<=0;
166 | end
167 | else begin
168 | dp<=1;
169 | end
170 | end
171 | else begin
172 | s<=s;
173 | end
174 | end
175 |
176 |
177 |
178 | endmodule
179 |
--------------------------------------------------------------------------------
/盲人家中板子的FPGA代码/uart_tx_dzj.v:
--------------------------------------------------------------------------------
1 | `timescale 1ns / 1ps
2 | //////////////////////////////////////////////////////////////////////////////////
3 | // Company:
4 | // Engineer:
5 | //
6 | // Create Date: 20:44:32 11/24/2018
7 | // Design Name:
8 | // Module Name: uart_tx_dzj
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_tx_dzj(
22 | input [3:0]in_key_en,
23 | input co,
24 | input zhendong,
25 | input clk,
26 | input rst_n,
27 | input over_tx,
28 |
29 | output reg [7:0]data_rx,
30 | output reg send_en,
31 | output reg fengshan
32 | );
33 | reg [3:0]cnt; //最大要记到14 I like verilog 一共14个字符
34 | reg[1:0] flag; //判断哪个按键按下 输出不同的话
35 | always@(posedge clk or negedge rst_n) //数每个字符结束 递 下一个字符的计数器
36 | begin
37 | if(!rst_n)
38 | cnt<=1'b0;
39 | else if(over_tx)
40 | cnt<=cnt+1'b1;
41 | else if(|in_key_en)
42 | cnt<=1'b0;
43 | end
44 | reg [1:0]tmp_co;
45 | always@(posedge clk or negedge rst_n)
46 | begin
47 | if(!rst_n)
48 | tmp_co<=2'b00;
49 | else begin
50 | tmp_co[1]<=co;
51 | tmp_co[0]<=tmp_co[1];
52 | end
53 | end
54 |
55 | assign co_h=~tmp_co[1]&tmp_co[0];
56 |
57 | reg [27:0] cnt_3s;
58 | always@(posedge clk or negedge rst_n)
59 | begin
60 | if(!rst_n)
61 | cnt_3s<=1'b0;
62 | else if(cnt_3s==28'd150000000)
63 | cnt_3s<=1'b0;
64 | else cnt_3s<=cnt_3s+1'b1;
65 | end
66 | always@(posedge clk or negedge rst_n)
67 | begin
68 | if(!rst_n)
69 | fengshan<=1'b0;
70 | else if(!co/*&&cnt_3s==28'd150000000*/)
71 | fengshan<=1'b1;
72 | else fengshan<=1'b0;
73 | end
74 |
75 |
76 |
77 | always@(posedge clk or negedge rst_n)
78 | begin
79 | if(!rst_n)
80 | flag<=1'b0;
81 | else if(co_h)
82 | flag<=2'b01;
83 | else if(zhendong)
84 | flag<=2'b10;
85 | else if(in_key_en[2])
86 | flag<=2'b11;
87 | else flag<=flag;
88 | end
89 |
90 | always@(posedge clk or negedge rst_n)
91 | begin
92 | if(!rst_n)
93 | send_en<=1'b0;
94 | else if(co_h|(over_tx&cnt<4'd14))
95 | send_en<=1'b1;
96 | else if(zhendong|(over_tx&cnt<4'd2))
97 | send_en<=1'b1;
98 | else if(in_key_en[2]|(over_tx&cnt<4'd2))
99 | send_en<=1'b1;
100 | else send_en<=1'b0;
101 | end
102 |
103 |
104 | always@(*)
105 | begin
106 | case(flag)
107 | 0: ;
108 | 2'd1:
109 | begin
110 | case(cnt) //烟雾
111 | 4'd0:data_rx=8'b00000001; //I
112 | /*4'd1:data_rx=8'b00100000; //
113 | 4'd2:data_rx=8'b01001100; //L
114 | 4'd3:data_rx=8'b01101001; //i
115 | 4'd4:data_rx=8'b01101011; //k
116 | 4'd5:data_rx=8'b01100101; //e
117 | 4'd6:data_rx=8'b00100000; //
118 | 4'd7:data_rx=8'b01000110; //F
119 | 4'd8:data_rx=8'b01010000; //P
120 | 4'd9:data_rx=8'b01000111; //G
121 | 4'd10:data_rx=8'b01000001; //A */
122 | endcase
123 | end
124 | 2'd2:
125 | begin //震动
126 | case(cnt)
127 | 4'd0:data_rx=8'b00000010; //I
128 | /*4'd1:data_rx=8'b00100000; //
129 | 4'd2:data_rx=8'b01001100; //L
130 | 4'd3:data_rx=8'b01101001; //i
131 | 4'd4:data_rx=8'b01101011; //k
132 | 4'd5:data_rx=8'b01100101; //e
133 | 4'd6:data_rx=8'b00100000; //
134 | 4'd7:data_rx=8'b01010110; //V
135 | 4'd8:data_rx=8'b01100101; //e
136 | 4'd9:data_rx=8'b01110010; //r
137 | 4'd10:data_rx=8'b01101001; //i
138 | 4'd11:data_rx=8'b01101100; //l
139 | 4'd12:data_rx=8'b01101111; //o
140 | 4'd13:data_rx=8'b01100111; //g */
141 | endcase
142 | end
143 | 2'd3:
144 | begin //门铃
145 | case(cnt)
146 | 4'd0:data_rx=8'b00000011; //I
147 | /*4'd1:data_rx=8'b00100000; //
148 | 4'd2:data_rx=8'b01001100; //L
149 | 4'd3:data_rx=8'b01101001; //i
150 | 4'd4:data_rx=8'b01101011; //k
151 | 4'd5:data_rx=8'b01100101; //e
152 | 4'd6:data_rx=8'b00100000; //
153 | 4'd7:data_rx=8'b00110001; //1
154 | 4'd8:data_rx=8'b00110000; //0
155 | 4'd9:data_rx=8'b00110111; //7 */
156 | endcase
157 | end
158 | endcase
159 | end
160 | endmodule
--------------------------------------------------------------------------------
/bcd2.v:
--------------------------------------------------------------------------------
1 | module bcd2(input clk,
2 | input rst_n,
3 | input tran_en,
4 | input [15:0] data_in,
5 | output reg tran_done,
6 | output [15:0] bcd
7 |
8 | );
9 | parameter DATA_WIDTH = 16;
10 | parameter SHIFT_WIDTH = 5;
11 | parameter SHIFT_DEPTH = 16;
12 |
13 | //-------------------------------------------------------
14 | localparam IDLE = 3'b001;
15 | localparam SHIFT = 3'b010;
16 | localparam DONE = 3'b100;
17 |
18 | //-------------------------------------------------------
19 | reg [2:0] pre_state;
20 | reg [2:0] next_state;
21 | //
22 | reg [SHIFT_DEPTH-1:0] shift_cnt;
23 | //
24 | reg [DATA_WIDTH:0] data_reg;
25 | reg [3:0] thou_reg;
26 | reg [3:0] hund_reg;
27 | reg [3:0] tens_reg;
28 | reg [3:0] unit_reg;
29 | reg [3:0] thou_out;
30 | reg [3:0] hund_out;
31 | reg [3:0] tens_out;
32 | reg [3:0] unit_out;
33 | wire [3:0] thou_tmp;
34 | wire [3:0] hund_tmp;
35 | wire [3:0] tens_tmp;
36 | wire [3:0] unit_tmp;
37 |
38 | //-------------------------------------------------------
39 | //FSM step1
40 | always @(posedge clk or negedge rst_n)begin
41 | if(rst_n == 1'b0)begin
42 | pre_state <= IDLE;
43 | end
44 | else begin
45 | pre_state <= next_state;
46 | end
47 | end
48 |
49 | //FSM step2
50 | always @(*)begin
51 | case(pre_state)
52 | IDLE:begin
53 | if(tran_en == 1'b1)
54 | next_state = SHIFT;
55 | else
56 | next_state = IDLE;
57 | end
58 | SHIFT:begin
59 | if(shift_cnt == SHIFT_DEPTH + 1)
60 | next_state = DONE;
61 | else
62 | next_state = SHIFT;
63 | end
64 | DONE:begin
65 | next_state = IDLE;
66 | end
67 | default:next_state = IDLE;
68 | endcase
69 | end
70 |
71 | //FSM step3
72 | always @(posedge clk or negedge rst_n)begin
73 | if(rst_n == 1'b0)begin
74 | thou_reg <= 4'b0;
75 | hund_reg <= 4'b0;
76 | tens_reg <= 4'b0;
77 | unit_reg <= 4'b0;
78 | tran_done <= 1'b0;
79 | shift_cnt <= 'd0;
80 | data_reg <= 'd0;
81 | end
82 | else begin
83 | case(next_state)
84 | IDLE:begin
85 | thou_reg <= 4'b0;
86 | hund_reg <= 4'b0;
87 | tens_reg <= 4'b0;
88 | unit_reg <= 4'b0;
89 | tran_done <= 1'b0;
90 | shift_cnt <= 'd0;
91 | data_reg <= data_in;
92 | end
93 | SHIFT:begin
94 | if(shift_cnt == SHIFT_DEPTH + 1)
95 | shift_cnt <= 'd0;
96 | else begin
97 | shift_cnt <= shift_cnt + 1'b1;
98 | data_reg <= data_reg << 1;
99 | unit_reg <= {unit_tmp[2:0], data_reg[16]};
100 | tens_reg <= {tens_tmp[2:0], unit_tmp[3]};
101 | hund_reg <= {hund_tmp[2:0], tens_tmp[3]};
102 | thou_reg <= {thou_tmp[2:0], hund_tmp[3]};
103 | end
104 | end
105 | DONE:begin
106 | tran_done <= 1'b1;
107 | end
108 | default:begin
109 | thou_reg <= thou_reg;
110 | hund_reg <= hund_reg;
111 | tens_reg <= tens_reg;
112 | unit_reg <= unit_reg;
113 | tran_done <= tran_done;
114 | shift_cnt <= shift_cnt;
115 | end
116 | endcase
117 | end
118 | end
119 | //-------------------------------------------------------
120 | always @(posedge clk or negedge rst_n)begin
121 | if(rst_n == 1'b0)begin
122 | thou_out <= 'd0;
123 | hund_out <= 'd0;
124 | tens_out <= 'd0;
125 | unit_out <= 'd0;
126 | end
127 | else if(tran_done == 1'b1)begin
128 | thou_out <= thou_reg;
129 | hund_out <= hund_reg;
130 | tens_out <= tens_reg;
131 | unit_out <= unit_reg;
132 | end
133 | else begin
134 | thou_out <= thou_out;
135 | hund_out <= hund_out;
136 | tens_out <= tens_out;
137 | unit_out <= unit_out;
138 | end
139 | end
140 |
141 |
142 | //-------------------------------------------------------
143 | assign thou_tmp = (thou_reg > 4'd4)? (thou_reg + 2'd3) : thou_reg;
144 | assign hund_tmp = (hund_reg > 4'd4)? (hund_reg + 2'd3) : hund_reg;
145 | assign tens_tmp = (tens_reg > 4'd4)? (tens_reg + 2'd3) : tens_reg;
146 | assign unit_tmp = (unit_reg > 4'd4)? (unit_reg + 2'd3) : unit_reg;
147 |
148 | assign bcd = {thou_out,hund_out,tens_out,unit_out};
149 |
150 |
151 | endmodule
152 |
--------------------------------------------------------------------------------
/bin_bcd.v:
--------------------------------------------------------------------------------
1 | module bin_bcd(
2 | input clk,
3 | input rst_n,
4 | input tran_en,
5 | input [15:0] data_in,
6 | output reg tran_done,
7 | output [15:0] bcd
8 |
9 | );
10 | parameter DATA_WIDTH = 16;
11 | parameter SHIFT_WIDTH = 5;
12 | parameter SHIFT_DEPTH = 16;
13 |
14 | //-------------------------------------------------------
15 | localparam IDLE = 3'b001;
16 | localparam SHIFT = 3'b010;
17 | localparam DONE = 3'b100;
18 |
19 | //-------------------------------------------------------
20 | reg [2:0] pre_state;
21 | reg [2:0] next_state;
22 | //
23 | reg [SHIFT_DEPTH-1:0] shift_cnt;
24 | //
25 | reg [DATA_WIDTH:0] data_reg;
26 | reg [3:0] thou_reg;
27 | reg [3:0] hund_reg;
28 | reg [3:0] tens_reg;
29 | reg [3:0] unit_reg;
30 | reg [3:0] thou_out;
31 | reg [3:0] hund_out;
32 | reg [3:0] tens_out;
33 | reg [3:0] unit_out;
34 | wire [3:0] thou_tmp;
35 | wire [3:0] hund_tmp;
36 | wire [3:0] tens_tmp;
37 | wire [3:0] unit_tmp;
38 |
39 | //-------------------------------------------------------
40 | //FSM step1
41 | always @(posedge clk or negedge rst_n)begin
42 | if(rst_n == 1'b0)begin
43 | pre_state <= IDLE;
44 | end
45 | else begin
46 | pre_state <= next_state;
47 | end
48 | end
49 |
50 | //FSM step2
51 | always @(*)begin
52 | case(pre_state)
53 | IDLE:begin
54 | if(tran_en == 1'b1)
55 | next_state = SHIFT;
56 | else
57 | next_state = IDLE;
58 | end
59 | SHIFT:begin
60 | if(shift_cnt == SHIFT_DEPTH + 1)
61 | next_state = DONE;
62 | else
63 | next_state = SHIFT;
64 | end
65 | DONE:begin
66 | next_state = IDLE;
67 | end
68 | default:next_state = IDLE;
69 | endcase
70 | end
71 |
72 | //FSM step3
73 | always @(posedge clk or negedge rst_n)begin
74 | if(rst_n == 1'b0)begin
75 | thou_reg <= 4'b0;
76 | hund_reg <= 4'b0;
77 | tens_reg <= 4'b0;
78 | unit_reg <= 4'b0;
79 | tran_done <= 1'b0;
80 | shift_cnt <= 'd0;
81 | data_reg <= 'd0;
82 | end
83 | else begin
84 | case(next_state)
85 | IDLE:begin
86 | thou_reg <= 4'b0;
87 | hund_reg <= 4'b0;
88 | tens_reg <= 4'b0;
89 | unit_reg <= 4'b0;
90 | tran_done <= 1'b0;
91 | shift_cnt <= 'd0;
92 | data_reg <= data_in;
93 | end
94 | SHIFT:begin
95 | if(shift_cnt == SHIFT_DEPTH + 1)
96 | shift_cnt <= 'd0;
97 | else begin
98 | shift_cnt <= shift_cnt + 1'b1;
99 | data_reg <= data_reg << 1;
100 | unit_reg <= {unit_tmp[2:0], data_reg[16]};
101 | tens_reg <= {tens_tmp[2:0], unit_tmp[3]};
102 | hund_reg <= {hund_tmp[2:0], tens_tmp[3]};
103 | thou_reg <= {thou_tmp[2:0], hund_tmp[3]};
104 | end
105 | end
106 | DONE:begin
107 | tran_done <= 1'b1;
108 | end
109 | default:begin
110 | thou_reg <= thou_reg;
111 | hund_reg <= hund_reg;
112 | tens_reg <= tens_reg;
113 | unit_reg <= unit_reg;
114 | tran_done <= tran_done;
115 | shift_cnt <= shift_cnt;
116 | end
117 | endcase
118 | end
119 | end
120 | //-------------------------------------------------------
121 | always @(posedge clk or negedge rst_n)begin
122 | if(rst_n == 1'b0)begin
123 | thou_out <= 'd0;
124 | hund_out <= 'd0;
125 | tens_out <= 'd0;
126 | unit_out <= 'd0;
127 | end
128 | else if(tran_done == 1'b1)begin
129 | thou_out <= thou_reg;
130 | hund_out <= hund_reg;
131 | tens_out <= tens_reg;
132 | unit_out <= unit_reg;
133 | end
134 | else begin
135 | thou_out <= thou_out;
136 | hund_out <= hund_out;
137 | tens_out <= tens_out;
138 | unit_out <= unit_out;
139 | end
140 | end
141 |
142 |
143 | //-------------------------------------------------------
144 | assign thou_tmp = (thou_reg > 4'd4)? (thou_reg + 2'd3) : thou_reg;
145 | assign hund_tmp = (hund_reg > 4'd4)? (hund_reg + 2'd3) : hund_reg;
146 | assign tens_tmp = (tens_reg > 4'd4)? (tens_reg + 2'd3) : tens_reg;
147 | assign unit_tmp = (unit_reg > 4'd4)? (unit_reg + 2'd3) : unit_reg;
148 |
149 | assign bcd = {thou_out,hund_out,tens_out,unit_out};
150 |
151 |
152 | endmodule
--------------------------------------------------------------------------------
/GY25_RX.v:
--------------------------------------------------------------------------------
1 | module GY25_RX(clk,rst_n,rs232_rx,data_byte,rx_done,bps_cnt
2 | );
3 | input wire clk;
4 | input wire rst_n;
5 | input wire rs232_rx;
6 |
7 | output reg [7:0]data_byte;
8 | output reg rx_done;
9 | output reg [7:0]bps_cnt;
10 |
11 | wire neged;
12 | reg UART_state;
13 | reg [8:0] cnt;
14 | reg bps_clk;
15 | reg [2:0] r_date_byte[7:0];
16 | reg [7:0] tmp_date_byte;
17 | reg s0_rs232_rx;
18 | reg s1_rs232_rx;
19 | reg tmp0_rs232_rx;
20 | reg tmp1_rs232_rx;
21 | reg [2:0] start_bit;
22 | reg [2:0] end_bite;
23 |
24 | //同步寄存,消除亚稳态//////////////////////
25 | always @(posedge clk or negedge rst_n)
26 | begin
27 | if(!rst_n)
28 | begin
29 | s0_rs232_rx<=0;
30 | s1_rs232_rx<=0;
31 | end
32 | else
33 | begin
34 | s0_rs232_rx<=rs232_rx;
35 | s1_rs232_rx<=s0_rs232_rx;
36 | end
37 | end
38 | //检测下降沿/////////////////////////////////////
39 | always @(posedge clk or negedge rst_n)
40 | begin
41 | if(!rst_n)
42 | begin
43 | tmp0_rs232_rx<=0;
44 | tmp1_rs232_rx<=0;
45 | end
46 | else
47 | begin
48 | tmp0_rs232_rx<=s1_rs232_rx;
49 | tmp1_rs232_rx<=tmp0_rs232_rx;
50 | end
51 | end
52 | assign neged=!tmp0_rs232_rx & tmp1_rs232_rx;//检测下降沿/
53 | //串口状态////////////////////////////
54 | always @(posedge clk or negedge rst_n)
55 | begin
56 | if(!rst_n)
57 | UART_state<=0;
58 | else if(neged)
59 | UART_state<=1;
60 | else if(bps_cnt==159||((bps_cnt==12)&&(start_bit>2)))
61 | UART_state<=0;
62 | end
63 | /////////////////////////////////////////
64 | always @(posedge clk or negedge rst_n)
65 | begin
66 | if(!rst_n)
67 | cnt<=0;
68 | else if(UART_state) begin
69 | if(cnt==26)
70 | cnt<=0;
71 | else
72 | cnt<=cnt+1;
73 | end
74 | else
75 | cnt<=0;
76 | end
77 | //波特率时钟///////////////////////////////
78 | always @(posedge clk or negedge rst_n)
79 | begin
80 | if(!rst_n)
81 | bps_clk<=0;
82 | else if(cnt==1)
83 | bps_clk<=1;
84 | else
85 | bps_clk<=0;
86 | end
87 | //发送完成信号////////////////////////////
88 | always @(posedge clk or negedge rst_n)
89 | begin
90 | if(!rst_n)
91 | rx_done<=0;
92 | else if(bps_cnt==159)
93 | rx_done<=1;
94 | else
95 | rx_done<=0;
96 | end
97 | //波特率时钟计数器//////////////////////////
98 | always @(posedge clk or negedge rst_n)
99 | begin
100 | if(!rst_n)
101 | bps_cnt<=0;
102 | else if(bps_cnt==159||((bps_cnt==12)&&(start_bit>2)))
103 | bps_cnt<=0;
104 | else if(bps_clk)
105 | bps_cnt<=bps_cnt+1;
106 | end
107 |
108 | always @(posedge clk or negedge rst_n)
109 | begin
110 | if(!rst_n)
111 | begin
112 | start_bit<=3'b0;
113 | r_date_byte[0]<=3'b0;
114 | r_date_byte[1]<=3'b0;
115 | r_date_byte[2]<=3'b0;
116 | r_date_byte[3]<=3'b0;
117 | r_date_byte[4]<=3'b0;
118 | r_date_byte[5]<=3'b0;
119 | r_date_byte[6]<=3'b0;
120 | r_date_byte[7]<=3'b0;
121 | end_bite<=3'b0;
122 | end
123 | else if(bps_clk) begin
124 | case(bps_cnt)
125 | 1:begin
126 | start_bit<=3'b0;
127 | r_date_byte[0]<=3'b0;
128 | r_date_byte[1]<=3'b0;
129 | r_date_byte[2]<=3'b0;
130 | r_date_byte[3]<=3'b0;
131 | r_date_byte[4]<=3'b0;
132 | r_date_byte[5]<=3'b0;
133 | r_date_byte[6]<=3'b0;
134 | r_date_byte[7]<=3'b0;
135 | end_bite<=3'b0;
136 | end
137 | 6,7,8,9,10,11: start_bit<=start_bit+rs232_rx;
138 | 22,23,24,25,26,27: r_date_byte[0]<=r_date_byte[0]+rs232_rx;
139 | 38,39,40,41,42,43: r_date_byte[1]<=r_date_byte[1]+rs232_rx;
140 | 54,55,56,57,58,59: r_date_byte[2]<=r_date_byte[2]+rs232_rx;
141 | 70,71,72,73,74,75: r_date_byte[3]<=r_date_byte[3]+rs232_rx;
142 | 86,87,88,89,90,91: r_date_byte[4]<=r_date_byte[4]+rs232_rx;
143 | 102,103,104,105,106,107: r_date_byte[5]<=r_date_byte[5]+rs232_rx;
144 | 118,119,120,121,122,123: r_date_byte[6]<=r_date_byte[6]+rs232_rx;
145 | 134,135,136,137,138,139: r_date_byte[7]<=r_date_byte[7]+rs232_rx;
146 | 150,151,152,153,154,155: end_bite<=end_bite+rs232_rx;
147 | default: ;
148 | endcase
149 | end
150 | end
151 | always @(posedge clk or negedge rst_n)
152 | begin
153 | if(!rst_n)
154 | tmp_date_byte<=0;
155 | else if(bps_cnt==159)begin
156 | tmp_date_byte[0]<=r_date_byte[0][2];
157 | tmp_date_byte[1]<=r_date_byte[1][2];
158 | tmp_date_byte[2]<=r_date_byte[2][2];
159 | tmp_date_byte[3]<=r_date_byte[3][2];
160 | tmp_date_byte[4]<=r_date_byte[4][2];
161 | tmp_date_byte[5]<=r_date_byte[5][2];
162 | tmp_date_byte[6]<=r_date_byte[6][2];
163 | tmp_date_byte[7]<=r_date_byte[7][2];
164 | end
165 | else
166 | tmp_date_byte<=8'b0;
167 | end
168 | always @(posedge clk or negedge rst_n)
169 | begin
170 | if(!rst_n)
171 | data_byte<=0;
172 | else if(rx_done)
173 | data_byte<=tmp_date_byte;
174 | else
175 | data_byte<=data_byte;
176 |
177 | end
178 | endmodule
179 |
--------------------------------------------------------------------------------
/VGA.v:
--------------------------------------------------------------------------------
1 | `timescale 1ns / 1ps
2 | //////////////////////////////////////////////////////////////////////////////////
3 | // Company:
4 | // Engineer:
5 | //
6 | // Create Date: 22:34:55 11/02/2019
7 | // Design Name:
8 | // Module Name: VGA
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 VGA(
22 | input clk,
23 | input rst_n,
24 | input [7:0] M,
25 | input pic_en,//控制是否进行特征识别
26 | input flag_addr,//表示边框xy比例检测成功,VGA可以进行计数
27 | input [15:0] flag_square_begin,//显示起点
28 | input [15:0] flag_square_end,//显示终点
29 | input [6:0] cnt_x,//特征边沿的x
30 | input [6:0] cnt_y,//特征边沿的y
31 |
32 | output VGA_HS,
33 | output VGA_VS,
34 | output reg [15:0] rom_addr16,
35 | output reg [7:0] RGB
36 | );
37 |
38 |
39 |
40 | //行参数
41 | parameter H_SP = 10'd96;//同步头脉冲(负极性)
42 | parameter H_BP = 10'd48;//显示后沿
43 | parameter H_FP = 10'd16;//显示前沿
44 | parameter H_DISP = 10'd640;//显示时序段
45 | parameter H_pixels = 10'd800;//行像素点
46 |
47 | //列参数
48 | parameter V_SP = 10'd2;//同步头脉冲(负极性)
49 | parameter V_BP = 10'd29;
50 | parameter V_FP = 10'd14;
51 | parameter V_DISP = 10'd480;
52 | parameter V_lines = 10'd525;//总行数
53 |
54 |
55 | //显示图片 高(H)宽(W)
56 | parameter H = 8'd200;
57 | parameter W = 8'd164;
58 |
59 | //图片起点
60 | parameter xpic = 8'd5;
61 | parameter ypic = 8'd5;
62 |
63 |
64 |
65 |
66 |
67 | reg VGA_clk;
68 | reg [9:0] h_cnt;//行计数
69 | reg [9:0] v_cnt;//场计数
70 |
71 | wire disp_valid;
72 |
73 |
74 | //分频
75 | always @(posedge clk or negedge rst_n)begin
76 | if(!rst_n)
77 | VGA_clk <= 1'b0;
78 | else
79 | VGA_clk <= ~VGA_clk;
80 | end
81 |
82 | //行同步信号发生器
83 | always @(posedge VGA_clk or negedge rst_n)begin
84 | if(!rst_n)
85 | h_cnt <= 10'b0;
86 | else begin
87 | if( h_cnt == H_pixels - 1'b1)
88 | h_cnt <= 10'b0;
89 | else
90 | h_cnt <= h_cnt + 1'b1;
91 | end
92 | end
93 |
94 | //场同步信号发生器
95 | always @(posedge VGA_clk or negedge rst_n)begin
96 | if(!rst_n)
97 | v_cnt <= 10'b0;
98 | else begin
99 | if(h_cnt == H_pixels - 1'b1)begin
100 | if( v_cnt == V_lines - 1'b1)
101 | v_cnt <= 10'b0;
102 | else
103 | v_cnt <= v_cnt + 1'b1;
104 | end
105 | end
106 | end
107 |
108 | //HS 和 VS
109 | assign VGA_VS = (v_cnt >= 0 && v_cnt < V_SP) ? 1'b0:1'b1;
110 | assign VGA_HS = (h_cnt >= 0 && h_cnt < H_SP) ? 1'b0:1'b1;
111 |
112 |
113 | assign disp_valid = (h_cnt >= (H_SP + H_BP + H_FP) && h_cnt <= H_pixels && v_cnt >= (V_SP + V_BP + V_FP) && v_cnt < V_lines)&&
114 | ((h_cnt - (H_SP + H_BP + H_FP)) > 0 && (h_cnt - (H_SP + H_BP + H_FP)) < (0 + W))&&
115 | ((v_cnt - (V_SP + V_BP + V_FP) ) > 0 && (v_cnt - (V_SP + V_BP + V_FP) ) < (0 + H)) ? 1'b1:1'b0;
116 |
117 |
118 |
119 | //时序电路,用来给rom_addr16寄存器赋值
120 | always@(posedge clk or negedge rst_n)begin
121 | if(!rst_n)
122 | rom_addr16 <= 16'd0;
123 | else if(disp_valid)
124 | rom_addr16 <= (h_cnt - 160) + (v_cnt - 45) * W;
125 | else
126 | rom_addr16 <= 16'd0;
127 | end
128 |
129 |
130 |
131 | reg [6:0] N;
132 | reg [6:0] n;
133 |
134 | always @(posedge VGA_clk or negedge rst_n)begin
135 | if(!rst_n)
136 | N <= 7'd0;
137 | else if( (N + 1'b1) > cnt_y - 2 )//减2,目的红绿灯下面背景黄线
138 | N <= 7'd0;
139 | else if(n == cnt_x )
140 | N <= N + 1'b1;
141 | else
142 | N <= N;
143 | end
144 |
145 | reg [6:0] f;
146 |
147 | always @(posedge VGA_clk or negedge rst_n)begin
148 | if(!rst_n)
149 | f <= 7'd0;
150 | else if(rom_addr16 >= flag_square_begin + N*200 && n == cnt_x && cnt_x >= 1'b1)
151 | f <= f + 1'b1;
152 | else
153 | f <= 7'd0;
154 | end
155 |
156 |
157 | //时序电路,用来给RGB寄存器赋值
158 | always @ (posedge VGA_clk or negedge rst_n) begin //每个时钟上升沿赋值
159 | if(!rst_n)begin
160 | n <= 7'd0;
161 | RGB <= 8'd0;
162 | end
163 | else if(!pic_en)
164 | RGB <= M;
165 |
166 | else if(n == cnt_x)
167 | n <= 7'd0;
168 | else begin
169 | if( disp_valid == 1'b1)
170 | begin
171 |
172 | case (f)
173 |
174 | 0: if(rom_addr16 >= flag_square_begin + N*200 && rom_addr16 <= flag_square_begin + (N+1)*cnt_x + N*80)
175 | begin
176 | RGB <= M;
177 | n <= n + 1;
178 | end
179 | else begin
180 | RGB <= 8'd0;
181 | n <= 1'b0;
182 | end
183 |
184 |
185 | N : if(rom_addr16 >= flag_square_begin + N*200 && rom_addr16 <= flag_square_begin + (N+1)*cnt_x + N*80)
186 | begin
187 | RGB <= M;
188 | n <= n + 1;
189 | end
190 | else begin
191 | RGB <= 8'd0;
192 | n <= 1'b0;
193 | end
194 |
195 | endcase
196 |
197 | end
198 | end
199 | end
200 |
201 | endmodule
202 |
203 |
--------------------------------------------------------------------------------
/zhuti.v:
--------------------------------------------------------------------------------
1 | module zhuti(
2 | input clk,
3 | input rst,
4 | input du_en,
5 | input a,
6 | input b,
7 | input [9:0]jiaodu, //GY_26传过来的角度,正北是0°,0-360度
8 |
9 | output reg [1:0]dianji,
10 | output [60:0]jishu,
11 | output wire[8:0]JD,
12 | output reg [8:0]baidu_JD,
13 | input [7:0]licheng
14 | );
15 | wire podge;
16 | reg [1:0]tmp_rx; //上升沿检测所用寄存器
17 | always@(posedge clk or negedge rst) //移位寄存器 检测下降沿
18 | begin
19 | if(!rst) tmp_rx<=2'b00;
20 | else
21 | begin
22 | tmp_rx[0]<=du_en;
23 | tmp_rx[1]<=tmp_rx[0];
24 | end
25 | end
26 | assign podge=tmp_rx[0]&~tmp_rx[1];
27 |
28 |
29 |
30 | reg wea;
31 | reg [6:0] addra;
32 | wire [92:0] douta;
33 |
34 |
35 | daohang_ram u_daohang_ram(
36 | .clka(clka),
37 | .rsta(!rsta),
38 | .ocea(1),
39 | .addra(addra), //[2:0]
40 | .doa(douta) //[92:0]
41 | );
42 |
43 |
44 | reg [92:0]addra1;
45 | always@(posedge clk or negedge rst) //地址打一拍
46 | begin
47 | if(!rst) begin addra1<=1'b0; end
48 | else
49 | begin
50 | addra1<=addra;
51 | end
52 | end
53 |
54 | reg flag; //检测输出的地址有没有变化,没有变化是1 有变化是0 flag
55 | always@(*)
56 | begin
57 | if(addra1==addra)
58 | flag<=1'b1;
59 | else flag<=1'b0;
60 | end
61 |
62 | /*wire nedge;
63 | reg [1:0]tmp_rx1; //flag下降沿检测所用寄存器
64 | always@(posedge clk or negedge rst) //移位寄存器 检测下降沿
65 | begin
66 | if(!rst) tmp_rx1<=2'b11;
67 | else
68 | begin
69 | tmp_rx1[0]<=flag;
70 | tmp_rx1[1]<=tmp_rx1[0];
71 | end
72 | end
73 | assign nedge=~tmp_rx1[0]&tmp_rx1[1];*/
74 |
75 |
76 | assign JD=jiaodu[9:8]*100+jiaodu[7:4]*10+jiaodu[3:0];
77 |
78 | //对百度传回来的角度进行翻译 枚举值,返回值在0-11之间的一个值,共12个枚举值,以30度递进,即每个值代表角度范围为30度;其中返回"0"代表345度到15度,以此类推,返回"11"代表315度到345度";分别代表的含义是:0-[345°-15°];1-[15°-45°];2-[45°-75°];3-[75°-105°];4-[105°-135°];5-[135°-165°];6-[165°-195°];7-[195°-225°];8-[225°-255°];9-[255°-285°];10-[285°-315°];11-[315°-345°]
79 | //reg [8:0]baidu_JD;
80 | always@(posedge clk)
81 | begin
82 | if(douta[84])
83 | case(douta[83:80])
84 | 4'd0: baidu_JD<=1'b0;
85 | 4'd1: baidu_JD<=9'd30;
86 | 4'd2: baidu_JD<=9'd60;
87 | 4'd3: baidu_JD<=9'd90;
88 | 4'd4: baidu_JD<=9'd120;
89 | 4'd5: baidu_JD<=9'd150;
90 | 4'd6: baidu_JD<=9'd180;
91 | 4'd7: baidu_JD<=9'd195;
92 | 4'd8: baidu_JD<=9'd240;
93 | 4'd9: baidu_JD<=9'd270;
94 | 4'd10: baidu_JD<=9'd300;
95 | 4'd11: baidu_JD<=9'd330;
96 | endcase
97 | end
98 | reg data_a1;
99 | reg data_a2;
100 | always @(posedge clk or negedge rst)
101 | begin
102 | if(!rst)
103 | begin
104 | data_a1 <= 1'b0;
105 | data_a2 <= 1'b0;
106 | end
107 | else
108 | begin
109 | data_a1 <= a;
110 | data_a2 <= data_a1;
111 | end
112 | end
113 | assign double_a = data_a1 ^ data_a2;//双边沿 编码器1A相
114 |
115 |
116 |
117 | reg data_b1;
118 | reg data_b2;
119 | always @(posedge clk or negedge rst)
120 | begin
121 | if(!rst)
122 | begin
123 | data_b1 <= 1'b0;
124 | data_b2 <= 1'b0;
125 | end
126 | else
127 | begin
128 | data_b1 <= b;
129 | data_b2 <= data_b1;
130 | end
131 | end
132 | assign double_b = data_b1 ^ data_b2;//双边沿 编码器1B相
133 |
134 |
135 |
136 |
137 | reg clk1;
138 | reg data_clk1;
139 | reg data_clk2;
140 | always @ (posedge clk,negedge rst)
141 | begin
142 | if(!rst)
143 | begin data_clk1 <= 1'b0; data_clk2 <= 1'b0; end
144 | else
145 | begin data_clk1 <= clk1; data_clk2 <= data_clk1;end
146 | end
147 | assign raising_clk1 = data_clk1 & (~data_clk2);//上升沿
148 |
149 |
150 | reg [27:0]cnt1;
151 | reg [60:0]cnt2;
152 | always@(posedge clk or negedge rst)
153 | begin
154 | if(!rst)
155 | begin
156 | cnt1 <= 28'd0;
157 | cnt2 <= 61'd0;
158 | end
159 | else if(flag==1'b0)
160 | cnt2<=1'b0;
161 | else if(double_a==1|double_b==1)
162 | cnt1 <= cnt1 + 1'b1;
163 | else if(raising_clk1 == 1 /*&& flag *//*&& JD==baidu_JD */)
164 | begin
165 | cnt1 <= 0;
166 | cnt2 <= cnt2 + 1'b1;
167 | end
168 | else
169 | begin
170 | cnt1 <= cnt1;
171 | cnt2 <= cnt2;
172 | end
173 | end
174 | always@(posedge clk or negedge rst)//2,632,500
175 | if(!rst)
176 | begin
177 | clk1 <= 0;
178 | end
179 | else if(cnt1 == 38'd195)
180 | begin
181 | clk1 <= 1;
182 | end
183 | else
184 | clk1 <= 0;
185 | assign jishu = ((((cnt2*13*5)*13)*24*41)>>12)/8;
186 |
187 | always@(posedge clk or negedge rst)
188 | begin
189 | if(!rst)
190 | dianji<=2'b00;
191 | else begin
192 | if(podge)
193 | begin wea<=1'b0; addra<=1'b0;end
194 | if(douta[84]&&du_en)//需要转弯 1001右转 0110左转 1010直走
195 | begin
196 | if(JD==baidu_JD) begin //小车的角度等于需要转的角度
197 | dianji<=2'b11;
198 | if(licheng==douta[92:85]&flag)
199 | addra<=addra+1'b1;
200 | else addra<=addra;
201 | end
202 | else if (JDbaidu_JD) //小车现在的角度大于需要转到的角度 左转
205 | dianji<=2'b01;
206 |
207 | end
208 | else
209 | dianji <= 2'b00;
210 | end
211 | end
212 |
213 |
214 |
215 | endmodule
216 |
--------------------------------------------------------------------------------
/bizhang.v:
--------------------------------------------------------------------------------
1 | module bizhang(clk,rst,hq,hz,jiaodu,dianji2,led7,led6,led5,led4,/*led3,led2,*/jiaodu1,flag1
2 | );
3 | input clk;
4 | input rst;
5 | input [9:0]hq;
6 | input [9:0]hz;
7 | input [9:0]jiaodu;
8 | output [9:0]jiaodu1;
9 | output reg[1:0]dianji2;
10 | output reg led7;
11 | output reg led6;
12 | output reg led5;
13 | output reg led4;
14 | output flag1;
15 | /*output reg led3;
16 | output reg led2;*/
17 | reg [3:0]state;
18 | reg [9:0]jiaodu1;
19 | parameter safe= 60;
20 | wire [9:0]JD;
21 | assign JD=jiaodu[9:8]*100+jiaodu[7:4]*10+jiaodu[3:0];
22 |
23 | /*reg data_in_d1;
24 | reg data_in_d2;
25 |
26 | always @ (posedge clk,negedge rst)
27 | begin
28 | if(!rst)
29 | begin data_in_d1 <= 1'b0; data_in_d2 <= 1'b0; end
30 | else
31 | begin data_in_d1 <= flag; data_in_d2 <= data_in_d1;end
32 | end
33 | assign raising_flag = data_in_d1 & (~data_in_d2);//上升沿*/
34 | /*reg [30:0]cnt;
35 | always@(posedge clk or negedge rst)
36 | if(!rst)
37 | cnt <= 31'd0;
38 | else if(cnt == 30'd250_000_000)
39 | cnt <= 31'd0;
40 | else
41 | cnt <= cnt;
42 | reg [30:0]cnt2;
43 | always@(posedge clk or negedge rst)
44 | if(!rst)
45 | cnt2 <= 31'd0;
46 | else if(cnt == 30'd250_000_000&&(JD==jiaodu1 + 90))
47 | cnt2 <= cnt2 + 1'b1;
48 | else
49 | cnt2 <= cnt2;*/
50 |
51 | reg [30:0]cnt1;
52 | reg [30:0]cnt3;
53 | always@(posedge clk or negedge rst)
54 | if(!rst)
55 | begin
56 | cnt1 <= 31'd0;
57 | cnt3 <= 31'd0;
58 | end
59 | else if(cnt3 == 30'd50_000_000)
60 | begin
61 | cnt1 <= cnt1 + 1'b1;
62 | cnt3 <= 31'd0;
63 | end
64 | else
65 | begin
66 | cnt1 <= cnt1;
67 | cnt3 <= cnt3 + 1'b1;
68 | end
69 |
70 |
71 | always@(posedge clk or negedge rst)
72 | if(!rst)
73 | jiaodu1 <= 10'd0;
74 | else if(cnt1 == 1)
75 | jiaodu1 <= JD;
76 | else
77 | jiaodu1 <= jiaodu1;
78 | always@(posedge clk or negedge rst)
79 | if(!rst)
80 | begin
81 | led7 <= 1'b0;
82 | led6 <= 1'b0;
83 | led5 <= 1'b0;
84 | led4 <= 1'b0;
85 | // led3 <= 1'b0;
86 | // led2 <= 1'b0;
87 | end
88 | else if(state == 4'd0)
89 | led7 <= 1;
90 | else if(state == 4'd1)
91 | led6 <= 1;
92 | else if(state == 4'd2)
93 | led5 <= 1;
94 | else if(state == 4'd3)
95 | led4 <= 1;
96 | // else if(state == 4'd4)
97 | // led3 <= 1;
98 | //else if(state == 4'd5)
99 | //led2 <= 1;
100 | else
101 | begin
102 | led7 <= led7;
103 | led6 <= led6;
104 | led5 <= led5;
105 | led4 <= led4;
106 | //led3 <= led3;
107 | // led2 <= led2;
108 | end
109 |
110 |
111 | /*reg [30:0]cnt5;
112 | /*always@(posedge clk or negedge rst)
113 | if(!rst)
114 | begin
115 | cnt4 <= 31'd0;
116 | cnt5 <= 31'd0;
117 | end
118 | else if((cnt5 == 30'd50_000_000) && (state == 4'd2))
119 | begin
120 | cnt4 <= cnt4 + 1'b1;
121 | cnt5 <= 31'd0;
122 | end
123 | else
124 | begin
125 | cnt4 <= cnt4;
126 | cnt5 <= cnt5 + 1'b1;
127 | end*/
128 |
129 | reg flag1;
130 | always@(posedge clk or negedge rst)
131 | if(!rst)
132 | begin
133 | dianji2 <= 2'b00;
134 | state <= 4'd0;
135 | flag1 <= 0;
136 | end
137 | else
138 | if(hq != 0)
139 | begin
140 | case(state)
141 | 0: if(hq > 50)
142 | begin
143 | dianji2 <= 2'b11;
144 | state <= 4'd0;
145 | end
146 | else
147 | begin
148 | dianji2 <= 2'b10;
149 | state <= 4'd1;
150 | flag1 <= 1;
151 | end
152 | 1: if(JD==jiaodu1 + 70)
153 | begin
154 | dianji2 <= 2'b11;
155 | state <= 4'd2;
156 | end
157 | else
158 | begin
159 | if(JD < jiaodu1 + 70)
160 | begin
161 | dianji2 <= 2'b10;
162 | state <= 4'd1;
163 | end
164 | else if(JD > jiaodu1 + 70)
165 | begin
166 | dianji2 <= 2'b01;
167 | state <= 4'd1;
168 | end
169 | end
170 | 2: if(hz > 80)
171 | begin
172 | dianji2 <= 2'b01;
173 | state <= 4'd3;
174 | flag1 <= 0;
175 | end
176 | else
177 | begin
178 | dianji2 <= 2'b11;
179 | state <= 4'd2;
180 | end
181 | 3: if(JD==jiaodu1)
182 | begin
183 | dianji2 <= 2'b11;
184 | state <= 4'd4;
185 | end
186 | else
187 | begin
188 | if(JD < jiaodu1 )
189 | begin
190 | dianji2 <= 2'b10;
191 | state <= 4'd3;
192 | end
193 | else if(JD > jiaodu1 )
194 | begin
195 | dianji2 <= 2'b01;
196 | state <= 4'd3;
197 | end
198 | end
199 | 4: if(hz > 80)
200 | begin
201 | dianji2 <= 2'b01;
202 | state <= 4'd5;
203 | end
204 | else
205 | begin
206 | dianji2 <= 2'b11;
207 | state <= 4'd4;
208 | end
209 | 5: if(JD == jiaodu1 - 70 )
210 | begin
211 | dianji2 <= 2'b11;
212 | state <= 4'd6;
213 | end
214 | else
215 | begin
216 | if(JD < jiaodu1 )
217 | begin
218 | dianji2 <= 2'b10;
219 | state <= 4'd5;
220 | end
221 | else if(JD > jiaodu1 )
222 | begin
223 | dianji2 <= 2'b01;
224 | state <= 4'd5;
225 | end
226 | end
227 | 6: begin
228 | state <= state;
229 | dianji2 <= 2'b00;
230 | end
231 |
232 | endcase
233 | end
234 | else
235 | dianji2 <= 2'b00;
236 |
237 |
238 |
239 | endmodule
240 |
--------------------------------------------------------------------------------
/xinlv_rx.v:
--------------------------------------------------------------------------------
1 | module xinlv_rx(
2 | input clk,
3 | input rst_n,
4 | input [7:0] data_rx,
5 | input rx_int,//当uart_rx模块接收完对方的数据后,传给uart_tx,此为标志位,标志uart_tx要开始工作
6 |
7 | output reg [7:0] xinlv//
8 | );
9 |
10 |
11 | //-------------------------------------------------------
12 | //每个8位数据接收完整的标志
13 | reg [1:0] rx_int_r;
14 | always@(posedge clk or negedge rst_n)begin
15 | if(!rst_n) begin
16 | rx_int_r[0] <= 1'b0;
17 | rx_int_r[1] <= 1'b0;
18 | end
19 | else begin
20 | rx_int_r[0] <= rx_int;
21 | rx_int_r[1] <= rx_int_r[0];
22 | end
23 | end
24 |
25 | wire nege_edge = rx_int_r[1] & ~rx_int_r[0];//下降沿
26 |
27 |
28 | //---------------------------------------------------
29 | reg [7:0] data_rx_r;//用来接收传过来的data_rx
30 | //将rx接来的数据存下来
31 | always@(posedge clk or negedge rst_n)begin
32 | if(!rst_n) begin
33 | data_rx_r <= 8'd0;
34 | end
35 | else if(nege_edge)begin
36 | data_rx_r <= data_rx;
37 | end
38 | end
39 |
40 | ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
41 | // //
42 | // 检测分段距离 //
43 | // //
44 | ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
45 |
46 | parameter length = 4; //更方便地更改状态长度
47 |
48 | parameter [length-1 : 0] //one-hot code
49 | S_IDLE = 11'b0001,
50 | S_State1 = 11'b0010,
51 | S_State2 = 11'b0100,
52 | S_State3 = 11'b1000;
53 |
54 | reg [length-1 : 0] c_state;
55 | reg [length-1 : 0] n_state;
56 | //三段式状态机
57 | always @(posedge clk or negedge rst_n) begin
58 | if (!rst_n) begin
59 | c_state <= S_IDLE; // reset低电平复位
60 | end
61 | else begin
62 | c_state <= n_state; //next state logic
63 | end
64 | end
65 |
66 | always @(*) begin //state register
67 | case(c_state)
68 | S_IDLE :
69 | if (data_rx_r == 8'h42 && nege_edge)//B
70 | n_state = S_State1;
71 | else
72 | n_state = S_IDLE;
73 | S_State1 :
74 | if (data_rx_r == 8'h50 && nege_edge)//P
75 | n_state = S_State2;
76 | else
77 | n_state = S_State1;
78 | S_State2 :
79 | if (data_rx_r == 8'h4d && nege_edge)//M
80 | n_state = S_State3;
81 | else
82 | n_state = S_State2;
83 | S_State3 :
84 | if (data_rx_r && nege_edge)
85 | n_state = S_IDLE;
86 | else
87 | n_state = S_IDLE;
88 | default :
89 | n_state = S_IDLE;
90 | endcase
91 | end
92 |
93 |
94 | reg detected_o;
95 | //状态机输出output logic
96 | always @ (posedge clk or negedge rst_n) begin
97 | if(!rst_n) begin
98 | detected_o <= 1'b0;
99 | end
100 | else if( c_state == S_State3) begin
101 | detected_o <= 1'b1;
102 | end
103 | else begin
104 | detected_o <= 1'b0;
105 | end
106 | end
107 |
108 |
109 | ///检测到上升沿信号后持续输出高电平
110 | reg [5:0] num; //包传到哪个数据了
111 | reg start_reg;
112 | reg timeout;
113 | always@(posedge clk)
114 | start_reg <= detected_o;
115 |
116 | always@(posedge clk or negedge rst_n) begin
117 | if (!rst_n)
118 | timeout <= 0;
119 | else if(start_reg == 0 && detected_o ==1)//检测上升沿的
120 | timeout <= 1;
121 | else
122 | timeout <= timeout;
123 | end
124 |
125 |
126 |
127 | reg [7:0] data_pickup_r;//用来提取接收传过来的data_rx
128 | //将rx接来的数据存下来
129 | always@(posedge clk or negedge rst_n)begin
130 | if(!rst_n) begin
131 | data_pickup_r <= 8'd0;
132 | end
133 | else if(timeout) begin
134 | data_pickup_r <= data_rx_r; //此时已经是传完$GPRMC,后面传的均为数据
135 | end
136 | end
137 |
138 |
139 | //-------------------------------------------------------
140 | //判断包头,确定开始,以及识别号
141 | always@(posedge clk or negedge rst_n)
142 | begin
143 | if(!rst_n)
144 | num <= 4'd0;
145 | else if(num == 3)
146 | num <= 0;
147 | else if( start_reg == 0 && detected_o ==1 )
148 | num <= 0;
149 | else if( (timeout && nege_edge) || (timeout && start_reg))
150 | num <= num + 1'b1;
151 | else
152 | num <= num;
153 | end
154 |
155 |
156 | reg [15:0] xinlv_ascii;
157 |
158 | always@(posedge clk or negedge rst_n)begin
159 | if(!rst_n)
160 | xinlv_ascii <= 16'b0000_0000_1111_1111;
161 | else if(nege_edge && data_pickup_r >= 8'h30 && data_pickup_r <= 8'h39)begin
162 | case(num)
163 | 4'd1: xinlv_ascii[15:8] <= data_pickup_r;
164 | 4'd2: xinlv_ascii[7:0] <= data_pickup_r;
165 | default:;
166 | endcase
167 | end
168 | end
169 |
170 |
171 | reg [5:0] cnt;
172 | //打50拍
173 | always@(posedge clk or negedge rst_n)
174 | begin
175 | if(!rst_n)
176 | cnt <= 6'b0;
177 | else if(num == 1)
178 | cnt <= 6'b0;
179 | else if(cnt == 51)
180 | cnt <= cnt;
181 | else if(num == 2)
182 | cnt <= cnt + 1;
183 | else
184 | cnt <= 6'b0;
185 | end
186 |
187 | wire flag_distance;
188 | //取红外距离值使能
189 | assign flag_distance = (cnt == 50)?1:0;
190 |
191 | reg [7:0] xinlv_10jinzhi;
192 |
193 | always@(posedge clk or negedge rst_n)begin
194 | if(!rst_n)
195 | xinlv_10jinzhi <= 8'b0;
196 | else if(num == 3)
197 | xinlv_10jinzhi <= xinlv_ascii[11:8]*10 + xinlv_ascii[3:0];
198 | else
199 | xinlv_10jinzhi <= xinlv_10jinzhi;
200 | end
201 |
202 |
203 | always@(posedge clk or negedge rst_n)begin
204 | if(!rst_n)
205 | xinlv <= 8'b0;
206 | else if( xinlv_10jinzhi >= 60 && xinlv_10jinzhi <= 90)
207 | xinlv <= xinlv_10jinzhi;
208 | else
209 | xinlv <= xinlv;
210 | end
211 |
212 | endmodule
213 |
214 |
--------------------------------------------------------------------------------
/top_surf_net.v:
--------------------------------------------------------------------------------
1 | module top_surf_net(
2 | input clk_24m,
3 | input rst_n,
4 | input mess_phone_number_prepared_enable,//发送使能,连接按键
5 | input data_rx,
6 |
7 | output gsm_tx,//输出给sim900a信号
8 |
9 |
10 | input du_en,
11 | input a,
12 | input b,//1
13 | input flag,
14 | input data_rx_jiaodu,
15 |
16 | output [6:0] smg_duan,
17 | output [3:0] smg_wei,
18 | output dp,
19 | output RX232,
20 | output [1:0] dianji,
21 | output [8:0] baidu_JD
22 |
23 |
24 |
25 |
26 |
27 | );
28 |
29 | wire emergency_contact_1 = 1;//紧急联系人1
30 | wire emergency_contact_2 = 0;
31 | wire emergency_contact_3 = 0;
32 | wire bps_sig;
33 | wire cnt_start;
34 | wire rx_int;
35 | wire [7:0] data1;
36 | wire [47:0] ymr_out;
37 | wire [47:0] time_out;
38 | wire clk_25m;
39 | wire clk_50m;
40 | wire clk_72m;
41 |
42 |
43 |
44 |
45 | reg [87:0] calling_number_end;
46 | reg [2:0] out_message_or_calling_en_or_receive;//选择输出,011是发短信功能,10是打电话功能,11是接电话功能
47 |
48 | always@(posedge clk_50m )begin
49 | case ({0,emergency_contact_1,emergency_contact_2,emergency_contact_3})
50 | 4'b1000:calling_number_end<= 88'h0;
51 | 4'b0100:calling_number_end<= 88'h34_38_32_31_37_36_32_38_33_37_31;//程宁勃
52 | 4'b0010:calling_number_end<= 88'h30_36_34_38_34_33_31_39_36_37_31;//刘仰猛;
53 | 4'b0001:calling_number_end<= 88'h37_39_38_38_37_38_37_38_32_33_31;//张胜亭;
54 | default:calling_number_end<=calling_number_end;
55 | endcase
56 | end
57 |
58 | reg tx_enable;
59 | reg [7:0] tx_data;
60 | wire bps_sig_tx;
61 | wire tx_done;
62 | wire tx_enable1;
63 | wire tx_enable2;
64 | wire tx_enable3;
65 | wire tx_enable4;
66 | wire [7:0] tx_data1;
67 | wire bps_sig_ring;
68 | wire cnt_start_ring;
69 |
70 |
71 |
72 |
73 | PLL_50M u_PLL_50M (
74 | .refclk(clk_24m),
75 | .clk0_out(clk_72m),
76 | .clk1_out(clk_50m),
77 | .clk2_out(clk_25m)
78 | );
79 |
80 | uart_receive u1_uart_receive (
81 | .clk(clk_50m),
82 | .rst_n(rst_n),
83 | .clk_bps(bps_sig),
84 | .data_rx(data_rx),
85 | .rx_int(rx_int),
86 | .data_tx(data1),
87 | .bps_start(cnt_start)
88 | );
89 |
90 | uart_bps u11_uart_bps (
91 | .clk(clk_50m),
92 | .rst_n(rst_n),
93 | .cnt_start(cnt_start),
94 | .bps_sig(bps_sig)
95 | );
96 |
97 | pick_up_rx u2_pick_up_rx (
98 | .clk(clk_50m),
99 | .rst_n(rst_n),
100 | .data_rx(data1),
101 | .rx_int(rx_int),
102 | .data_rx_end(data_rx_end),
103 | .time_out(time_out),
104 | .ymr_out(ymr_out)
105 | );
106 |
107 | uart_bps mess_u1_uart_bps (
108 | .clk(clk_50m),
109 | .rst_n(rst_n),
110 | .cnt_start(cnt_start_ring),
111 | .bps_sig(bps_sig_ring)
112 | );
113 |
114 | //访问网址
115 | surf_internet mess_u4_surf_internet (
116 | .tx_enable(tx_enable1),
117 | .tx_data(tx_data1),
118 | .clk(clk_50m),
119 | .rst(rst_n),
120 | .tx_done(tx_done),
121 | .mess_phone_number_prepared_enable(mess_phone_number_prepared_enable) //上网发送使能
122 | );
123 |
124 | always@(posedge clk_50m ) begin
125 | if(mess_phone_number_prepared_enable)
126 | out_message_or_calling_en_or_receive <= 3'b011;
127 | else
128 | out_message_or_calling_en_or_receive <= out_message_or_calling_en_or_receive;
129 | end
130 |
131 |
132 |
133 | always@(posedge clk_50m )
134 | begin
135 | case(out_message_or_calling_en_or_receive)
136 | 3'b011: begin
137 | tx_data <= tx_data1;
138 | tx_enable <= tx_enable1;
139 | end
140 | default:;
141 | endcase
142 | end
143 |
144 | uart_bps_mess u2_uart_bps_mess (
145 | .clk(clk_50m),
146 | .rst_n(rst_n),
147 | .bps_sig(bps_sig_tx),
148 | .cnt_start(tx_enable)
149 | );
150 |
151 | uart_sentdata_mess u3_uart_sentdata_mess (
152 | .clk(clk_50m),
153 | .rst(rst_n),
154 | .bps_sig(bps_sig_tx),
155 | .tx_data(tx_data),
156 | .tx(gsm_tx),
157 | .tx_enable(tx_enable),
158 | .tx_done(tx_done)
159 | );
160 |
161 | wire [92:0] data_rx_end_internet;
162 | wire flag_en_1;
163 | wire [2:0] addr_daohang_data;
164 |
165 |
166 | //read internet data
167 | top_rx_surf u_top_rx_surf (
168 | .clk(clk_50m),
169 | .rst_n(rst_n),
170 | .data_rx(data_rx),
171 | .flag_en_1(flag_en_1),//ram写使能
172 | .addr_daohang_data(addr_daohang_data),//ram写地址
173 | .data_rx_end_internet(data_rx_end_internet)//ram写数据
174 | );
175 |
176 |
177 | wire [2:0] addr_daohang;
178 | wire [92:0] dout_daohang;
179 |
180 | reg [3:0] cnt_flag_en_1;
181 |
182 | always @(posedge clk_50m or negedge rst_n)
183 | begin
184 | if(!rst_n)
185 | cnt_flag_en_1 <= 1'b0;
186 | else if(cnt_flag_en_1 >= 7)
187 | cnt_flag_en_1 <= cnt_flag_en_1;
188 | else if(flag_en_1)
189 | cnt_flag_en_1 <= cnt_flag_en_1 + 1'b1;
190 | else
191 | cnt_flag_en_1 <= cnt_flag_en_1;
192 | end
193 |
194 | reg [26:0] cnt_3s;
195 |
196 | always @(posedge clk_24m or negedge rst_n)
197 | begin
198 | if(!rst_n)
199 | cnt_3s <= 27'b0;
200 | else if(cnt_3s == 27'd7200_0000 - 1)
201 | cnt_3s <= cnt_3s;
202 | else if(cnt_flag_en_1 == 7)
203 | cnt_3s <= cnt_3s + 1;
204 | else
205 | cnt_3s <= 27'b0;
206 | end
207 |
208 | assign read_en = (cnt_3s == 27'd7200_0000 - 1)?1:0;
209 |
210 |
211 |
212 | //导航RAM
213 | ram_daohang_data u_ram_daohang_data (
214 | //write
215 | .clka(clk_50m),
216 | .cea(flag_en_1),
217 | .addra(addr_daohang_data),
218 | .dia(data_rx_end_internet),
219 | //read
220 | .clkb(clk_50m),
221 | .rstb(!rst_n),
222 | .addrb(addr_daohang),
223 | .dob(dout_daohang)
224 | );
225 |
226 |
227 |
228 |
229 | top2 u_daohang(
230 | .clk_24m(clk_24m),
231 | .rst(rst_n),
232 | .du_en(du_en),
233 | .a(a),
234 | .b(b),//1
235 | .flag(flag),
236 | .data_rx_jiaodu(data_rx_jiaodu),
237 | .smg_duan(smg_duan),
238 | .smg_wei(smg_wei),
239 | .dp(dp),
240 | .RX232(RX232),
241 | .dianji(dianji),
242 | .baidu_JD(baidu_JD),
243 | .addra(addr_daohang),
244 | .douta(dout_daohang)
245 | );
246 |
247 |
248 |
249 |
250 |
251 | endmodule
252 |
--------------------------------------------------------------------------------
/calling.v:
--------------------------------------------------------------------------------
1 | module calling(
2 |
3 | input clk,rst,
4 | input tx_done, //uart结束使能,该输入只维持一个时钟周期
5 | input calling_sent_enable_1, //一个段时间的高电平(源自 点击确认键)
6 | input calling_sent_enable_2,
7 |
8 | output reg tx_enable,
9 | output reg [7:0] tx_data
10 | );
11 |
12 | wire [87:0] calling_number_cheng = 88'h34_38_32_31_37_36_32_38_33_37_31;//程宁勃
13 | wire [87:0] calling_number_zhi = 88'h39_32_33_36_35_38_31_39_35_35_31;//支梦巡
14 | reg [87:0] calling_number;
15 |
16 | always @(*)
17 | if(calling_sent_enable_1 == 1)
18 | calling_number <= calling_number_cheng;
19 | else if(calling_sent_enable_2 == 1)
20 | calling_number <= calling_number_zhi;
21 | else
22 | calling_number <= calling_number_cheng;
23 |
24 |
25 | reg [31:0] AT;//AT命令寄存器;
26 | reg [5:0] num;
27 |
28 | reg [47:0] ATE1; //设置回显,即模块将收到的指令完整的返回给发送给设备,方便调试
29 | reg [135:0] ATD; //ATD+"phone_number"+;
30 | reg [39:0] ATH; //挂断电话
31 | reg [87:0] COLP;
32 |
33 | reg [87:0] phone_number_buf;
34 | //手机号的处理
35 | always@(posedge clk or negedge rst)
36 | if(!rst) begin
37 | phone_number_buf <= 0 ;
38 | end
39 | else begin
40 | phone_number_buf <= calling_number ;
41 | end
42 |
43 | //短发送使能信号的处理 (延时了一个时钟周期,并且获得了两个系统时钟周期的高电平使能信叿)
44 | reg mess_phone_number_prepared_enable_r1 ;
45 | reg mess_phone_number_prepared_enable_r2 ;
46 | reg mess_phone_number_prepared_enable_r3 ;
47 | always@(posedge clk or negedge rst)
48 | if(!rst) begin
49 | mess_phone_number_prepared_enable_r1 <= 0 ;
50 | mess_phone_number_prepared_enable_r2 <= 0 ;
51 | mess_phone_number_prepared_enable_r3 <= 0 ;
52 | end
53 | else begin
54 | mess_phone_number_prepared_enable_r1 <= (calling_sent_enable_1 || calling_sent_enable_2) ;
55 | mess_phone_number_prepared_enable_r2 <= mess_phone_number_prepared_enable_r1 ;
56 | mess_phone_number_prepared_enable_r3 <= mess_phone_number_prepared_enable_r2 ;
57 | end
58 | wire mess_phone_number_prepared_enable_r ;
59 | assign mess_phone_number_prepared_enable_r = mess_phone_number_prepared_enable_r2 | mess_phone_number_prepared_enable_r3 ;
60 |
61 | reg calling_sent_enable;
62 | always@(posedge clk or negedge rst)
63 | if(!rst)
64 | calling_sent_enable <= 0 ;
65 | else
66 | calling_sent_enable <= mess_phone_number_prepared_enable_r ;
67 |
68 | reg message_sent_enable_r1;
69 | reg message_sent_enable_r2;
70 | wire message_sent_enable_r;
71 | assign message_sent_enable_r = message_sent_enable_r1 & ~message_sent_enable_r2 ;
72 | always@(posedge clk or negedge rst)
73 | if(!rst) begin
74 | message_sent_enable_r1 <= 0;
75 | message_sent_enable_r2 <= 0;
76 | end
77 | else begin
78 | message_sent_enable_r1 <= calling_sent_enable;
79 | message_sent_enable_r2 <= message_sent_enable_r1 ;
80 | end
81 |
82 | parameter T1s = 27'd90_000;
83 |
84 | reg[26:0]cnt_T1s;
85 | reg[10:0]cnt_T5s;
86 | always@(posedge clk or negedge rst)
87 | begin
88 | if(!rst)
89 | begin
90 | cnt_T1s <= 26'd0;
91 | end
92 | else if(message_sent_enable_r==1)
93 | begin
94 | cnt_T1s <= 0 ;
95 | end
96 | else if(cnt_T1s == T1s) //每完成一次计数,就是结束了一绿8bit的ASCII码的发鿿
97 | begin
98 | cnt_T1s <= 26'd0;
99 | end
100 | else
101 | begin
102 | cnt_T1s <= cnt_T1s + 1'b1;
103 | end
104 | end
105 |
106 | always@(posedge clk or negedge rst)
107 | begin
108 | if(!rst)
109 | begin
110 | cnt_T5s <= 26'd0;
111 | end
112 | else if(message_sent_enable_r==1)
113 | begin
114 | cnt_T5s <= 0 ;
115 | end
116 | else if(cnt_T1s == T1s)
117 | begin
118 | cnt_T5s <= cnt_T5s + 1'b1;
119 | end
120 | else
121 | begin
122 | cnt_T5s <= cnt_T5s;
123 | end
124 | end
125 |
126 | reg message_sent_done_flag ; //来自下一个发送模块,发鿁完成一组指令的使能信号。高"1"有效,维持丿小段时钟周期
127 | reg message_sent_enable_en ; //真正启动发鿁的使能信号。可以发送的期间,长期置高电广"1"有效
128 | always@(posedge clk or negedge rst) begin
129 | if(!rst) //复位
130 | message_sent_enable_en <= 0 ;
131 | else if(message_sent_done_flag==1) //若结束一组发逿
132 | message_sent_enable_en <= 0 ; //可发送使能拉低,不再发鿁,且一直维持低电平
133 | else if(message_sent_enable_r==1) //若得到一次发送使胿
134 | message_sent_enable_en <= 1 ; //可发送的信号拉高,开始发送,且维持高电平
135 | end
136 |
137 |
138 | always@(posedge clk or negedge rst)
139 | begin
140 | if(!rst)
141 | begin
142 | tx_enable <= 1'b0;
143 | AT <= 32'h0a_0d_54_41;
144 | COLP <= 88'h0a_0d_31_3d_50_4c_4f_43_2b_54_41;//换行、回车㿁AT+COLP=1的忒序,11
145 | tx_data <= 8'b0;
146 | ATE1<=48'h0a_0d_31_45_54_41;
147 | ATH<=40'h0a_0d_48_54_41;
148 | num <= 0;
149 | ATD <= 0 ;
150 | end
151 | else if(tx_done)
152 | begin
153 | tx_enable <= 1'b0;
154 | end
155 |
156 | else if(cnt_T1s == T1s && num <= 6'd60 && message_sent_enable_en==1) //每次发鿁完丿个字符的ASCII码(在时间上),执行丿次下列内宿
157 | begin
158 | if((num <= 3) && (cnt_T5s <= 400) )//AT 发鿁A T 回车 换行 => 4*4*8=128,要发鿿128位二进制数,cnt_T5s计到400卿128的发送一条指令时闿+272的时延(等待返回丿个OK_
159 | begin
160 | tx_enable <= 1'b1;
161 | tx_data <= AT;
162 | AT <= AT >> 8;
163 | num <= num + 1'b1;
164 | ATD <= {24'h0a0d3b,phone_number_buf,24'h445441};
165 | end
166 | //设置号码显示_6个字笿
167 | else if( 4 <= num && num <= 9 && 401 <= cnt_T5s && cnt_T5s <= 700 )//CMGF 6*4*8=192,400+352+148=900 ,故本条指令延时亿148(这个数随意定)
168 | begin
169 | tx_enable <= 1'b1;
170 | tx_data <= ATE1;
171 | ATE1 <= ATE1 >> 8;
172 | num <= num + 1'b1;
173 | end
174 |
175 | //拨打号码_ 17个字笿
176 | else if( 10 <= num && num <= 26 && 701 <= cnt_T5s && cnt_T5s <= 1400 )
177 | begin
178 | tx_enable <= 1'b1;
179 | tx_data <= ATD;
180 | ATD <= ATD >> 8;
181 | num <= num + 1'b1;
182 | end
183 |
184 | //电话显示 发鿁AT+COLP=1 11个字笿
185 | else if( 27 <= num && num <= 37 && 1401 <= cnt_T5s && cnt_T5s <= 1900)
186 | ///&& 901 <= cnt_T5s && cnt_T5s <= 1400 )//COLP
187 | begin
188 | tx_enable <= 1'b1;
189 | tx_data <= COLP;
190 | COLP <= COLP >> 8;
191 | num <= num + 1'b1;
192 | end
193 | else if(38 <= num && num <= 39 )begin
194 | num <= num+1'b1 ;
195 | end
196 | else if(40 <= num && num <= 41 )begin
197 | tx_enable <= 1'b0;
198 | num <= 0 ;
199 | end
200 | else
201 | begin
202 | tx_enable <= 1'b0;
203 | tx_data <= tx_data;
204 | num <= num;
205 | AT <= 32'h0a_0d_54_41;
206 | COLP <= 88'h0a_0d_31_3d_50_4c_4f_43_2b_54_41;//换行、回车㿁AT+COLP=1的忒序,11
207 | ATE1<=48'h0a_0d_31_45_54_41;
208 | ATH<=40'h0a_0d_48_54_41;
209 | end
210 | end
211 | end
212 |
213 | always@(posedge clk or negedge rst)
214 | if(!rst)
215 | message_sent_done_flag <= 0 ;
216 | else if(1908 <= cnt_T5s && cnt_T5s <= 1999)
217 | message_sent_done_flag <= 0 ;
218 | else if(1905 <= cnt_T5s && cnt_T5s <= 1906) //注意咿223之后还有丿小段时间间隔
219 | message_sent_done_flag <= 1 ;
220 | else
221 | message_sent_done_flag <= message_sent_done_flag ;
222 |
223 | endmodule
224 |
--------------------------------------------------------------------------------
/hongwai_rx.v:
--------------------------------------------------------------------------------
1 | module hongwai_rx(
2 | input clk,
3 | input rst_n,
4 | input [7:0] data_rx,
5 | input rx_int,//当uart_rx模块接收完对方的数据后,传给uart_tx,此为标志位,标志uart_tx要开始工作
6 |
7 | output reg [1:0] flag_tu_ao//10凸起 01凹陷
8 | );
9 |
10 |
11 | //-------------------------------------------------------
12 | //每个8位数据接收完整的标志
13 | reg [1:0] rx_int_r;
14 | always@(posedge clk or negedge rst_n)begin
15 | if(!rst_n) begin
16 | rx_int_r[0] <= 1'b0;
17 | rx_int_r[1] <= 1'b0;
18 | end
19 | else begin
20 | rx_int_r[0] <= rx_int;
21 | rx_int_r[1] <= rx_int_r[0];
22 | end
23 | end
24 |
25 | wire nege_edge = rx_int_r[1] & ~rx_int_r[0];//下降沿
26 |
27 |
28 | //---------------------------------------------------
29 | reg [7:0] data_rx_r;//用来接收传过来的data_rx
30 | //将rx接来的数据存下来
31 | always@(posedge clk or negedge rst_n)begin
32 | if(!rst_n) begin
33 | data_rx_r <= 8'd0;
34 | end
35 | else if(nege_edge)begin
36 | data_rx_r <= data_rx;
37 | end
38 | end
39 |
40 | ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
41 | // //
42 | // 检测分段距离 //
43 | // //
44 | ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
45 |
46 | parameter length = 4; //更方便地更改状态长度
47 |
48 | parameter [length-1 : 0] //one-hot code
49 | S_IDLE = 11'b0001,
50 | S_State1 = 11'b0010,
51 | S_State2 = 11'b0100,
52 | S_State3 = 11'b1000;
53 |
54 | reg [length-1 : 0] c_state;
55 | reg [length-1 : 0] n_state;
56 | //三段式状态机
57 | always @(posedge clk or negedge rst_n) begin
58 | if (!rst_n) begin
59 | c_state <= S_IDLE; // reset低电平复位
60 | end
61 | else begin
62 | c_state <= n_state; //next state logic
63 | end
64 | end
65 |
66 | always @(*) begin //state register
67 | case(c_state)
68 | S_IDLE :
69 | if (data_rx_r == 8'h41 && nege_edge)//A
70 | n_state = S_State1;
71 | else
72 | n_state = S_IDLE;
73 | S_State1 :
74 | if (data_rx_r == 8'h42 && nege_edge)//B
75 | n_state = S_State2;
76 | else
77 | n_state = S_State1;
78 | S_State2 :
79 | if (data_rx_r == 8'h43 && nege_edge)//C
80 | n_state = S_State3;
81 | else
82 | n_state = S_State2;
83 | S_State3 :
84 | if (data_rx_r && nege_edge)
85 | n_state = S_IDLE;
86 | else
87 | n_state = S_IDLE;
88 | default :
89 | n_state = S_IDLE;
90 | endcase
91 | end
92 |
93 |
94 | reg detected_o;
95 | //状态机输出output logic
96 | always @ (posedge clk or negedge rst_n) begin
97 | if(!rst_n) begin
98 | detected_o <= 1'b0;
99 | end
100 | else if( c_state == S_State3) begin
101 | detected_o <= 1'b1;
102 | end
103 | else begin
104 | detected_o <= 1'b0;
105 | end
106 | end
107 |
108 |
109 | ///检测到上升沿信号后持续输出高电平
110 | reg [5:0] num; //包传到哪个数据了
111 | reg start_reg;
112 | reg timeout;
113 | always@(posedge clk)
114 | start_reg <= detected_o;
115 |
116 | always@(posedge clk or negedge rst_n) begin
117 | if (!rst_n)
118 | timeout <= 0;
119 | else if(start_reg == 0 && detected_o ==1)//检测上升沿的
120 | timeout <= 1;
121 | else
122 | timeout <= timeout;
123 | end
124 |
125 |
126 |
127 | reg [7:0] data_pickup_r;//用来提取接收传过来的data_rx
128 | //将rx接来的数据存下来
129 | always@(posedge clk or negedge rst_n)begin
130 | if(!rst_n) begin
131 | data_pickup_r <= 8'd0;
132 | end
133 | else if(timeout) begin
134 | data_pickup_r <= data_rx_r; //此时已经是传完$GPRMC,后面传的均为数据
135 | end
136 | end
137 |
138 |
139 | //-------------------------------------------------------
140 | //判断包头,确定开始,以及识别号
141 | always@(posedge clk or negedge rst_n)
142 | begin
143 | if(!rst_n)
144 | num <= 4'd0;
145 | else if(num == 4)
146 | num <= 0;
147 | else if( start_reg == 0 && detected_o ==1 )
148 | num <= 0;
149 | else if( (timeout && nege_edge) || (timeout && start_reg))
150 | num <= num + 1'b1;
151 | else
152 | num <= num;
153 | end
154 |
155 |
156 | reg [23:0] hongwai_distance;
157 |
158 | always@(posedge clk or negedge rst_n)begin
159 | if(!rst_n)
160 | hongwai_distance <= 24'b0000_0000_0000_0000_1111_1111;
161 | else if(nege_edge && data_pickup_r >= 8'h30 && data_pickup_r <= 8'h39)begin
162 | case(num)
163 | 4'd1: hongwai_distance[23:16] <= data_pickup_r;
164 | 4'd2: hongwai_distance[15:8] <= data_pickup_r;
165 | 4'd3: hongwai_distance[7:0] <= data_pickup_r;
166 | default:;
167 | endcase
168 | end
169 | end
170 |
171 |
172 | reg [5:0] cnt;
173 | //打50拍
174 | always@(posedge clk or negedge rst_n)
175 | begin
176 | if(!rst_n)
177 | cnt <= 6'b0;
178 | else if(num == 1)
179 | cnt <= 6'b0;
180 | else if(cnt == 51)
181 | cnt <= cnt;
182 | else if(num == 3)
183 | cnt <= cnt + 1;
184 | else
185 | cnt <= 6'b0;
186 | end
187 |
188 | wire flag_distance;
189 | //取红外距离值使能
190 | assign flag_distance = (cnt == 50)?1:0;
191 |
192 | reg [8:0] distance;
193 |
194 | always@(posedge clk or negedge rst_n)begin
195 | if(!rst_n)
196 | distance <= 9'b0;
197 | // else if(nege_edge &&(num == 1 || num == 2 || num == 3)) //距离为3位十进制
198 | else if(num == 4)
199 | distance <= hongwai_distance[19:16]*100 + hongwai_distance[11:8]*10 + hongwai_distance[3:0];
200 | else
201 | distance <= distance;
202 | end
203 |
204 |
205 |
206 |
207 |
208 | reg [8:0] distance_1;
209 |
210 | always@(posedge clk)
211 | distance_1 <= distance;
212 |
213 |
214 | wire a;
215 |
216 | assign a = (distance_1 <= 70 && distance_1 >= 60)?1:0;
217 |
218 |
219 | reg a0;
220 | reg a1;
221 | reg a2;
222 | reg a3;
223 | reg a4;
224 | reg a5;
225 | reg a6;
226 | reg a7;
227 | reg a8;
228 | reg a9;
229 | reg a10;
230 | reg a11;
231 | reg a12;
232 | reg a13;
233 | reg a14;
234 | reg a15;
235 | reg a16;
236 | reg a17;
237 | reg a18;
238 | reg a19;
239 | reg a20;
240 | reg a21;
241 |
242 |
243 |
244 | always @(posedge clk or negedge rst_n)
245 | if(!rst_n)begin
246 | a0 <= 1'b0;
247 | a1 <= 1'b0;
248 | a2 <= 1'b0;
249 | a3 <= 1'b0;
250 | a4 <= 1'b0;
251 | a5 <= 1'b0;
252 | a6 <= 1'b0;
253 | a7 <= 1'b0;
254 | a8 <= 1'b0;
255 | a9 <= 1'b0;
256 | a10 <= 1'b0;
257 | a11 <= 1'b0;
258 | a12 <= 1'b0;
259 | a13 <= 1'b0;
260 | a14 <= 1'b0;
261 | a15 <= 1'b0;
262 | a16 <= 1'b0;
263 | a17 <= 1'b0;
264 | a18 <= 1'b0;
265 | a19 <= 1'b0;
266 | a20 <= 1'b0;
267 | a21 <= 1'b0;
268 |
269 | end
270 | else begin
271 | a0 <= a;
272 | a1 <= a0;
273 | a2 <= a1;
274 | a3 <= a2;
275 | a4 <= a3;
276 | a5 <= a4;
277 | a6 <= a5;
278 | a7 <= a6;
279 | a8 <= a7;
280 | a9 <= a8;
281 | a10 <= a9;
282 | a11 <= a10;
283 | a12 <= a11;
284 | a13 <= a12;
285 | a14 <= a13;
286 | a15 <= a14;
287 | a16 <= a15;
288 | a17 <= a16;
289 | a18 <= a17;
290 | a19 <= a18;
291 | a20 <= a19;
292 | a21 <= a20;
293 | end
294 |
295 | wire b;
296 |
297 | assign b = (distance_1 <= 97 && distance_1 >= 82)?1:0;
298 |
299 |
300 | reg b0;
301 | reg b1;
302 | reg b2;
303 | reg b3;
304 |
305 | always @(posedge clk or negedge rst_n)
306 | if(!rst_n)begin
307 | b0 <= 1'b0;
308 | b1 <= 1'b0;
309 | b2 <= 1'b0;
310 | b3 <= 1'b0;
311 | end
312 | else begin
313 | b0 <= b;
314 | b1 <= b0;
315 | b2 <= b1;
316 | b3 <= b2;
317 | end
318 |
319 | wire aoxian;
320 | assign aoxian = ((a0 && a1 && a2 && a3 && a4 && a5 && a6 && a7 && a8 && a9 && a10 && a11 && a12 && a13 && a14 && a15 && a16 && a17 && a18 && a19 && a20 && a21 )==1)?1:0;
321 |
322 | always@(posedge clk or negedge rst_n)
323 | begin
324 | if(!rst_n)
325 | flag_tu_ao <= 2'b0;
326 | else if((b0 && b1 && b2 && b3) == 1)
327 | flag_tu_ao <= 2'b11;
328 | else if(aoxian == 1)//凹陷 01
329 | flag_tu_ao <= 2'b01;
330 | else
331 | flag_tu_ao <= 2'b0;
332 | end
333 |
334 |
335 |
336 | endmodule
337 |
338 |
--------------------------------------------------------------------------------
/gsm.v:
--------------------------------------------------------------------------------
1 | module gsm(
2 | input clk,rst,
3 | input [183:0] TEXT_buf,
4 | input tx_done,//uart结束使能,该输入只维持一个时钟周期
5 | input mess_phone_number_prepared_enable, //一个段时间的高电平(源自 点击确认键)
6 |
7 | output reg tx_enable,
8 | output reg [7:0] tx_data
9 | );
10 |
11 | wire [183:0] TEXT_buf_r;
12 |
13 |
14 | assign TEXT_buf_r[7:0] = TEXT_buf[183:176];
15 | assign TEXT_buf_r[15:8] = TEXT_buf[175:168];
16 | assign TEXT_buf_r[23:16] = TEXT_buf[167:160];
17 | assign TEXT_buf_r[31:24] = TEXT_buf[159:152];
18 | assign TEXT_buf_r[39:32] = TEXT_buf[151:144];
19 | assign TEXT_buf_r[47:40] = TEXT_buf[143:136];
20 | assign TEXT_buf_r[55:48] = TEXT_buf[135:128];
21 | assign TEXT_buf_r[63:56] = TEXT_buf[127:120];
22 | assign TEXT_buf_r[71:64] = TEXT_buf[119:112];
23 | assign TEXT_buf_r[79:72] = TEXT_buf[111:104];
24 | assign TEXT_buf_r[87:80] = TEXT_buf[103:96];
25 | assign TEXT_buf_r[95:88] = TEXT_buf[95:88];
26 | assign TEXT_buf_r[103:96] = TEXT_buf[87:80];
27 | assign TEXT_buf_r[111:104] = TEXT_buf[79:72];
28 | assign TEXT_buf_r[119:112] = TEXT_buf[71:64];
29 | assign TEXT_buf_r[127:120] = TEXT_buf[63:56];
30 | assign TEXT_buf_r[135:128] = TEXT_buf[55:48];
31 | assign TEXT_buf_r[143:136] = TEXT_buf[47:40];
32 | assign TEXT_buf_r[151:144] = TEXT_buf[39:32];
33 | assign TEXT_buf_r[159:152] = TEXT_buf[31:24];
34 | assign TEXT_buf_r[167:160] = TEXT_buf[23:16];
35 | assign TEXT_buf_r[175:168] = TEXT_buf[15:8];
36 | assign TEXT_buf_r[183:176] = TEXT_buf[7:0];
37 |
38 |
39 |
40 |
41 | reg [383:0] TEXT_buf_1;
42 |
43 | always@(posedge clk or negedge rst)
44 | if(!rst)
45 | TEXT_buf_1 <= 1'b0;
46 | else
47 | TEXT_buf_1 <= { TEXT_buf_r,
48 | 8'h0A,
49 | 8'h21,8'h67,8'h6E,8'h69,8'h6E,8'h72,8'h61,8'h77,
50 | 8'h21,8'h67,8'h6E,8'h69,8'h6E,8'h72,8'h61,8'h77,
51 | 8'h21,8'h67,8'h6E,8'h69,8'h6E,8'h72,8'h61,8'h77};
52 |
53 |
54 | wire [87:0] phone_number_buf=88'h34_38_32_31_37_36_32_38_33_37_31;//程宁勃
55 | reg [31:0] AT;//AT命令寄存器;
56 | reg [119:0] CSCS;//AT+CSCS="GSM",设置为 GSM 编码字符集
57 | reg [87:0] CMGF;//AT+CMGF=1
58 | reg [183:0] CMGS;//AT + CMGS="phone_number"
59 | reg [383:0] TEXT;//message
60 | reg [7:0] jieshu;
61 | reg [6:0] num;
62 |
63 | reg message_sent_enable;
64 | //短信发送使能信号的处理 (延时了一个时钟周期,并且获得了两个系统时钟周期的高电平使能信号)
65 | reg mess_phone_number_prepared_enable_r1 ;
66 | reg mess_phone_number_prepared_enable_r2 ;
67 | reg mess_phone_number_prepared_enable_r3 ;
68 | always@(posedge clk or negedge rst)
69 | if(!rst) begin
70 | mess_phone_number_prepared_enable_r1 <= 0 ;
71 | mess_phone_number_prepared_enable_r2 <= 0 ;
72 | mess_phone_number_prepared_enable_r3 <= 0 ;
73 | end
74 | else begin
75 | mess_phone_number_prepared_enable_r1 <= mess_phone_number_prepared_enable ;
76 | mess_phone_number_prepared_enable_r2 <= mess_phone_number_prepared_enable_r1 ;
77 | mess_phone_number_prepared_enable_r3 <= mess_phone_number_prepared_enable_r2 ;
78 | end
79 | wire mess_phone_number_prepared_enable_r ;
80 | assign mess_phone_number_prepared_enable_r = mess_phone_number_prepared_enable_r2 | mess_phone_number_prepared_enable_r3 ;
81 | always@(posedge clk or negedge rst)
82 | if(!rst)
83 | message_sent_enable <= 0 ;
84 | else
85 | message_sent_enable <= mess_phone_number_prepared_enable_r ;
86 |
87 | reg message_sent_enable_r1;
88 | reg message_sent_enable_r2;
89 | wire message_sent_enable_r;
90 | assign message_sent_enable_r = message_sent_enable_r1 & ~message_sent_enable_r2 ;
91 | always@(posedge clk or negedge rst)
92 | if(!rst) begin
93 | message_sent_enable_r1 <= 0;
94 | message_sent_enable_r2 <= 0;
95 | end
96 | else begin
97 | message_sent_enable_r1 <= mess_phone_number_prepared_enable;
98 | message_sent_enable_r2 <= message_sent_enable_r1 ;
99 | end
100 |
101 | parameter T1s = 27'd90_000;
102 |
103 | reg[26:0]cnt_T1s;
104 | reg[25:0]cnt_T5s;
105 |
106 | always@(posedge clk or negedge rst)
107 | begin
108 | if(!rst) begin
109 | cnt_T1s <= 26'd0;
110 | end
111 | else if(message_sent_enable_r==1'b1) begin
112 | cnt_T1s <= 0 ;
113 | end
114 | else if(cnt_T1s == T1s) begin //每完成一次计数,就是结束了一组8bit的ASCII码的发送
115 | cnt_T1s <= 26'd0;
116 | end
117 | else begin
118 | cnt_T1s <= cnt_T1s + 1'b1;
119 | end
120 | end
121 |
122 | always@(posedge clk or negedge rst)
123 | begin
124 | if(!rst) begin
125 | cnt_T5s <= 26'd0;
126 | end
127 | else if(message_sent_enable_r==1'b1) begin
128 | cnt_T5s <= 0 ;
129 | end
130 | else if(cnt_T1s == T1s) begin
131 | cnt_T5s <= cnt_T5s + 1'b1;
132 | end
133 | else begin
134 | cnt_T5s <= cnt_T5s;
135 | end
136 | end
137 |
138 | reg message_sent_done_flag ; //来自下一个发送模块,发送完成一组指令的使能信号。高"1"有效,维持一小段时钟周期
139 | reg message_sent_enable_en ; //真正启动发送的使能信号。可以发送的期间,长期置高电平"1"有效
140 | always@(posedge clk or negedge rst)
141 | begin
142 | if(!rst) //复位
143 | message_sent_enable_en <= 0 ;
144 | else if(message_sent_done_flag==1'b1) //若结束一组发送
145 | message_sent_enable_en <= 0 ; //可发送使能拉低,不再发送,且一直维持低电平
146 | else if(message_sent_enable_r==1'b1) //若得到一次发送使能
147 | message_sent_enable_en <= 1 ; //可发送的信号拉高,开始发送,且维持高电平
148 | end
149 |
150 |
151 | always@(posedge clk or negedge rst)
152 | begin
153 | if(!rst) begin
154 | tx_enable <= 1'b0;
155 | AT <= 32'h0a_0d_54_41;
156 | tx_data <= 8'b0;
157 | CSCS <= 120'h0a_0d_22_4d_53_47_22_3d_53_43_53_43_2b_54_41;//换行、回车、AT+CSCS="GSM"的倒序,15
158 | CMGF <= 88'h0a_0d_31_3d_46_47_4d_43_2b_54_41;//换行、回车、AT+CMGF=1的倒序,11
159 | jieshu <= 8'h1A;
160 | TEXT <= 0;
161 | num <= 0;
162 | CMGS <= 0 ;
163 | end
164 | else if(tx_done) begin
165 | tx_enable <= 1'b0;
166 | end
167 | else if(cnt_T1s == T1s && num <= 10'd110 && message_sent_enable_en==1) begin //每次发送完一个字符的ASCII码(在时间上),执行一次下列内容
168 |
169 | if((num <= 2'd3) && (cnt_T5s <= 9'd400) ) begin //AT 发送A T 回车 换行 => 4*4*8=128,要发送128位二进制数,cnt_T5s计到400即128的发送一条指令时间+272的时延(等待返回一个OK)
170 | tx_enable <= 1'b1;
171 | tx_data <= AT;
172 | AT <= AT >> 4'd8;
173 | num <= num + 1'b1; //这个num还真不能拿到这个always块的外边去做累加,因为他和每次发送一组指令后的等待有关,发送一个数num加一次一,但是发完一组指令需要等待,此时cnt_5s累加,但是num不用累加
174 | TEXT <= TEXT_buf_1 ;
175 | CMGS <= {24'h0a0d22,phone_number_buf,72'h223d53474d432b5441};
176 | end
177 | //ATTENTION PLEASE!!! num记到3之后到cnt_T5s之间的这一段时间是空的,因为下一条只有在cnt_T5s记到401时才会开始发送对应指令
178 | //发送AT+CSCS="GSM"回车换行,15个字符
179 | else if( 3'd4 <= num && num <= 5'd18 && 9'd401 <= cnt_T5s && cnt_T5s <= 10'd900 )//CMGF 11*4*8=352,400+352+148=900 ,故本条指令延时了148(这个数随意定)
180 | begin
181 | tx_enable <= 1'b1;
182 | tx_data <= CSCS;
183 | CSCS <= CSCS >> 4'd8;
184 | num <= num + 1'b1;
185 | end
186 | //发送AT+CMGF=1, 11个字符
187 | else if( 5'd19 <= num && num <= 5'd29 && 10'd901 <= cnt_T5s && cnt_T5s <= 11'd1400 )//CSMP
188 | begin
189 | tx_enable <= 1'b1;
190 | tx_data <= CMGF;
191 | CMGF <= CMGF >> 8;
192 | num <= num + 1'b1;
193 | end
194 | //发送CMGS="",23字符
195 | else if( 30 <= num && num <= 52 && 1401 <= cnt_T5s && cnt_T5s <= 2500 )//CSCS
196 | begin
197 | tx_enable <= 1'b1;
198 | tx_data <= CMGS;
199 | CMGS <= CMGS >> 4'd8;
200 | num <= num + 1'b1;
201 | end
202 | //发短信,48,字符
203 | else if( 53 <= num && num <= 100 && 2501 <= cnt_T5s && cnt_T5s <= 4200)//CMGS//1700s
204 | begin
205 | tx_enable <= 1'b1;
206 | tx_data <= TEXT;
207 | TEXT <= TEXT >> 8;
208 | num <= num + 1'b1;
209 | end
210 | //发1A
211 | else if( num >= 101 && num <= 102 && 4201 <= cnt_T5s && cnt_T5s <= 4300)//CMGS
212 | begin
213 | tx_enable <= 1'b1;
214 | tx_data <= jieshu;
215 | jieshu <= jieshu >> 8;
216 | num <= num + 1'b1;
217 | end
218 | else if(103 <= num && num <= 104 && 4301 <= cnt_T5s && cnt_T5s <= 4305) begin
219 | num <= num+1 ;
220 | end
221 | else if(105 <= num && num <= 106 && 4306 <= cnt_T5s && cnt_T5s <= 4308) begin
222 |
223 | tx_enable <= 1'b0;
224 | num <= num + 1'b1 ;
225 | // num <= 0;
226 | end
227 | else if(4309 <= cnt_T5s && cnt_T5s <= 4310)
228 | num <= 0 ;
229 | else
230 | begin
231 | tx_enable <= 1'b0;
232 | tx_data <= tx_data;
233 | num <= num;
234 | CSCS <= 120'h0a_0d_22_4d_53_47_22_3d_53_43_53_43_2b_54_41;//换行、回车、AT+CSCS="GSM"的倒序,15
235 | CMGF <= 88'h0a_0d_31_3d_46_47_4d_43_2b_54_41;//换行、回车、AT+CMGF=1的倒序,11
236 | AT <= 32'h0a_0d_54_41;
237 | jieshu <= 8'h1A;
238 | CMGS <= {24'h0a0d22,phone_number_buf,72'h223d53474d432b5441};
239 | end
240 | end
241 | end
242 |
243 | always@(posedge clk or negedge rst)
244 | if(!rst)
245 | message_sent_done_flag <= 0 ;
246 | else if(4313 <= cnt_T5s && cnt_T5s <= 4314)
247 | message_sent_done_flag <= 0 ;
248 | else if(4311 <= cnt_T5s && cnt_T5s <= 4312) //注意和223之后还有一小段时间间隔
249 | message_sent_done_flag <= 1 ;
250 | else
251 | message_sent_done_flag <= message_sent_done_flag ;
252 |
253 | endmodule
254 |
--------------------------------------------------------------------------------
/VGA_square.v:
--------------------------------------------------------------------------------
1 | `timescale 1ns / 1ps
2 | //////////////////////////////////////////////////////////////////////////////////
3 | // Company:
4 | // Engineer:
5 | //
6 | // Create Date: 22:35:16 11/02/2019
7 | // Design Name:
8 | // Module Name: VGA_square
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 VGA_square(
22 |
23 | input clk,
24 | input rst_n,
25 | input [7:0] M_pic,
26 |
27 | output flag_addr,//表示边框xy比例检测成功,VGA可以进行显示
28 | output reg [6:0] cnt_x,
29 | output reg [7:0] cnt_y,//127超值
30 | output reg [15:0] rom_addr13,
31 | output reg [15:0] flag_square_begin,
32 | output reg [15:0] flag_square_end
33 | );
34 |
35 | wire [7:0] r1;
36 | wire [7:0] g1;
37 | wire [7:0] b1;
38 | wire red0;
39 | wire green0;
40 | wire blue0;
41 | wire black;
42 | wire black_x;
43 |
44 |
45 | reg clear;
46 | reg [15:0] black_reg0;
47 | reg [15:0] black_reg1;
48 | reg [15:0] black_reg2;
49 | reg [6:0] N;
50 | reg [15:0] rom_addr13_1;
51 | reg [15:0] rom_addr13_2;
52 | reg [2:0] B;
53 | reg [2:0] BiLi;
54 |
55 |
56 | assign r1 = {M_pic[7:5],M_pic[7:5],M_pic[7:6]};
57 | assign g1 = {M_pic[4:2],M_pic[4:2],M_pic[4:3]};
58 | assign b1 = {M_pic[1:0],M_pic[1:0],M_pic[1:0],M_pic[1:0]};
59 |
60 | assign red0 = ((r1 <= 8'd36 && r1 <= 8'd73) || r1 == 8'd0 || r1 == 8'd109) ? 1'b1 : 1'b0;
61 | assign green0 = ((g1 >= 8'd36 && g1 <= 8'd73) || g1 == 8'd0 || g1 == 8'd146) ? 1'b1 : 1'b0;//
62 | assign blue0 = ((b1 >= 8'd80 && b1 <= 8'd85) || b1 == 8'd0) ? 1'b1 : 1'b0;
63 | assign black = (red0 & green0 & blue0)? 1'b1 : 1'b0;//近似黑色提取
64 |
65 | wire [15:0] a;
66 | assign a = (cnt_x > 30)?black_reg0:0;
67 |
68 |
69 | //检测横向特征黑
70 | always @ (posedge clk or negedge rst_n)begin
71 | if(!rst_n)
72 | black_reg0 <= 16'd0;
73 | else if(black && (cnt_x == 6'd1))
74 | black_reg0 <= rom_addr13_1 - 3'd3 + 3'd4;//加4:为了cnt_y检测保持黑色black像素点
75 | else
76 | black_reg0 <= black_reg0;
77 | end
78 |
79 |
80 | always @ (posedge clk or negedge rst_n)begin
81 | if(!rst_n)begin
82 | black_reg1 <= 16'd0;
83 | black_reg2 <= 16'd0;
84 | end
85 | else if(black)begin
86 | black_reg1 <= rom_addr13_1;
87 | black_reg2 <= black_reg1;
88 | end
89 | else begin
90 | black_reg1 <= 16'd0;
91 | black_reg2 <= 16'd0;
92 | end
93 | end
94 |
95 |
96 | //判断两个 特征黑 地址是否相邻
97 | assign black_x =(black_reg1 - black_reg2 == 1)?1'b1:1'b0;
98 |
99 |
100 | reg [6:0] j0;
101 | reg [6:0] j1;
102 | wire [6:0] h;
103 |
104 | assign h = (j0 - j1 == 1'b0)?j0:1'b0;
105 |
106 |
107 | always @(posedge clk or negedge rst_n)begin
108 | if(!rst_n)begin
109 | j0 <= 7'd0;
110 | j1 <= 7'd0;
111 | end
112 | else if(cnt_x > 0)begin
113 | j0 <= cnt_x;
114 | j1 <= j0;
115 | end
116 | else begin
117 | j0 <= 7'd0;
118 | j1 <= 7'd0;
119 | end
120 | end
121 |
122 | //记黑色边框的宽
123 | always @(posedge clk or negedge rst_n)begin
124 | if(!rst_n)
125 | cnt_x <= 7'd0;
126 | else if(clear)
127 | cnt_x <= 7'd0;
128 | else if( cnt_x > (h-1'b1) )///////////22特殊值,即cnt_x计数特征黑的一行像素点数
129 | cnt_x <= cnt_x;
130 | else if(black_x == 1'b1)
131 | cnt_x <= cnt_x + 1'b1;
132 | else
133 | cnt_x <= cnt_x;
134 | end
135 |
136 |
137 | //特征黑色小于cnt_x <= 30不进行运算
138 | always @(posedge clk or negedge rst_n)begin
139 | if(!rst_n)
140 | clear <= 1'b0;
141 | else if((cnt_x <= 30 && cnt_x > 0 && !black_x) || (cnt_x >= 80 && !black_x))
142 | clear <= 1'b1;
143 | else
144 | clear <= 1'b0;
145 | end
146 |
147 |
148 |
149 |
150 | always @(posedge clk or negedge rst_n)begin
151 | if(!rst_n)
152 | rom_addr13_1 <= 16'd0;
153 | else if(rom_addr13 >= 16'd32800)
154 | rom_addr13_1 <= 16'd0;
155 | else if(cnt_x > (h-1'b1))
156 | rom_addr13_1 <= rom_addr13_1;
157 | else if(cnt_y == 8'd0)
158 | rom_addr13_1 <= rom_addr13_1 + 1'b1;
159 | else
160 | rom_addr13_1 <= rom_addr13_1;
161 | end
162 |
163 |
164 | wire [15:0] c;
165 |
166 | assign c = rom_addr13 - cnt_x - 3'd5 + 3'd4;
167 |
168 |
169 | always @(posedge clk or negedge rst_n)begin
170 | if(!rst_n)begin
171 | cnt_y <= 8'd0;
172 | N <= 7'd0;
173 | rom_addr13_2 <= 16'd0;
174 | end
175 | else begin
176 | rom_addr13 <= rom_addr13_1 + rom_addr13_2 + 1'b1;
177 |
178 | if(!black_x && cnt_x >= 7'd6)
179 | begin
180 |
181 | case (c)
182 |
183 | black_reg0 + N*200: begin
184 | rom_addr13 <= rom_addr13 - (h+5);
185 |
186 | if(black)begin
187 | cnt_y <= cnt_y + 1'b1;
188 | rom_addr13_2 <= rom_addr13_2 + 200;
189 | N <= N + 1'b1;
190 | end
191 | else begin
192 | N <= 7'd0;
193 | cnt_y <= cnt_y;
194 | end
195 | end
196 |
197 | black_reg0 + N*200: if(black)begin
198 | cnt_y <= cnt_y + 1'b1;
199 | rom_addr13_2 <= rom_addr13_2 + 200;
200 | N <= N + 1'b1;
201 | end
202 | else begin
203 | N <= 7'd0;
204 | cnt_y <= cnt_y;
205 | end
206 |
207 | black_reg0 + N*200: if(black)begin
208 | cnt_y <= cnt_y + 1'b1;
209 | rom_addr13_2 <= rom_addr13_2 + 200;
210 | N <= N + 1'b1;
211 | end
212 | else begin
213 | N <= 7'd0;
214 | cnt_y <= cnt_y;
215 | rom_addr13_2 <= rom_addr13_2;
216 | end
217 | endcase
218 | end
219 | end
220 | end
221 |
222 |
223 | reg clk_4;
224 | reg [2:0] cnt_clk_4;
225 | //同上
226 | always @(posedge clk or negedge rst_n)begin
227 | if(!rst_n)
228 | cnt_clk_4 <= 3'd0;
229 | else if(cnt_clk_4 == 3'd5)
230 | cnt_clk_4 <= 3'd0;
231 | else
232 | cnt_clk_4 <= cnt_clk_4 + 1'b1;
233 | end
234 | //同上
235 | always @(posedge clk or negedge rst_n)begin
236 | if(!rst_n)
237 | clk_4 <= 1'b0;
238 | else if(cnt_clk_4 == 3'd5)
239 | clk_4 <= 3'd0;
240 | else if(cnt_clk_4 == 3'd3)
241 | clk_4 <= ~clk_4;
242 | else
243 | clk_4 <= clk_4;
244 | end
245 |
246 | reg [6:0] i_0;
247 | reg [6:0] i_1;
248 |
249 | //使比例在cnt_y稳定时进行计算
250 | always @(posedge clk or negedge rst_n)
251 | if(!rst_n)begin
252 | i_0 <= 7'd0;
253 | i_1 <= 7'd0;
254 | end
255 | else if(cnt_y)begin
256 | i_0 <= cnt_y;
257 | i_1 <= i_0;
258 | end
259 | else begin
260 | i_0 <= 7'd0;
261 | i_1 <= 7'd0;
262 | end
263 |
264 |
265 | reg flag_cnt_y;
266 | //同上
267 | always @(posedge clk_4 or negedge rst_n)begin
268 | if(!rst_n)
269 | flag_cnt_y <= 1'b0;
270 | else if(i_0 - i_1 == 1'b0 && cnt_y > 1'b0)
271 | flag_cnt_y <= 1'b1;
272 | else
273 | flag_cnt_y <= 1'b0;
274 | end
275 |
276 |
277 |
278 | //确定长宽比
279 | always @(posedge clk or negedge rst_n)begin
280 | if(!rst_n)
281 | B <= 3'd0;
282 | else begin
283 | if(flag_cnt_y)
284 | begin
285 | if((cnt_y < 6*cnt_x)&& (cnt_y > 5*cnt_x))
286 | B <= 3'd4;
287 | else if((cnt_y < 5*cnt_x)&& (cnt_y > 4*cnt_x))
288 | B <= 3'd3;
289 | else if((cnt_y < 4*cnt_x)&& (cnt_y > 2*cnt_x))
290 | B <= 3'd2;
291 | else if((cnt_y < 2*cnt_x)&& (cnt_y > 1*cnt_x))
292 | B <= 3'd1;
293 | end
294 | end
295 |
296 | end
297 |
298 | //产生比例值,判断是否为特定框
299 | always @(posedge clk or negedge rst_n)begin
300 | if(!rst_n)
301 | BiLi <= 3'd0;
302 | else if(clear)
303 | BiLi <= 3'd0;
304 | else begin
305 | case (B)
306 | 1: BiLi <= 3'd1;
307 | 2: BiLi <= 3'd2;
308 | 3: BiLi <= 3'd3;
309 | 4: BiLi <= 3'd4;
310 | default: BiLi <= 3'd0;
311 | endcase
312 | end
313 | end
314 |
315 | reg clr;
316 |
317 | //检测到第一个非红绿灯比例的黑色特征框,清零所有寄存器的值
318 | always @(posedge clk or negedge rst_n)begin
319 | if(!rst_n)
320 | clr <= 1'b0;
321 | else if(BiLi > 3'd2 | BiLi == 3'd1)
322 | clr <= 1'b1;
323 | else
324 | clr <= 1'b0;
325 | end
326 |
327 |
328 | reg [6:0] d0;
329 | reg [6:0] d1;
330 | reg VGA_clk;
331 |
332 | //为了保持cnt_y稳定时的值
333 | always @(posedge clk or negedge rst_n)begin
334 | if(!rst_n)
335 | VGA_clk <= 1'b0;
336 | else
337 | VGA_clk <= ~VGA_clk;
338 | end
339 |
340 | //同上
341 | always @(posedge VGA_clk or negedge rst_n)
342 | if(!rst_n)begin
343 | d0 <= 7'd0;
344 | d1 <= 7'd0;
345 | end
346 | else begin
347 | d0 <= cnt_y;
348 | d1 <= d0;
349 | end
350 |
351 | //cnt_y稳定不变的信号
352 | assign flag_addr = ((d0 - d1)== 1'b0 && cnt_y > 1'b0)?1'b1:1'b0;
353 |
354 |
355 | //VGA显示边框的始末
356 | always @(posedge clk or negedge rst_n)
357 | if(!rst_n)begin
358 | flag_square_begin <= 16'd0;
359 | flag_square_end <= 16'd0;
360 | end
361 | else if(BiLi == 3'd2)begin
362 | flag_square_begin <= black_reg0;
363 | if(flag_addr)
364 | flag_square_end <= black_reg0 + cnt_x + cnt_y * 200;
365 | end
366 | else begin
367 | flag_square_begin <= 16'd0;
368 | flag_square_end <= 16'd0;
369 | end
370 |
371 |
372 |
373 | endmodule
374 |
--------------------------------------------------------------------------------
/gps_rx.v:
--------------------------------------------------------------------------------
1 | module gps_rx(
2 | input clk,
3 | input rst_n,
4 | input [7:0] data_rx,
5 | input rx_int,//当uart_rx模块接收完对方的数据后,传给uart_tx,此为标志位,标志uart_tx要开始工作
6 | output reg [183:0] data_rx_end,
7 | output [47:0] ymr_out,
8 | output reg [71:0] time_out
9 | );
10 |
11 | //-------------------------------------------------------
12 | //每个8位数据接收完整的标志
13 | reg [1:0] rx_int_r;
14 | always@(posedge clk or negedge rst_n)begin
15 | if(!rst_n) begin
16 | rx_int_r[0] <= 1'b0;
17 | rx_int_r[1] <= 1'b0;
18 | end
19 | else begin
20 | rx_int_r[0] <= rx_int;
21 | rx_int_r[1] <= rx_int_r[0];
22 | end
23 | end
24 |
25 | wire nege_edge = rx_int_r[1] & ~rx_int_r[0];//下降沿
26 |
27 |
28 | //---------------------------------------------------
29 | reg [7:0] data_rx_r;//用来接收传过来的data_rx
30 | //将rx接来的数据存下来
31 | always@(posedge clk or negedge rst_n)begin
32 | if(!rst_n) begin
33 | data_rx_r <= 8'd0;
34 | end
35 | else if(nege_edge)begin
36 | data_rx_r <= data_rx;
37 | end
38 | end
39 |
40 | reg detected_o;
41 | parameter length = 7; //更方便地更改状态长度
42 |
43 | parameter [length-1 : 0] //one-hot code
44 | S_IDLE = 7'b0000001,
45 | S_State1 = 7'b0000010,
46 | S_State2 = 7'b0000100,
47 | S_State3 = 7'b0001000,
48 | S_State4 = 7'b0010000,
49 | S_State5 = 7'b0100000,
50 | S_State6 = 7'b1000000;
51 |
52 | reg [length-1 : 0] c_state;
53 | reg [length-1 : 0] n_state;
54 | //三段式状态机
55 | always @(posedge clk or negedge rst_n) begin
56 | if (!rst_n) begin
57 | c_state <= S_IDLE; // reset低电平复位
58 | end
59 | else begin
60 | c_state <= n_state; //next state logic
61 | end
62 | end
63 |
64 | always @(*) begin //state register
65 | case(c_state)
66 | S_IDLE :
67 | if (data_rx_r == 8'h24 && nege_edge)//$
68 | n_state = S_State1;
69 | else
70 | n_state = S_IDLE;
71 | S_State1 :
72 | if (data_rx_r == 8'h47 && nege_edge)//G
73 | n_state = S_State2;
74 | else
75 | n_state = S_State1;
76 | S_State2 :
77 | if (data_rx_r == 8'h50 && nege_edge)//P
78 | n_state = S_State3;
79 | else
80 | n_state = S_State2;
81 | S_State3 :
82 | if (data_rx_r == 8'h52 && nege_edge)//R
83 | n_state = S_State4;
84 | else
85 | n_state = S_State3;
86 | S_State4 :
87 | if (data_rx_r == 8'h4D && nege_edge)//M
88 | n_state = S_State5;
89 | else
90 | n_state = S_State4;
91 | S_State5 :
92 | if (data_rx_r == 8'h43 && nege_edge)//C
93 | n_state = S_State6;
94 | else
95 | n_state = S_State5;
96 | S_State6 :
97 | if (data_rx_r && nege_edge)
98 | n_state = S_IDLE;
99 | else
100 | n_state = S_IDLE;
101 | default :
102 | n_state = S_IDLE;
103 | endcase
104 | end
105 | //4,$GPRMC(推荐定位信息,Recommended Minimum Specific GPS/Transit Data) $GPRMC语句的基本格式如下: $GPRMC,(1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12)*hh(CR)(LF) (1) UTC时间,hhmmss(时分秒) (2) 定位状态,A=有效定位,V=无效定位 (3) 纬度ddmm.mmmmm(度分) (4) 纬度半球N(北半球)或S(南半球) (5) 经度dddmm.mmmmm(度分) (6) 经度半球E(东经)或W(西经) (7) 地面速率(000.0~999.9节) (8) 地面航向(000.0~359.9度,以真北方为参考基准) (9) UTC日期,ddmmyy(日月年) (10)磁偏角(000.0~180.0度,前导位数不足则补0) (11) 磁偏角方向,E(东)或W(西) (12) 模式指示(A=自主定位,D=差分,E=估算,N=数据无效) 举例如下: $GPRMC,023543.00,A,2308.28715,N,11322.09875,E,0.195,,240213,,,A*78
106 |
107 |
108 | //状态机输出output logic
109 | always @ (posedge clk or negedge rst_n) begin
110 | if(!rst_n) begin
111 | detected_o <= 1'b0;
112 | end
113 | else if( c_state == S_State6) begin
114 | detected_o <= 1'b1;
115 | end
116 | else begin
117 | detected_o <= 1'b0;
118 | end
119 | end
120 |
121 | ///检测到上升沿信号后持续输出高电平
122 | reg [3:0] num; //包传到哪个数据了
123 | // reg a_flag; //UTC位置标识位
124 | reg start_reg;
125 | reg timeout;
126 | always@(posedge clk)
127 | start_reg <= detected_o;
128 |
129 | reg [3:0] count;
130 | always@(posedge clk or negedge rst_n) begin
131 | if (!rst_n)
132 | timeout <= 0;
133 | else if(start_reg == 0 && detected_o ==1)
134 | timeout <= 1;
135 | else if(count == 4'd10) //count记,的
136 | timeout <= 0;
137 | else
138 | timeout <= timeout;
139 | end
140 | /////
141 |
142 | reg [7:0] data_pickup_r;//用来提取接收传过来的data_rx
143 | //将rx接来的数据存下来
144 | always@(posedge clk or negedge rst_n)begin
145 | if(!rst_n) begin
146 | data_pickup_r <= 8'd0;
147 | end
148 | else if(timeout) begin
149 | data_pickup_r <= data_rx_r; //此时已经是传完$GPRMC,后面传的均为数据
150 | end
151 | end
152 |
153 | // reg [3:0] count;
154 | always@(posedge clk or negedge rst_n) //count加——逗号与逗号之间 num加——各个数据每一个字
155 | begin
156 | if(!rst_n)
157 | count <= 0;
158 | else if(data_pickup_r==8'h2C && nege_edge)
159 | count <= count + 1;
160 | else if(start_reg == 0 && detected_o ==1)
161 | count <= 0;
162 | else
163 | count <= count;
164 | end
165 |
166 | //-------------------------------------------------------
167 | //判断包头,确定开始,以及识别号
168 | always@(posedge clk or negedge rst_n)begin
169 | if(!rst_n) num <= 4'd0;
170 | else if(start_reg == 0 && detected_o ==1) num <= 0;
171 | else if(data_pickup_r==8'h2C&&nege_edge ) num <= 4'd1;
172 | else if(timeout&&nege_edge) num <= num + 1'b1;
173 | else num <= num;
174 | end
175 |
176 |
177 | //-----------------------------------------------------
178 | //根据标识位分类给寄存器赋值
179 | reg [79:0] Latitude ; //纬度
180 | reg [87:0] longitude ; //经度
181 | reg [71:0] UTC_time ; //UTC时间
182 | reg [47:0] ddmmyy;
183 | reg [7:0] E_flag;
184 | reg [7:0] N_flag;
185 | always@(posedge clk or negedge rst_n)begin
186 | if(!rst_n) begin
187 | Latitude <= 0;
188 | longitude <= 0;
189 | UTC_time <= 0;
190 | ddmmyy <= 0;
191 | E_flag <= 0;
192 | N_flag <= 0;
193 | end //$GPRMC,023543.00,A,2308.28715,N,11322.09875,E,0.195,,240213,,,A*78
194 | else if(count == 4'd1&&nege_edge&& data_pickup_r!=8'h2C )begin //时间
195 | case(num)
196 | 4'd1: UTC_time[71:64] <= data_pickup_r; // 134104.00 13点41分04秒[3133343130342e3030]
197 | 4'd2: UTC_time[63:56] <= data_pickup_r;
198 | 4'd3: UTC_time[55:48] <= data_pickup_r;
199 | 4'd4: UTC_time[47:40] <= data_pickup_r;
200 | 4'd5: UTC_time[39:32] <= data_pickup_r;
201 | 4'd6: UTC_time[31:24] <= data_pickup_r;
202 | 4'd7: UTC_time[23:16] <= data_pickup_r; //小数点
203 | 4'd8: UTC_time[15:8] <= data_pickup_r;
204 | 4'd9: UTC_time[7:0] <= data_pickup_r;
205 | default:;
206 | endcase
207 | end
208 | else if(count == 4'd3&&nege_edge&& data_pickup_r!=8'h2C)begin //维度
209 | case(num)
210 | 4'd1: Latitude[79:72] <= data_pickup_r;// 3 3409.22851 [33342e30393232383531] 9.22851/60 34.1538085
211 | 4'd2: Latitude[71:64] <= data_pickup_r;// 4
212 | 4'd5: Latitude[63:56] <= data_pickup_r;//.
213 | 4'd3: Latitude[55:48] <= data_pickup_r;//0
214 | 4'd4: Latitude[47:40] <= data_pickup_r;//9
215 | 4'd6: Latitude[39:32] <= data_pickup_r;//
216 | 4'd7: Latitude[31:24] <= data_pickup_r;//
217 | 4'd8: Latitude[23:16] <= data_pickup_r;//
218 | 4'd9: Latitude[15:8] <= data_pickup_r;//
219 | 4'd10: Latitude[7:0] <= data_pickup_r;//
220 | default:;
221 | endcase
222 | end
223 | else if(count == 4'd4&&nege_edge&& data_pickup_r!=8'h2C)begin
224 | N_flag[7:0] <= data_pickup_r;//N
225 | end
226 | else if(count == 4'd5&&nege_edge&& data_pickup_r!=8'h2C)begin //经度
227 | case(num)
228 | 4'd1: longitude[87:80] <= data_pickup_r;//1 10853.63286 [3130382e35333633323836]
229 | 4'd2: longitude[79:72] <= data_pickup_r;//0
230 | 4'd3: longitude[71:64] <= data_pickup_r;//8
231 | 4'd6: longitude[63:56] <= data_pickup_r;//.
232 | 4'd4: longitude[55:48] <= data_pickup_r;//5
233 | 4'd5: longitude[47:40] <= data_pickup_r;//3
234 | 4'd7: longitude[39:32] <= data_pickup_r;
235 | 4'd8: longitude[31:24] <= data_pickup_r;
236 | 4'd9: longitude[23:16] <= data_pickup_r;
237 | 4'd10: longitude[15:8] <= data_pickup_r;
238 | 4'd11: longitude[7:0] <= data_pickup_r;
239 | default:;
240 | endcase
241 | end
242 | else if(count == 4'd6&&nege_edge&& data_pickup_r!=8'h2C)begin
243 | E_flag[7:0] <= data_pickup_r;//E
244 | end
245 | else if(count == 4'd9&&nege_edge&& data_pickup_r!=8'h2C)begin
246 | case(num) //171019 19年10月17日 [313931303137]
247 | 4'd5: ddmmyy[47:40] <= data_pickup_r;
248 | 4'd6: ddmmyy[39:32] <= data_pickup_r;
249 | 4'd3: ddmmyy[31:24] <= data_pickup_r;
250 | 4'd4: ddmmyy[23:16] <= data_pickup_r;
251 | 4'd1: ddmmyy[15:8] <= data_pickup_r;
252 | 4'd2: ddmmyy[7:0] <= data_pickup_r;
253 | default:;
254 | endcase
255 | end
256 | end
257 |
258 | assign ymr_out = ddmmyy;
259 | always@(*)
260 | begin
261 | if(E_flag[7:4]==4'b0100)
262 | data_rx_end ={N_flag,Latitude,E_flag,longitude};
263 | else data_rx_end=1'b0;
264 | end
265 | always@(*)
266 | begin
267 | if(UTC_time[7:4]==4'b0011)
268 | time_out =UTC_time;
269 | else time_out=1'b0;
270 | end
271 |
272 | endmodule
273 |
--------------------------------------------------------------------------------
/Arudino代码/Tricycle_For_Arduino.ino:
--------------------------------------------------------------------------------
1 | #include
2 | #include //外部中断
3 | #include //定时中断
4 | //#include
5 | //SoftwareSerial Serial(11, A2); // RX, TX
6 | /////////TB6612驱动引脚////
7 | //#define AIN1 11
8 | //#define AIN2 5
9 | #define AIN1 10
10 | #define AIN2 9
11 | #define BIN1 6
12 | #define BIN2 3
13 | #define SERVO 9
14 | /////////编码器引脚////////
15 | #define ENCODER_L 8 //编码器采集引脚 每路2个 共4个
16 | #define DIRECTION_L 4
17 | #define ENCODER_R 7
18 | #define DIRECTION_R 2
19 | #define key1 12
20 | #define key2 13
21 | /////////按键引脚////////
22 | //#define KEY 18
23 | //#define T 0.156f
24 | //#define L 0.1445f
25 | //#define pi 3.1415926
26 |
27 | volatile long Velocity_L, Velocity_R ; //左右轮编码器数据
28 | int Velocity_Left, Velocity_Right = 0 ; //左右轮速度
29 | float Velocity_KP =10 , Velocity_KI = 1, Velocity = 0, turn =0;
30 | unsigned char Flag_Stop = 0; //停止标志位
31 | float Target_A, Target_B;
32 |
33 | int sensorValue = 0;
34 |
35 | void (* resetFunc) (void) = 0;// Reset func
36 |
37 | //心率*************************************************
38 |
39 | #include
40 | #include "MAX30105.h"
41 |
42 | #include "heartRate.h"
43 |
44 | MAX30105 particleSensor;
45 |
46 | const byte RATE_SIZE = 4; //Increase this for more averaging. 4 is good.
47 | byte rates[RATE_SIZE]; //Array of heart rates
48 | byte rateSpot = 0;
49 | long lastBeat = 0; //Time at which the last beat occurred
50 |
51 | float beatsPerMinute;
52 | int beatAvg;
53 |
54 | //****************************************************
55 |
56 | void get_key(void)
57 | {
58 | if(digitalRead(key1) == HIGH && digitalRead(key2) == LOW)
59 | {turn =2 ;Velocity=-7;}
60 | else if(digitalRead(key1) == LOW && digitalRead(key2) == HIGH)
61 | {turn = -2;Velocity=-7;}
62 | else if(digitalRead(key1) == HIGH && digitalRead(key2) == HIGH)
63 | {turn = 0;Velocity=-7;}
64 | else if(digitalRead(key1) == LOW && digitalRead(key2) == LOW)
65 | {turn = 0;Velocity=0;}
66 | }
67 |
68 | /**************************************************************************
69 | 函数功能:赋值给PWM寄存器 作者:平衡小车之家
70 | 入口参数:PWM
71 | **************************************************************************/
72 | void Set_Pwm(int motora, int motorb) {
73 | if (motora >= 0) analogWrite(AIN1, motora), digitalWrite(AIN2, LOW); //赋值给PWM寄存器
74 | else digitalWrite(AIN2, HIGH), analogWrite(AIN1, 255 + motora); //赋值给PWM寄存器
75 |
76 | if (motorb >= 0) digitalWrite(BIN2, LOW), analogWrite(BIN1, motorb); //赋值给PWM寄存器
77 | else analogWrite(BIN1,255 + motorb), digitalWrite(BIN2, HIGH); //赋值给PWM寄存器
78 | }
79 | /**************************************************************************
80 | 函数功能:异常关闭电机
81 | 入口参数:电压
82 | 返回 值:1:异常 0:正常
83 | /**************************************************************************/
84 | unsigned char Turn_Off() {
85 | byte temp;
86 | if (Flag_Stop == 1) { //Flag_Stop置1或者电压太低关闭电机
87 | temp = 1;
88 | digitalWrite(AIN1, LOW); //电机驱动的电平控制
89 | digitalWrite(AIN2, LOW); //电机驱动的电平控制
90 | digitalWrite(BIN1, LOW); //电机驱动的电平控制
91 | digitalWrite(BIN2, LOW); //电机驱动的电平控制
92 | }
93 | else temp = 0;
94 | return temp;
95 | }
96 | /**************************************************************************
97 | 函数功能:小车运动数学模型
98 | 入口参数:速度和转角
99 | //**************************************************************************/
100 | void Kinematic_Analysis(float velocity, float turn) {
101 | Target_A=velocity+turn;
102 | Target_B=velocity-turn; //后轮差速
103 | }
104 |
105 | /**************************************************************************
106 | 函数功能:增量PI控制器
107 | 入口参数:编码器测量值,目标速度
108 | 返回 值:电机PWM
109 | 根据增量式离散PID公式
110 | pwm+=Kp[e(k)-e(k-1)]+Ki*e(k)+Kd[e(k)-2e(k-1)+e(k-2)]
111 | e(k)代表本次偏差
112 | e(k-1)代表上一次的偏差 以此类推
113 | pwm代表增量输出
114 | 在我们的速度控制闭环系统里面,只使用PI控制
115 | pwm+=Kp[e(k)-e(k-1)]+Ki*e(k)
116 | **************************************************************************/
117 | int Incremental_PI_A (int Encoder,int Target)
118 | {
119 | static float Bias,Pwm,Last_bias;
120 | Bias=Encoder-Target; //计算偏差
121 | Pwm+=Velocity_KP*(Bias-Last_bias)+Velocity_KI*Bias; //增量式PI控制器
122 | if(Pwm>255)Pwm=255; //限幅
123 | if(Pwm<-255)Pwm=-255; //限幅
124 | Last_bias=Bias; //保存上一次偏差
125 | return Pwm; //增量输出
126 | }
127 | int Incremental_PI_B (int Encoder,int Target)
128 | {
129 | static float Bias,Pwm,Last_bias;
130 | Bias=Encoder-Target; //计算偏差
131 | Pwm+=Velocity_KP*(Bias-Last_bias)+Velocity_KI*Bias; //增量式PI控制器
132 | if(Pwm>255)Pwm=255; //限幅
133 | if(Pwm<-255)Pwm=-255; //限幅
134 | Last_bias=Bias; //保存上一次偏差
135 | return Pwm; //增量输出
136 | }
137 |
138 | /*********函数功能:5ms控制函数 核心代码 作者:平衡小车之家*******/
139 | void control() {
140 | int Temp, Temp2, Motora, Motorb; //临时变量
141 | static unsigned char Position_Count,Voltage_Count; //位置控制分频用的变量
142 | sei();//全局中断开启
143 | Velocity_Left = Velocity_L; Velocity_L = 0; //读取左轮编码器数据,并清零,这就是通过M法测速(单位时间内的脉冲数)得到速度。
144 | Velocity_Right = Velocity_R; Velocity_R = 0; //读取右轮编码器数据,并清零
145 | Kinematic_Analysis(Velocity,turn); //小车运动学分析
146 | Motora = Incremental_PI_A(Target_A, Velocity_Left); //===速度PI控制器
147 | Motorb = Incremental_PI_B(Target_B, Velocity_Right); //===速度PI控制器
148 | Set_Pwm(Motora, Motorb); //如果不存在异常,使能电机
149 |
150 | get_key();
151 |
152 | //Serial.println("Velocity_Left:");
153 | //Serial.print(Velocity_Left);
154 | //Serial.print(",");
155 | //Serial.println("Velocity_Right:");
156 | //Serial.println(Velocity_Right);
157 | if (Temp == 1)Flag_Stop = !Flag_Stop;
158 | }
159 |
160 | /***********函数功能:初始化 相当于STM32里面的Main函数 作者:平衡小车之家************/
161 | void setup() {
162 | char error;
163 | pinMode(AIN1, OUTPUT); //电机控制引脚
164 | pinMode(AIN2, OUTPUT); //电机控制引脚,
165 | pinMode(BIN1, OUTPUT); //电机速度控制引脚
166 | pinMode(BIN2, OUTPUT); //电机速度控制引脚
167 |
168 | pinMode(ENCODER_L, INPUT); //编码器引脚
169 | pinMode(DIRECTION_L, INPUT); //编码器引脚
170 | pinMode(ENCODER_R, INPUT); //编码器引脚
171 | pinMode(DIRECTION_R, INPUT); //编码器引脚
172 |
173 | pinMode(key1, INPUT);
174 | pinMode(key2, INPUT);
175 |
176 | delay(200); //延时等待初始化完成
177 | attachInterrupt(0, READ_ENCODER_R, CHANGE); //开启外部中断 编码器接口1
178 | attachPinChangeInterrupt(4, READ_ENCODER_L, CHANGE); //开启外部中断 编码器接口2
179 |
180 | MsTimer2::set(10, control); //使用Timer2设置5ms定时中断
181 | MsTimer2::start(); //中断使能
182 |
183 |
184 | Serial.begin(9600); //开启串口
185 | // Serial.begin(9600);
186 |
187 | //心率*************************************************
188 |
189 | if (!particleSensor.begin(Wire, I2C_SPEED_FAST)) //Use default I2C port, 400kHz speed
190 | {
191 | Serial.println("MAX30105 was not found. Please check wiring/power. ");
192 | while (1);
193 | }
194 | Serial.println("Place your index finger on the sensor with steady pressure.");
195 |
196 | particleSensor.setup(); //Configure sensor with default settings
197 | particleSensor.setPulseAmplitudeRed(0x0A); //Turn Red LED to low to indicate sensor is running
198 | particleSensor.setPulseAmplitudeGreen(0); //Turn off Green LED
199 |
200 | //心率*************************************************
201 | }
202 |
203 | /******函数功能:主循环程序体*******/
204 | void loop(){
205 | //Serial.print("Left: ");
206 | //Serial.println(Velocity_Left);
207 | // Serial.print("Right: ");
208 | // Serial.println(Velocity_Right);
209 | // delay(500);
210 | sensorValue = analogRead(A0);
211 | Serial.print("ABC");
212 | Serial.print(sensorValue);
213 | //心率*************************************************
214 |
215 | long irValue = particleSensor.getIR();
216 |
217 | if (checkForBeat(irValue) == true)
218 | {
219 | //We sensed a beat!
220 | long delta = millis() - lastBeat;
221 | lastBeat = millis();
222 |
223 | beatsPerMinute = 60 / (delta / 1000.0);
224 |
225 | if (beatsPerMinute < 255 && beatsPerMinute > 20)
226 | {
227 | rates[rateSpot++] = (byte)beatsPerMinute; //Store this reading in the array
228 | rateSpot %= RATE_SIZE; //Wrap variable
229 |
230 | //Take average of readings
231 | beatAvg = 0;
232 | for (byte x = 0 ; x < RATE_SIZE ; x++)
233 | beatAvg += rates[x];
234 | beatAvg /= RATE_SIZE;
235 | }
236 | }
237 | //Serial.print("IR=");
238 | //Serial.print(irValue);
239 | Serial.print("BPM=");
240 | // Serial.print(beatsPerMinute);
241 | // Serial.print(", Avg BPM=");
242 | Serial.print(beatAvg);
243 |
244 | // if (irValue < 50000)
245 | // Serial.print(" No finger?");
246 |
247 | // Serial.println();
248 |
249 | //心率*************************************************
250 | }
251 |
252 | /*****函数功能:外部中断读取编码器数据,具有二倍频功能 注意外部中断是跳变沿触发********/
253 | void READ_ENCODER_L() {
254 | if (digitalRead(ENCODER_L) == LOW) { //如果是下降沿触发的中断
255 | if (digitalRead(DIRECTION_L) == LOW) Velocity_L--; //根据另外一相电平判定方向
256 | else Velocity_L++;
257 | }
258 | else { //如果是上升沿触发的中断
259 | if (digitalRead(DIRECTION_L) == LOW) Velocity_L++; //根据另外一相电平判定方向
260 | else Velocity_L--;
261 | }
262 | }
263 |
264 | /*****函数功能:外部中断读取编码器数据,具有二倍频功能 注意外部中断是跳变沿触发********/
265 | void READ_ENCODER_R() {
266 | if (digitalRead(ENCODER_R) == LOW) { //如果是下降沿触发的中断
267 | if (digitalRead(DIRECTION_R) == LOW) Velocity_R++;//根据另外一相电平判定方向
268 | else Velocity_R--;
269 | }
270 | else { //如果是上升沿触发的中断
271 | if (digitalRead(DIRECTION_R) == LOW) Velocity_R--; //根据另外一相电平判定方向
272 | else Velocity_R++;
273 | }
274 | }
275 |
--------------------------------------------------------------------------------
/pick_up_rx.v:
--------------------------------------------------------------------------------
1 | module pick_up_rx(
2 | input clk,
3 | input rst_n,
4 | input [7:0] data_rx,
5 | input rx_int,//当uart_rx模块接收完对方的数据后,传给uart_tx,此为标志位,标志uart_tx要开始工作
6 | output [383:0] data_rx_end,
7 | output [47:0] ymr_out,
8 | output [31:0] time_out
9 | );
10 |
11 | //-------------------------------------------------------
12 | //每个8位数据接收完整的标志
13 | reg [1:0] rx_int_r;
14 | always@(posedge clk or negedge rst_n)begin
15 | if(!rst_n) begin
16 | rx_int_r[0] <= 1'b0;
17 | rx_int_r[1] <= 1'b0;
18 | end
19 | else begin
20 | rx_int_r[0] <= rx_int;
21 | rx_int_r[1] <= rx_int_r[0];
22 | end
23 | end
24 |
25 | wire nege_edge = rx_int_r[1] & ~rx_int_r[0];//下降沿
26 |
27 |
28 | //---------------------------------------------------
29 | reg [7:0] data_rx_r;//用来接收传过来的data_rx
30 | //将rx接来的数据存下来
31 | always@(posedge clk or negedge rst_n)begin
32 | if(!rst_n) begin
33 | data_rx_r <= 8'd0;
34 | end
35 | else if(nege_edge)begin
36 | data_rx_r <= data_rx;
37 | end
38 | end
39 |
40 | reg detected_o;
41 | parameter length = 7; //更方便地更改状态长度
42 |
43 | parameter [length-1 : 0] //one-hot code
44 | S_IDLE = 7'b0000001,
45 | S_State1 = 7'b0000010,
46 | S_State2 = 7'b0000100,
47 | S_State3 = 7'b0001000,
48 | S_State4 = 7'b0010000,
49 | S_State5 = 7'b0100000,
50 | S_State6 = 7'b1000000;
51 |
52 | reg [length-1 : 0] c_state;
53 | reg [length-1 : 0] n_state;
54 | //三段式状态机
55 | always @(posedge clk or negedge rst_n) begin
56 | if (!rst_n) begin
57 | c_state <= S_IDLE; // reset低电平复位
58 | end
59 | else begin
60 | c_state <= n_state; //next state logic
61 | end
62 | end
63 |
64 | always @(*) begin //state register
65 | case(c_state)
66 | S_IDLE :
67 | if (data_rx_r == 8'h24 && nege_edge)//$
68 | n_state = S_State1;
69 | else
70 | n_state = S_IDLE;
71 | S_State1 :
72 | if (data_rx_r == 8'h47 && nege_edge)//G
73 | n_state = S_State2;
74 | else
75 | n_state = S_State1;
76 | S_State2 :
77 | if (data_rx_r == 8'h50 && nege_edge)//P
78 | n_state = S_State3;
79 | else
80 | n_state = S_State2;
81 | S_State3 :
82 | if (data_rx_r == 8'h52 && nege_edge)//R//G
83 | n_state = S_State4;
84 | else
85 | n_state = S_State3;
86 | S_State4 :
87 | if (data_rx_r == 8'h4D && nege_edge)//M//L
88 | n_state = S_State5;
89 | else
90 | n_state = S_State4;
91 | S_State5 :
92 | if (data_rx_r == 8'h43 && nege_edge)//C//L
93 | n_state = S_State6;
94 | else
95 | n_state = S_State5;
96 | S_State6 :
97 | if (data_rx_r && nege_edge)
98 | n_state = S_IDLE;
99 | else
100 | n_state = S_State4;
101 | default :
102 | n_state = S_IDLE;
103 | endcase
104 | end
105 |
106 | //状态机输出output logic
107 | always @ (posedge clk or negedge rst_n) begin
108 | if(!rst_n) begin
109 | detected_o <= 1'b0;
110 | end
111 | else if( c_state == S_State6) begin
112 | detected_o <= 1'b1;
113 | end
114 | else begin
115 | detected_o <= 1'b0;
116 | end
117 | end
118 |
119 | ///检测到上升沿信号后持续输出高电平
120 | reg [3:0] num; //包传到哪个数据了
121 | // reg a_flag; //UTC位置标识位
122 | reg start_reg;
123 | reg timeout;
124 | always@(posedge clk)
125 | start_reg <= detected_o;
126 |
127 | reg [3:0] count;
128 | always@(posedge clk or negedge rst_n) begin
129 | if (!rst_n)
130 | timeout <= 0;
131 | else if(start_reg == 0 && detected_o ==1)
132 | timeout <= 1;
133 | else if(count == 4'd10)
134 | timeout <= 0;
135 | else
136 | timeout <= timeout;
137 | end
138 | /////
139 |
140 | reg [7:0] data_pickup_r;//用来提取接收传过来的data_rx
141 | //将rx接来的数据存下来
142 | always@(posedge clk or negedge rst_n)begin
143 | if(!rst_n) begin
144 | data_pickup_r <= 8'd0;
145 | end
146 | else if(timeout) begin
147 | data_pickup_r <= data_rx_r;
148 | end
149 | end
150 |
151 | // reg [3:0] count;
152 | always@(posedge clk or negedge rst_n)
153 | begin
154 | if(!rst_n)
155 | count <= 0;
156 | else if(data_pickup_r==8'h2C && nege_edge)
157 | count <= count + 1;
158 | else if(start_reg == 0 && detected_o ==1)
159 | count <= 0;
160 | else
161 | count <= count;
162 | end
163 |
164 | //-------------------------------------------------------
165 | //判断包头,确定开始,以及识别号
166 | always@(posedge clk or negedge rst_n)begin
167 | if(!rst_n) num <= 4'd0;
168 | else if(start_reg == 0 && detected_o ==1) num <= 0;
169 | else if(data_pickup_r==8'h2C&&nege_edge ) num <= 4'd1;
170 | else if(timeout&&nege_edge) num <= num + 1'b1;
171 | else num <= num;
172 | end
173 |
174 |
175 | //-----------------------------------------------------
176 | //根据标识位分类给寄存器赋值
177 | reg [79:0] Latitude ; //纬度
178 | reg [87:0] longitude ; //经度
179 | reg [71:0] UTC_time ; //UTC时间
180 | reg [47:0] ddmmyy;
181 | reg [7:0] E_flag;
182 | reg [7:0] N_flag;
183 | always@(posedge clk or negedge rst_n)begin
184 | if(!rst_n) begin
185 | Latitude <= 0;
186 | longitude <= 0;
187 | UTC_time <= 0;
188 | ddmmyy <= 0;
189 | E_flag <= 0;
190 | N_flag <= 0;
191 | end
192 | else if(count == 4'd1&&nege_edge&& data_pickup_r!=8'h2C )begin
193 | case(num)
194 | 4'd9: UTC_time[71:64] <= data_pickup_r;
195 | 4'd8: UTC_time[63:56] <= data_pickup_r;
196 | 4'd7: UTC_time[55:48] <= data_pickup_r;
197 | 4'd6: UTC_time[47:40] <= data_pickup_r;
198 | 4'd5: UTC_time[39:32] <= data_pickup_r;
199 | 4'd4: UTC_time[31:24] <= data_pickup_r;
200 | 4'd3: UTC_time[23:16] <= data_pickup_r;
201 | 4'd2: UTC_time[15:8] <= data_pickup_r;//di
202 | 4'd1: UTC_time[7:0] <= data_pickup_r;//gao
203 | default:;
204 | endcase
205 | end
206 | else if(count == 4'd3&&nege_edge&& data_pickup_r!=8'h2C)begin
207 | case(num)
208 | 4'd10: Latitude[79:72] <= data_pickup_r;//
209 | 4'd9: Latitude[71:64] <= data_pickup_r;//
210 | 4'd8: Latitude[63:56] <= data_pickup_r;//
211 | 4'd7: Latitude[55:48] <= data_pickup_r;//
212 | 4'd6: Latitude[47:40] <= data_pickup_r;//
213 | 4'd5: Latitude[23:16] <= data_pickup_r;//9
214 | 4'd4: Latitude[39:32] <= data_pickup_r;//0
215 | 4'd3: Latitude[31:24] <= data_pickup_r;//小数点
216 | 4'd2: Latitude[15:8] <= data_pickup_r;//4
217 | 4'd1: Latitude[7:0] <= data_pickup_r;//3
218 | default:;
219 | endcase
220 | end
221 | else if(count == 4'd4&&nege_edge&& data_pickup_r!=8'h2C)begin
222 | N_flag[7:0] <= data_pickup_r;//N
223 | end
224 | else if(count == 4'd5&&nege_edge&& data_pickup_r!=8'h2C)begin
225 | case(num)
226 | 4'd11: longitude[87:80] <= data_pickup_r;
227 | 4'd10: longitude[79:72] <= data_pickup_r;
228 | 4'd9: longitude[71:64] <= data_pickup_r;
229 | 4'd8: longitude[63:56] <= data_pickup_r;
230 | 4'd7: longitude[55:48] <= data_pickup_r;
231 | 4'd6: longitude[31:24] <= data_pickup_r;//3
232 | 4'd5: longitude[47:40] <= data_pickup_r;//5
233 | 4'd4: longitude[39:32] <= data_pickup_r;//小数点
234 | 4'd3: longitude[23:16] <= data_pickup_r;//8
235 | 4'd2: longitude[15:8] <= data_pickup_r;//0
236 | 4'd1: longitude[7:0] <= data_pickup_r;//1
237 | default:;
238 | endcase
239 | end
240 | else if(count == 4'd6&&nege_edge&& data_pickup_r!=8'h2C)begin
241 | E_flag[7:0] <= data_pickup_r;//E
242 | end
243 | else if(count == 4'd9&&nege_edge&& data_pickup_r!=8'h2C)begin
244 | case(num)
245 | 4'd6: ddmmyy[15:8] <= data_pickup_r;//8
246 | 4'd5: ddmmyy[7:0] <= data_pickup_r;//1
247 | 4'd4: ddmmyy[31:24] <= data_pickup_r;//0
248 | 4'd3: ddmmyy[23:16] <= data_pickup_r;//1
249 | 4'd2: ddmmyy[47:40] <= data_pickup_r;//1
250 | 4'd1: ddmmyy[39:32] <= data_pickup_r;//3
251 | default:;
252 | endcase
253 | end
254 | end
255 |
256 | reg [15:0] UTC_time_OUT;
257 | //数值换算
258 | always@(posedge clk or negedge rst_n)begin
259 | if(!rst_n)
260 | UTC_time_OUT <= 0;
261 | else if(UTC_time[7:0]==8'h30&&nege_edge) begin
262 | if((UTC_time[15:8] == 8'h30) || (UTC_time[15:8] == 8'h31)) begin
263 | UTC_time_OUT[15:8] <= UTC_time[15:8] + 8'd8;
264 | UTC_time_OUT[7:0] <= UTC_time[7:0];
265 | end
266 | else begin
267 | UTC_time_OUT[7:0] <= 8'h31;
268 | UTC_time_OUT[15:8] <= UTC_time[15:8] - 8'd2;
269 | end
270 | end
271 | else if(UTC_time[7:0]==8'h31&&nege_edge) begin
272 | if((UTC_time[15:8] == 8'h30) || (UTC_time[15:8] == 8'h31)) begin
273 | UTC_time_OUT[15:8] <= UTC_time[15:8] + 8'd8;
274 | UTC_time_OUT[7:0] <= UTC_time[7:0];
275 | end
276 | else if((8'h32 <= UTC_time[15:8] <= 8'h35)&&nege_edge) begin
277 | UTC_time_OUT[7:0] <= 8'h32;
278 | UTC_time_OUT[15:8] <= UTC_time[15:8] - 8'd2;
279 | end
280 | else begin
281 | UTC_time_OUT[7:0] <= 8'h30;
282 | UTC_time_OUT[15:8] <= UTC_time[15:8] - 8'd6;
283 | end
284 | end
285 | else if(UTC_time[7:0]==8'h32&&nege_edge) begin
286 | UTC_time_OUT[7:0] <= 8'h30;
287 | UTC_time_OUT[15:8] <= UTC_time[15:8] + 8'd4;
288 | end
289 | else
290 | UTC_time_OUT <= UTC_time_OUT;
291 | end
292 | //经度 //纬度
293 | // assign data_rx_end = {N_flag,Latitude,8'h0A,E_flag,longitude,8'h0A,UTC_time[71:16],UTC_time_OUT,8'h3A,8'h74,8'h0A,ddmmyy,8'h3A,8'h61,8'h74,8'h61,8'h64};
294 |
295 |
296 | wire [79:0] Latitude_1 =0;
297 | wire [87:0] longitude_1 =0;
298 | wire [71:0] UTC_time_1 =0;
299 | wire [15:0] UTC_time_OUT_1 =0;
300 | wire [47:0] ddmmyy_1 =0;
301 |
302 |
303 | assign data_rx_end = {N_flag,Latitude_1,8'h0A,E_flag,longitude_1,8'h0A,UTC_time_1[71:16],UTC_time_OUT_1,8'h3A,8'h74,8'h0A,ddmmyy_1,8'h3A,8'h61,8'h74,8'h61,8'h64};
304 |
305 | assign ymr_out = ddmmyy;
306 | assign time_out = {UTC_time_OUT,UTC_time[31:16]};
307 |
308 | endmodule
309 |
--------------------------------------------------------------------------------