FPGA 20 串口收发与存储双口RAM 简易应用系统设计

在这里插入图片描述

FPGA 20 串口收发与存储双口RAM 简易应用系统设计

FPGA 20 串口收发与存储双口RAM 简易应用系统设计_第1张图片

主要功能: 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


你可能感兴趣的:(FPGA)