在quartus平台中使用串口模块的IP,需要使用到platform designer软件来实现。
1、在quartus界面调出IP Catalog界面。
2、在IP catalog中搜索UART,找到RS2323模块,并双击打开,选择合适的路径和存放。
3、使用该模块若不搭建nios软核,则使用streaming。
在右上角电机Block Symbol或者在菜单选择View->Block Symbol打开模块符号。
4、串口配置了波特率,其自动配置的参数与时钟有关,因此需要加入时钟模块,告知系统输入时钟为多少。
操作如下:
5、打开系统连接的界面,为其添加时钟输入模块。
6、在IP搜索栏搜索clock,双击选择的模块添加时钟模块,输入模块。
7、根据板载资源,设置时钟的参考时钟。
8、连接时钟模块和串口模块的clk和reset。
9、点击Generate HDL生成模块。
10、在quartus中添加生成的sys系统。
11、从platform designer生成模块实例将实例拷贝到添加到quartus的顶层文件中,添加写数据和读数据的时序。
这里只测试一下串口发送数据的功能,接收数据的操作基本是一样的。
12、在platform designer查看串口模块发送数据的时序。
同理在这里一样可以查看到接收数据的时序。
需要注意的是,时序中的数据其实是在to_uart_valid信号为1时,数据会被写入。
下面是测试串口发送数据的顶层文件。
module top2(
input wire clk,//50MHz时钟
//rst,//
output reg led, //用于指示
input wire rxd,
output wire txd,
inout dht_io
);
//\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*PROCESS\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
// 复位模块
//\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
reg rst\_n ;
reg \[:\]delay\_cnt;
always@(posedge clk)
begin
if(delay\_cnt>='d35530)begin
delay\_cnt <= delay\_cnt;
rst\_n <= 'b1;
end
else begin
rst\_n <= 'b0;
delay\_cnt <= delay\_cnt + 'b1;
end
end
//指示灯
//assign txd = led;
reg \[:\]cnt;
reg led\_f1,tx\_flag;
always@(posedge clk)
begin
led\_f1 <= led;
tx\_flag <= led &(~led\_f1);
if(cnt >= 'd25000000 - 1)
begin
cnt <= ;
led <=~led;
end
else begin
cnt <= cnt + 'b1 ;
end
end
//--------------------------------------------
localparam s\_s1=;
localparam s\_s2=;
localparam s\_s3=;
localparam s\_s4=;
reg \[:\]send\_data;
reg to\_uart\_valid , to\_uart\_ready;
reg \[:\]send\_st;
reg \[:\]data\_cnt;
always@(posedge clk)
begin
if(!rst\_n)begin
to\_uart\_ready <= 'b0;
to\_uart\_valid <= 'b0;
send\_data <= 'd0;
send\_st<= s\_s1;
data\_cnt <= 'd0;
end
else begin
case(send\_st)
s\_s1:begin//待机
if(tx\_flag)begin
send\_st <= s\_s2;
to\_uart\_valid <= 'b0;
to\_uart\_ready<= 'b0;
data\_cnt <= 'd0;
send\_data <= ;
end
else begin
to\_uart\_valid <= 'b0;
to\_uart\_ready<= 'b0;
end
end
s\_s2:begin
if(data\_cnt <= 'd8-1'b1)begin
to\_uart\_valid <= 'b1;
//to\_uart\_ready <= (data\_cnt >= 8'd5-1)?1'b0:1'b1;
send\_data <= data\_cnt+;
data\_cnt <= data\_cnt + 'b1;
send\_st <= (data\_cnt >= 'd5-1)?s\_s3:s\_s2;
end
end
s\_s3:begin
to\_uart\_valid <= 'b0;
to\_uart\_ready <= 'b1;
send\_st <= s\_s1;
data\_cnt<='d0;
end
default :send\_st <= s\_s1;
endcase
end
end
IP\_UART u0 (
//.rs232\_0\_from\_uart\_ready (<connected-to-rs232\_0\_from\_uart\_ready>), // rs232\_0\_avalon\_data\_receive\_source.ready
//.rs232\_0\_from\_uart\_data (<connected-to-rs232\_0\_from\_uart\_data>), // .data
//.rs232\_0\_from\_uart\_error (<connected-to-rs232\_0\_from\_uart\_error>), // .error
//.rs232\_0\_from\_uart\_valid (<connected-to-rs232\_0\_from\_uart\_valid>), // .valid
.rs232\_0\_to\_uart\_data (send\_data), // rs232\_0\_avalon\_data\_transmit\_sink.data
.rs232\_0\_to\_uart\_error (), // .error
.rs232\_0\_to\_uart\_valid (to\_uart\_valid), // .valid
.rs232\_0\_to\_uart\_ready (), // 这是输入信号 .ready
.rs232\_0\_UART\_RXD (rxd), // rs232\_0\_external\_interface.RXD
.rs232\_0\_UART\_TXD (txd), // .TXD
.clk\_clk (clk), // clk.clk
.reset\_reset\_n (rst\_n) // reset.reset\_n
);
endmodule
手机扫一扫
移动阅读更方便
你可能感兴趣的文章