【 FPGA 】总线实现形式之选择器

用选择器的思想来实现总线:

总线从宏观上看是“多写多读”的,但是从微观上来看是“一写多读”,因为系统中的各个部件只能分时使用总线,而无法同时使用。也就是在某一固定时刻,总线是“一写多读”的,只不过通过一写控制电路,我们貌似可以在不同时刻为总线分配不同的驱动源,以达到宏观上的“多写多读”。

下面用FPGA来简单地实现总线:

利用多路选择器的选通特性,可以实现总线的功能,这也是FPGA芯片内部设计总线时最常用的方法,因为FPGA芯片内部有些非常丰富的MUX资源。

原理就是通过MUX的选通特性,通过改变选通信号的值来改变写入总线数据的来源。

下面给出示意代码(Verilog HDL):

功能代码主要分为三个部分:

1、选择器控制信号产生部分,采用抢占式优先级译码器(【 FPGA 】抢占式优先级译码器电路)的思路,根据四个外围器件的请求信号产生多路选择器的选择控制信号。

2、写总线部分,即将选通通道的数据写到总线上。

3、读总线部分,各个外围器件根据自己的情况将总线数据读入器件内部进行运算和处理。

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date:    15:49:08 11/05/2018 
// Design Name: 
// Module Name:    Bus 
// Project Name: 
// Target Devices: 
// Tool versions: 
// Description: 
//
// Dependencies: 
//
// Revision: 
// Revision 0.01 - File Created
// Additional Comments: 
//
//
module Bus(
    input request0,
    input request1,
    input request2,
    input request3,
    input [7:0] device0Out,
    input [7:0] device1Out,
    input [7:0] device2Out,
    input [7:0] device3Out,
    output [7:0] device0In,
    output [7:0] device1In,
    output [7:0] device2In,
    output [7:0] device3In
    );
	
	reg [1:0] sel;
	reg [7:0] bus;
	
	//generate sel
	always@(request0,request1,request2,request3)
	begin
		//Priority decoder
		case({request0,request1,request2,request3})
			4'b0001: sel = 2'b11;
			4'b0010 - 4'b0011: sel = 2'b10;
			4'b0100 - 4'b0111: sel = 2'b01;
			default: sel = 2'b00;
		endcase
	end
	
	//write bus
	always@(sel,device0Out,device1Out,device2Out,device3Out)
	begin
		case(sel)
			2'b00: bus = device0Out;
			2'b01: bus = device1Out;
			2'b10: bus = device2Out;
			2'b11: bus = device3Out;
			default: bus = device0Out;
		endcase
	end
	
	//read bus
	assign device0In = bus;
	assign device1In = bus;
	assign device2In = bus;
	assign device3In = bus;
	

endmodule

给出RTL Schematic:

通过这个图,可以看出实现这个电路的原理。

下面给出Technology Schematic:

看看FPGA内容是通过什么来实现这个电路的呢?

电路图太大了,只能给出部分:

可见,FPGA内部实现具体的电路要实现大量的lUT,由于使用的FPGA型号是Virtex 7系列的某一款,所以内部的LUT是6输入的LUT。

考虑到实际情况,FPGA内部会使用大量的输入、输出缓冲器。

功能仿真就不写了,简单认识下就OK了,不想深究。

 

 

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李锐博恩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值