
FPGA 20 串口收发与存储双口RAM 简易应用系统设计
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-21WFhIWg-1628068337004)(E:/Blog_Template/source/_posts/img/blog_img/fpga/image-20210803172127067.png)]](https://i-blog.csdnimg.cn/blog_migrate/c4dc0a4d9e1970eeef11e3c4327cdd6b.png#pic_center)
主要功能: FPGA 接收到数据后将数据存储在双口 ram 的一段连续空间中,当需要时,按下按键 Key_in,则 FPGA 将 RAM 中存储的数据通过串口发送出去. 另外,使用ROM 以后,即使系统复位,dprom中的数据仍然存在,而不会被清除.
实现(设计)流程:本实验属于系统设计,在基于之前的模块进行模块化设计上,调用了 key_filter、uart_tx、uart_rx、dpram的模块,新加入设计了ctrl 信号控制模块,最终实现,数据的接收和发送。
实验目的 : 使用fpga 的模块化开发流程。fpga系统设计的流程。系统框图设计流程.
在整个系统设计中,对信号控制模块的设计是我们现在所关注的问题:其它的模块在之前设计的时候就已经保证了其各个功能的正确性,同时也了解了改模块的功能及性质。我们要通过CTRL 子模块讲整个系统的信号进行连接和整合,实现系统的连接。
首先:
实现功能
① 通过uart_rx接收数据,存取在dprom中.
为了实现FPGA 接收到数据后将数据存储在双口 ram 的一段连续空间中, 这样就需要设计一个可以实现写地址数据自加的控制逻辑,且其控制信号为串口接收模块输出的 Rx_Done 信号。每来一个 Rx_Done 也就是每接收成功一字节数,地址数进行加一。
② 通过key_in 发送数据,将存dprom 的数据全部发送出去
当按下按键 0, FPGA 将 RAM 中存储的数据通过串口发送出去。 也就是实现按键按下即启动连续读操作,再次按下即可暂停读操 .同时控制uart_tx 将数据循环发送出去。
module CTRL(
Clk,
Rst_n,
Key_flag,
Key_state,
Rx_Done,
Tx_Done,
rdaddress,
wraddress,
wren,
Send_en
);
input Clk ;
input Rst_n;
input Key_flag;
input Key_state;
input Rx_Done;
input Tx_Done;
output reg [7:0]rdaddress;
output reg [7:0]wraddress;
output wren;
output reg Send_en;
reg do_send ;
reg r0_send_done;
reg r1_send_done ;
assign wren = Rx_Done ;
always@(posedge Clk or negedge Rst_n)
if(!Rst_n)
wraddress <= 8'd0 ;
else if(Rx_Done)
wraddress <= wraddress +1'b1 ;
else
wraddress <= wraddress ;
always@(posedge Clk or negedge Rst_n)
if(!Rst_n)
do_send <= 1'd0 ;
else if(Key_flag && !Key_state) //
do_send <= ~do_send ;
always@(posedge Clk or negedge Rst_n)
if(!Rst_n)
rdaddress <= 8'd0 ;
else if(do_send && Tx_Done)
rdaddress <= rdaddress + 8'd1 ;
else
rdaddress <= rdaddress ;
//2级寄存器,两个时钟周期延时
always@(posedge Clk or negedge Rst_n)
if(!Rst_n) begin
r0_send_done <= 1'b0 ;
r1_send_done <= 1'b0 ;
end
else begin
r0_send_done <=(Key_flag && !Key_state);
r1_send_done <=(Key_flag && !Key_state);
end
always@(posedge Clk or negedge Rst_n)
if(!Rst_n)
Send_en <= 1'b0 ;
else if(Key_flag && !Key_state)
Send_en <= 1'b1 ;
else if(r1_send_done)
Send_en <= 1'b1 ;
else
Send_en <= 1'b0 ;
endmodule

387

被折叠的 条评论
为什么被折叠?



