-
Notifications
You must be signed in to change notification settings - Fork 0
fpga项目:uart_rx_fifo
minichao9901 edited this page Mar 10, 2024
·
3 revisions
![image](https://private-user-images.githubusercontent.com/61445559/311443220-7be7b0cb-2716-4597-b5df-7a1f2c1d120b.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkyMDI4MDIsIm5iZiI6MTczOTIwMjUwMiwicGF0aCI6Ii82MTQ0NTU1OS8zMTE0NDMyMjAtN2JlN2IwY2ItMjcxNi00NTk3LWI1ZGYtN2ExZjJjMWQxMjBiLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTAlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjEwVDE1NDgyMlomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTc2MTY5ODI0NWJhMDE2MDU2MjQyYWQyZjhhODJhNWQ5MzA2ZjU1ODdkOGVkOWU2OGZiYzBmNDk3ZGRhN2Y5NTMmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.SUl9gn2epDnPbhBtaH_JV6_wMN9fdrM-_iG6e1mq99o)
`timescale 1ns / 1ps
module uart_rx_wrapper(
input clk,
input rst_n,
output [7:0] dout,
input rd_en,
output full,
output almost_full,
output empty,
output almost_empty,
input rx
);
wire [8 : 0] data_count;
wire [7:0] din;
uart_rx uart_rx_inst
(
.sys_clk(clk),
.sys_rst_n(rst_n),
.po_data(din),
.po_flag(xfer_vld),
.rx(rx)
);
assign wr_en=xfer_vld && (~full);
fifo_generator_0 your_instance_name (
.clk(clk), // input wire clk
.din(din), // input wire [7 : 0] din
.wr_en(wr_en), // input wire wr_en
.rd_en(rd_en), // input wire rd_en
.dout(dout), // output wire [7 : 0] dout
.full(full), // output wire full
.almost_full(almost_full), // output wire almost_full
.empty(empty), // output wire empty
.almost_empty(almost_empty), // output wire almost_empty
.data_count(data_count) // output wire [8 : 0] data_count
);
endmodule
![image](https://private-user-images.githubusercontent.com/61445559/311475650-6cb7da19-64a2-4551-833e-a4bdca1e6986.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkyMDI4MDIsIm5iZiI6MTczOTIwMjUwMiwicGF0aCI6Ii82MTQ0NTU1OS8zMTE0NzU2NTAtNmNiN2RhMTktNjRhMi00NTUxLTgzM2UtYTRiZGNhMWU2OTg2LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTAlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjEwVDE1NDgyMlomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTE0NWYyY2E2ZjAxMDZjNTY3Mjg2NTliYTIzMzZjNzc2ODE5N2I2ZjA2Njg1ZjAwMzZkMTA3NGRlYTgzMGQ1YzImWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.3zEGeCVdONkgVDXEWWGdr4TfjB0g8Clv1vI4v4dn4Fw)
`timescale 1ns / 1ps
module syn_uart_rx_fifo_wrapper2(
input clk,
input rst_n,
input sw,
output empty,
output full,
input rx,
output tx
);
/*********************************************************************************/
parameter CNT_MAX=50_000_000/100;
parameter LSM_MAX=512;
bit [31:0] div_cnt;
bit [5:0] lsm_cnt;
bit cnt_valid;
always @(posedge clk or negedge rst_n)
if(rst_n==0)
div_cnt<=0;
else if(add_div_cnt) begin
if(end_div_cnt)
div_cnt<=0;
else
div_cnt<=div_cnt+1;
end
assign add_div_cnt=cnt_valid;
assign end_div_cnt=add_div_cnt && (div_cnt==CNT_MAX-1);
always @(posedge clk or negedge rst_n)
if(rst_n==0)
lsm_cnt<=0;
else if(add_lsm_cnt) begin
if(end_lsm_cnt)
lsm_cnt<=0;
else
lsm_cnt<=lsm_cnt+1;
end
assign add_lsm_cnt=end_div_cnt && cnt_valid;
assign end_lsm_cnt=add_lsm_cnt && (lsm_cnt==LSM_MAX-1);
assign cnt_valid=sw && (~empty);
/*********************************************************************************/
bit [7:0] dout;
bit [7:0] xfer_dout;
bit xfer_start;
bit rd_en;
always @(posedge clk or negedge rst_n)
if(rst_n==0) begin
rd_en<=0;
end
else if(add_lsm_cnt) begin
rd_en<=1;
end
else
rd_en<=0;
always @(posedge clk or negedge rst_n)
if(rst_n==0)
xfer_start<=0;
else
xfer_start<=rd_en;
assign xfer_dout=dout;
uart_rx_wrapper uart_rx_wrapper_inst
(
.clk(clk),
.rst_n(rst_n),
.dout(dout),
.rd_en(rd_en),
.full(full),
.almost_full(almost_full),
.empty(empty),
.almost_empty(almost_empty),
.rx(rx)
);
uart_tx uart_tx_inst
(
.sys_clk(clk),
.sys_rst_n(rst_n),
.pi_data(xfer_dout),
.pi_flag(xfer_start),
.po_ack(xfer_end),
.tx(tx)
);
endmodule
module tb_syn_uart_rx_fifo_wrapper;
reg clk, rst_n;
initial clk=0;
always #10 clk=~clk;
initial begin
rst_n=0;
#1000;
rst_n=1;
end
reg [7:0] xfer_dout;
reg xfer_start;
initial begin
xfer_dout=8'h00;
xfer_start=0;
wait(rst_n==1);
#1000;
@(posedge clk) begin
#1 xfer_start=1;
xfer_dout=8'h12;
end
@(posedge clk) begin
#1 xfer_start=0;
end
#2000;
@(posedge clk) begin
#1 xfer_start=1;
xfer_dout=8'h34;
end
@(posedge clk) begin
#1 xfer_start=0;
end
end
syn_uart_rx_fifo_wrapper2 syn_uart_rx_fifo_wrapper2_inst(
.clk(clk),
.rst_n(rst_n),
.sw(1),
.rx(rx)
);
defparam syn_uart_rx_fifo_wrapper2_inst.uart_rx_wrapper_inst.uart_rx_inst.UART_BPS= 'd9600;
defparam syn_uart_rx_fifo_wrapper2_inst.uart_rx_wrapper_inst.uart_rx_inst.CLK_FREQ= 'd50_000;
defparam syn_uart_rx_fifo_wrapper2_inst.CNT_MAX='d50_00;
uart_tx uart_tx_inst
(
.sys_clk(clk),
.sys_rst_n(rst_n),
.pi_data(xfer_dout),
.pi_flag(xfer_start),
.po_ack(xfer_end),
.tx(rx)
);
defparam uart_tx_inst.UART_BPS= 'd9600;
defparam uart_tx_inst.CLK_FREQ= 'd50_000;
endmodule
![image](https://private-user-images.githubusercontent.com/61445559/311476059-27739196-b925-4321-9ca4-1470816d94d5.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkyMDI4MDIsIm5iZiI6MTczOTIwMjUwMiwicGF0aCI6Ii82MTQ0NTU1OS8zMTE0NzYwNTktMjc3MzkxOTYtYjkyNS00MzIxLTljYTQtMTQ3MDgxNmQ5NGQ1LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTAlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjEwVDE1NDgyMlomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWY3MTdmZGRhZTZkNTdkYzQzODY5YzBmZDdiMjk1ODFjMGE1MWYyMjM5OGE0Nzg2NDM1ZDhhMmU4MjMwYWU3Y2YmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.-fMHNr9ptFEyA2Dm46uzTWwc4EVBHWYm37Azxo3EK4I)
顶层tb uart_tx_master的行为
![image](https://private-user-images.githubusercontent.com/61445559/311476138-7606f800-0b6f-4c74-afa2-ff7b2ff61070.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkyMDI4MDIsIm5iZiI6MTczOTIwMjUwMiwicGF0aCI6Ii82MTQ0NTU1OS8zMTE0NzYxMzgtNzYwNmY4MDAtMGI2Zi00Yzc0LWFmYTItZmY3YjJmZjYxMDcwLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTAlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjEwVDE1NDgyMlomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWEzMWIzNGJhNGYwMjVjODU0Y2MwM2U2NTkxNjI2YjljZGUzMzViOTc0ZjNjZjA0YWUzNGU2MzhiZjg5MTBjOGMmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.DhGAoF-z7EqwYBjdG3iaNobXWcED1ndTwViEEhWvAks)
底层uart_rx+fifo写的行为
![image](https://private-user-images.githubusercontent.com/61445559/311476314-1ae1080d-b0a1-4cc3-9afb-3ae56c925967.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkyMDI4MDIsIm5iZiI6MTczOTIwMjUwMiwicGF0aCI6Ii82MTQ0NTU1OS8zMTE0NzYzMTQtMWFlMTA4MGQtYjBhMS00Y2MzLTlhZmItM2FlNTZjOTI1OTY3LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTAlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjEwVDE1NDgyMlomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTIwNTYzNWFjMjAxYTQ0ZmRlZjg2MmZhNzkxNzJmOTllNjU5ZTg0NDhkNzVmZjI0ZTA2MzM2MjVmYjg4MjIyYTMmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.DxW82h657wYNc-4qObeCI_T_nMoru0Q-5zXdOM6xgp0)
![image](https://private-user-images.githubusercontent.com/61445559/311476338-c6edecc1-92db-4053-8268-a9b4bdd1ebf2.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkyMDI4MDIsIm5iZiI6MTczOTIwMjUwMiwicGF0aCI6Ii82MTQ0NTU1OS8zMTE0NzYzMzgtYzZlZGVjYzEtOTJkYi00MDUzLTgyNjgtYTliNGJkZDFlYmYyLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTAlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjEwVDE1NDgyMlomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTczZTE1ZGI0OGIwNzUxZmUwZDQ3ZTcwZjY4YjlmNzRmNmIwMTIyZjY2MmQzZTM0ZDg1Zjg2ZGJiNWUwODdkYmQmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.YYJek_Q77X4X848ev2cSd0kZpquT7Y2WG_rdbir8QhY)
中层uart_tx+fifo的行为
create_clock -period 20.000 -name clk [get_ports clk]
set_property -dict {PACKAGE_PIN N18 IOSTANDARD LVCMOS33} [get_ports clk]
set_property -dict {PACKAGE_PIN P14 IOSTANDARD LVCMOS33} [get_ports rst_n]
set_property -dict {PACKAGE_PIN G15 IOSTANDARD LVCMOS33} [get_ports sw]
set_property -dict {PACKAGE_PIN A20 IOSTANDARD LVCMOS33} [get_ports full]
set_property -dict {PACKAGE_PIN C20 IOSTANDARD LVCMOS33} [get_ports empty]
set_property -dict {PACKAGE_PIN K16 IOSTANDARD LVCMOS33} [get_ports tx]
set_property -dict {PACKAGE_PIN J16 IOSTANDARD LVCMOS33} [get_ports rx]
![image](https://private-user-images.githubusercontent.com/61445559/311475953-81770216-73f1-4957-9ffb-87d6841fde57.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MzkyMDI4MDIsIm5iZiI6MTczOTIwMjUwMiwicGF0aCI6Ii82MTQ0NTU1OS8zMTE0NzU5NTMtODE3NzAyMTYtNzNmMS00OTU3LTlmZmItODdkNjg0MWZkZTU3LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAyMTAlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMjEwVDE1NDgyMlomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTZkNDY5ODIxMjc4MThiNTI3ZmJlN2IzODViYmNiMjZhMDc3OTA0NDFiNGUwODMxMDdiMDI0Y2VjZjZlODBiM2EmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.OWq1ePhqd2Md3Q4kksezl_n3bzUdCyfv54hxb931tmM)