|
有没有大佬能帮我一下 ,在这个实验中,我按照视频做了一下,仿真出来的波形也没有问题(如图一),但是我下载到板子上面,我论我怎么弄,灯(绑定的是PL端的T14引脚这个灯)都不会亮,除了在我传输数据的时候,EDA拓展板上的D12这个会闪一下;后面我又直接小梅哥例程的代码,发现例程的代码我下载到板子上有的时候有用有的时候又没用,这是为什么。下面的是我自己跟着视频写的代码:
顶层:
`timescale 1ns / 1ps
module top(
input clk,
input rst_n,
input uart_tx,
output Led
);
wire [7:0] Ctrl ;
wire [31:0] Time ;
wire [7:0] uart_rx ;
wire rx_done ;
wire en_time;
counter_led_4 uut(
.Clk (clk ),
.Reset_n (rst_n),
.Ctrl (Ctrl ),
.Time (Time ),
.Led (Led )
);
uart_rx uut0(
.clk (clk ) ,
.rst_n (rst_n ) ,
.uart_tx (uart_tx) ,
.uart_rx (uart_rx) ,
.rx_done (rx_done)
);
uart_cmd uut1(
.clk (clk ),
.rst_n (rst_n ),
.uart_rx (uart_rx),
.rx_done (rx_done),
.Ctrl (Ctrl ),
.Time (Time )
);
endmodule
串口接收模块:
`timescale 1ns / 1ps
module uart_rx(
input clk,
input rst_n,
input uart_tx,
output reg [7:0] uart_rx,
output reg rx_done
);
parameter CLK_P=50_000_000;
parameter BAUT=9600;
parameter BAUT_CNT_MAX=CLK_P/BAUT-1;
reg [7:0] R_uart_rx;
reg uart_tx_del;
wire uart_tx_negedge;
reg [12:0] baud_cnt;
reg baud_cnt_en;
reg [3:0] wei;
reg dff0_uart_tx;
reg dff1_uart_tx;
always@(posedge clk )begin
dff0_uart_tx<=uart_tx;
end
always@(posedge clk )begin
dff1_uart_tx<=dff0_uart_tx;
end
//检测下降沿
always@(posedge clk )begin
uart_tx_del<=dff1_uart_tx;
end
assign uart_tx_negedge=(dff1_uart_tx==1'b0)&&(uart_tx_del==1'b1);//上升沿来时为1
//波特率计数
always@(posedge clk or negedge rst_n)begin
if(!rst_n)
baud_cnt<=13'b0;
else if (baud_cnt_en)begin
if(baud_cnt==BAUT_CNT_MAX)
baud_cnt<=13'b0;
else
baud_cnt<=baud_cnt+13'b1;
end
end
//baud_cnt_en波特计数使能
always@(posedge clk or negedge rst_n)begin
if(!rst_n)
baud_cnt_en<=1'b0;
else if (uart_tx_negedge)
baud_cnt_en<=1'b1;
else if( (baud_cnt==BAUT_CNT_MAX/2) && (wei==0) &&( dff1_uart_tx==1))
baud_cnt_en<=1'b0;
else if((baud_cnt==BAUT_CNT_MAX/2) &&(wei==9))
baud_cnt_en<=1'b0;
else
baud_cnt_en<=baud_cnt_en;
end
//位计数
always@(posedge clk or negedge rst_n)begin
if(!rst_n)
wei<=4'b0;
else if((baud_cnt==BAUT_CNT_MAX/2)&&(wei==9))
wei<=4'b0;
else if(baud_cnt==BAUT_CNT_MAX)
wei<=wei+1;
else
wei<=wei;
end
//输出
always@(posedge clk or negedge rst_n)begin
if(!rst_n)
R_uart_rx<=8'b0;
else if(baud_cnt==BAUT_CNT_MAX/2)begin
case(wei)
1: R_uart_rx[0] <= uart_tx;
2: R_uart_rx[1] <= uart_tx;
3: R_uart_rx[2] <= uart_tx;
4: R_uart_rx[3] <= uart_tx;
5: R_uart_rx[4] <= uart_tx;
6: R_uart_rx[5] <= uart_tx;
7: R_uart_rx[6] <= uart_tx;
8: R_uart_rx[7] <= uart_tx;
default:R_uart_rx<=R_uart_rx;
endcase
end
end
wire R_rx_done;
//接收完成标志
assign R_rx_done=(baud_cnt==BAUT_CNT_MAX/2) &&(wei==9);
always@(posedge clk)begin
rx_done<=R_rx_done;
end
always@(posedge clk)begin
if(R_rx_done)
uart_rx<=R_uart_rx;
end
endmodule
串口接收控制模块:
`timescale 1ns / 1ps
module uart_cmd(
input clk,
input rst_n,
input [7:0] uart_rx,
input rx_done,
output reg [7:0] Ctrl,
output reg [31:0] Time
);
reg r_rx_done;
always@(posedge clk )begin
r_rx_done<=rx_done;
end
reg [7:0] huan [7:0];//二维寄存器,先每个值的宽度,再有几个数据,(宽度、深度)
always@(posedge clk or negedge rst_n)begin
if(!rst_n)begin
huan[0]<=0;
huan[1]<=0;
huan[2]<=0;
huan[3]<=0;
huan[4]<=0;
huan[5]<=0;
huan[6]<=0;
huan[7]<=0;
end
else if (rx_done)begin
huan[0]<= huan[1] ;
huan[1]<= huan[2] ;
huan[2]<= huan[3] ;
huan[3]<= huan[4] ;
huan[4]<= huan[5] ;
huan[5]<= huan[6] ;
huan[6]<= huan[7] ;
huan[7]<= uart_rx ;
end
end
always@(posedge clk or negedge rst_n)begin
if(!rst_n)begin
Ctrl<=8'b0;
Time<=32'b0;
end
else if (r_rx_done)begin
if((huan[0]==8'h55)&&(huan[1]==8'hA5)&&(huan[7]==8'hf0))begin
Time[7:0]<=huan[5];
Time[15:8]<=huan[4];
Time[23:16]<=huan[3];
Time[31:24]<=huan[2];
Ctrl<=huan[6];
end
else begin
Ctrl<=Ctrl;
Time<=Time;
end
end
end
endmodule
灯的控制:
`timescale 1ns/1ns
module counter_led_4(
Clk,
Reset_n,
Ctrl,
Time,
Led
);
input Clk;
input Reset_n;
input [7:0]Ctrl;
input [31:0]Time;
output reg Led;
reg [31:0]counter;
always@(posedge Clk or negedge Reset_n)
if(!Reset_n)
counter <= 0;
else if(counter >= Time - 1)
counter <= 0;
else
counter <= counter + 1'b1;
reg [2:0]counter2;
always@(posedge Clk or negedge Reset_n)
if(!Reset_n)
counter2 <= 0;
else if(counter >= Time - 1)
counter2 <= counter2 + 1'b1;
always@(posedge Clk or negedge Reset_n)
if(!Reset_n)
Led <= 0;
else case(counter2)
0 ed <= Ctrl[0];
1 ed <= Ctrl[1];
2 ed <= Ctrl[2];
3 ed <= Ctrl[3];
4 ed <= Ctrl[4];
5 ed <= Ctrl[5];
6 ed <= Ctrl[6];
7 ed <= Ctrl[7];
default ed <= Led;
endcase
endmodule
|
-
图一
-
|