2017.10.31

2017.10.31 距 NOIp2017 还剩 10 天

祝贺LOI第五届羽毛球大赛取得圆满成功qwq✿✿ヽ(°▽°)ノ✿
LOIer—>RP++
话说今天赢的都是学姐—>“学姐”&&学姐


对于 引水入城 这个题,我想说……
BFS+贪心,两种情况分开能过合起来只输出1 0是什么意思???
还是要耐着性子做下去,终于,功夫不负有心人,啦啦啦(~ ̄▽ ̄~)


凡事都不要急,心急吃不了热豆腐,慢慢来总归是会有收获的


水图日常.jpg
不知不觉中,noip就只剩下10天了
这里写图片描述
而我
这里写图片描述
自己调试造样例,明明是自己推错了答案,还奋笔疾书地又造数据&&改程序
这里写图片描述
内心充满了找出bug的激动
这里写图片描述
然而……只想对自己说
这里写图片描述

最后,重拾信心,奋起直追,努力拼搏,顽强奋斗,2017noip加油ヾ(◍°∇°◍)ノ゙
这里写图片描述

大家晚安喽~~~这里写图片描述

<think>我们正在讨论Vivado 2017.2中的硬件描述原语。对于多位数据进行二选一,通常可以使用MUX(多路复用器)原语。在Vivado中,有一个原语叫做MUXF7和MUXF8,但它们主要用于查找表(LUT)的级联,通常用于逻辑设计中的路由选择,而不是直接用于多位数据选择。 然而,对于一般的多位数据选择,我们通常使用一个多路复用器,其选择信号控制选择两个输入中的哪一个作为输出。在Verilog中,我们可以使用条件运算符(?:)或case语句来实现,但如果我们想使用原语,我们可以实例化一个LUT来实现,但LUT通常用于较少的位数(比如6输入1输出)。 实际上,对于多位数据(比如N位),我们可以使用N个MUX2原语(2选1多路复用器)并行连接,每个位对应一个2选1选择器。在Vivado的原语库中,有一个叫做MUXCY的原语(用于进位链的MUX)通常用于1位选择,而LUT6_2可以配置为2选1MUX,但更通用的做法是使用多个1位的2选1MUX。 但是,Vivado并没有直接提供一个多位宽度的2选1MUX原语。通常,我们使用RTL描述(如Verilog)来让综合器推断出多路复用器。例如: ```verilog module mux2 #(parameter WIDTH=32) ( input [WIDTH-1:0] a, input [WIDTH-1:0] b, input sel, output [WIDTH-1:0] out ); assign out = sel ? b : a; endmodule ``` 综合器会根据宽度自动推断出多个2选1MUX。 如果一定要使用原语,我们可以实例化多个1位的2选1MUX。在Vivado中,有一个原语叫做MUXF7(用于7系列FPGA)和MUXF8,但它们是用于特定用途的(将两个LUT的输出组合起来),并且只能处理1位信号。因此,对于多位数据,我们通常不会使用这些原语。 在Vivado中,更底层的原语是LUT,我们可以配置一个LUT作为2选1MUX,例如LUT6_2可以配置为两个独立的5输入LUT或一个6输入LUT,也可以配置为2选1MUX(使用O5和O6输出)。但是,对于多位数据,我们需要多个这样的LUT。 因此,总结来说,在Vivado 2017.2中,没有直接的多位二选一原语,通常使用RTL描述让工具综合,或者使用多个1位的2选1MUX原语(如MUXF7,但注意MUXF7通常用于连接相邻的LUT,不推荐用于一般的数据选择)来实现。更常见的是使用RTL描述。 但是,如果我们确实需要实例化原语,我们可以使用多个LUT6_2配置为2选1MUX,或者使用多个MUXCY(如果数据宽度较小,且需要利用进位链实现快速选择,但通常用于加法器等)。 实际上,对于多位数据选择,综合器会将其映射到FPGA的LUT资源上,而LUT本质上可以配置为任何组合逻辑,包括多路复用器。 因此,建议使用RTL描述,让Vivado综合器自动推断。 但是,如果问题要求必须使用原语,那么我们可以这样考虑:对于每一位,我们可以使用一个LUT6_2原语配置为2选1MUX。例如,一个2选1MUX的逻辑方程是:O = (S? I1: I0)。这可以用一个2输入的LUT实现(实际上只需要一个LUT2)。在Vivado中,我们可以实例化LUT2原语,但更常用的是LUT6,因为FPGA中的LUT是6输入的。我们可以使用LUT6,但只使用其中的两个输入(I0和I1),并将其他输入接地,函数初始化为实现2选1MUX的真值表。 然而,Vivado提供了更直接的原语:MUXF7和MUXF8,但它们只能用于连接两个LUT的输出(因此是1位信号),并且通常用于构建更大的MUX(比如4:1, 8:1)时级联使用。所以,它们不适合直接用于多位数据选择。 因此,对于多位数据选择,我们通常不使用特定的原语,而是使用RTL描述。 但是,为了回答这个问题,我们可以说:在Vivado 2017.2中,没有专门用于多位数据二选一的原语。通常,我们使用RTL描述。如果一定要使用原语,我们可以为每一位实例化一个2选1MUX,例如使用LUT2原语(如果宽度不大)或者使用多个MUXF7(但MUXF7并不是为此设计的,所以不推荐)。 所以,最接近的原语可能是使用多个LUT2,但LUT2并不是一个单独的原语,而是LUT6的一个特例。我们可以使用LUT6,并设置其初始值来实现2选1MUX。 例如,一个2选1MUX的真值表是: 当S=0时,O=I0; 当S=1时,O=I1。 因此,我们可以用LUT6(实际上只需要2输入)来实现,其初始值设置为64'hFF00FF00FF00FF00(当S接在I5上,I0和I1分别接在输入上时,这样设置并不正确,需要根据实际连接调整)。实际上,更简单的是使用两个输入(比如I0和I1)和选择信号S(接在I2上),然后设置初始值使得当I2=0时输出I0,当I2=1时输出I1。那么真值表是: 输入I2, I1, I0(其他输入不用,设为0): 000 -> 0 001 -> 0 010 -> 0 011 -> 1 100 -> 0 101 -> 1 110 -> 0 111 -> 1 但实际上,我们只需要两个输入(I0和I1)和一个选择信号(S),所以我们可以将S接到LUT的I0,I0(数据)接到I1,I1(数据)接到I2,然后设置初始值。这样比较混乱。 另一种方法是使用LUT6_2,它可以配置为两个输出。我们可以用其中一个输出实现2选1MUX。具体设置INIT值来实现函数:O = (I0? I2: I1) 或者类似。但这样需要仔细计算INIT。 因此,考虑到这些复杂性,通常我们不会这样做,而是使用RTL描述。 所以,回答是:在Vivado 2017.2中,没有专门的多位二选一原语。推荐使用RTL描述(如Verilog中的条件运算符)来实现多位数据的二选一,由综合器自动推断出最优的硬件结构。 但是,如果用户坚持要使用原语,我们可以使用多个LUT6_2原语,每个LUT6_2配置为一位的2选1MUX。例如: ```verilog // 示例:使用LUT6_2原语实现1位的2选1MUX // 函数:O = sel ? b : a // 将sel接到I0,a接到I1,b接到I2 // 那么,当sel=0时,输出a(即I1);当sel=1时,输出b(即I2) // 真值表:sel, a, b 作为输入(其他输入不用,可以接地) // 输出函数:O = (I0 & I2) | (~I0 & I1) 即:O = (sel? b: a) // 对应的INIT值需要根据输入组合计算。LUT6_2有6个输入,我们只用了3个(I0,I1,I2),所以INIT是一个64位的十六进制数。 // 我们可以这样计算:当I0=0时,输出I1;当I0=1时,输出I2。所以: // 地址0-31(I0=0)时,输出由I1决定(忽略I2,因为I0=0时不管I2是什么,都输出I1)?但实际上,在I0=0时,我们只关心I1,所以输出等于I1。在I0=1时,输出等于I2。 // 所以,INIT的值应该是:当I0=0时,输出等于I1,而I1可以是0或1,所以地址的低32位(I0=0)中,每两位重复:00->0, 01->0, 10->1, 11->1? 不对,因为地址是6位,但我们只关心I1(在I0=0时,地址的第1位是I1,其他位忽略?)但LUT的输出是所有输入的函数,所以我们必须指定所有输入组合下的输出。 // 实际上,我们可以这样:将不用的输入设为0,然后只考虑I0,I1,I2。那么,地址的构成是:{A5,A4,A3,A2,A1,A0},其中A0=I0,A1=I1,A2=I2,其他接地(A3=A4=A5=0)。所以实际有效的地址是0-7(因为A5,A4,A3=0)。 // 地址0: {A5=0,A4=0,A3=0,A2=0,A1=0,A0=0} -> I0=0, I1=0, I2=0 -> 输出0(因为sel=0,选a=0) // 地址1: {0,0,0,0,0,1} -> I0=1, I1=0, I2=0 -> 输出0(因为sel=1,选b=0) // 地址2: {0,0,0,0,1,0} -> I0=0, I1=1, I2=0 -> 输出1(因为sel=0,选a=1) // 地址3: {0,0,0,0,1,1} -> I0=1, I1=1, I2=0 -> 输出0(因为sel=1,选b=0) // 地址4: {0,0,0,1,0,0} -> I0=0, I1=0, I2=1 -> 输出0 // 地址5: {0,0,0,1,0,1} -> I0=1, I1=0, I2=1 -> 输出1 // 地址6: {0,0,0,1,1,0} -> I0=0, I1=1, I2=1 -> 输出1 // 地址7: {0,0,0,1,1,1} -> I0=1, I1=1, I2=1 -> 输出1 // 所以,INIT值的前8位(二进制从低到高对应地址0到7)是:00010111(二进制)-> 0x17(十六进制),但注意LUT的INIT值是64位,所以我们需要将低8位设为0x17,其余位设为0(因为当A3,A4,A5不为0时,我们不考虑,但为了安全可以设为0,或者设为与低8位相同?但通常将不用的输入设为0,所以高地址都是0)。因此,INIT=64'h0000000000000017。 // 在LUT6_2中,我们可以使用O6输出,并将这个INIT值赋给这个LUT。 // 但是,这种方法非常繁琐,而且对于多位数据,我们需要实例化多个这样的LUT。 因此,除非有特殊原因(例如需要精确控制布局布线),否则不推荐使用原语。 综上所述,对于多位数据进行二选一,在Vivado 2017.2中,我们通常使用RTL描述,而不是原语。 所以,回答如下:</think>在 Vivado 2017.2 中,实现多位数据(如总线)的二选一操作,**没有直接的多位宽原语**。FPGA 设计通常采用以下两种方法实现: ### 推荐方法:RTL 描述(让综合器自动推断) 使用 Verilog 的条件运算符或 `case` 语句,Vivado 会自动综合为 LUT 或 MUXF7/MUXF8 级联结构: ```verilog // 示例:32 位总线二选一 module mux_2to1 #(parameter WIDTH=32) ( input [WIDTH-1:0] data0, data1, input sel, output [WIDTH-1:0] out ); assign out = sel ? data1 : data0; // 关键代码 endmodule ``` - ✅ **优势**:自动适配位宽,综合器优化效率高 - ⚠️ 注意:Vivado 会将其映射为底层 LUT 资源(每个 bit 一个 LUT6) ### 底层原语方案(仅限单 bit) 若需手动控制布线,可对**每一位信号**单独实例化 Xilinx 原语: 1. **MUXF7**:用于连接两个 LUT6 的输出(1-bit 选择) ```verilog MUXF7 mux_inst (.O(out_bit), .I0(data0_bit), .I1(data1_bit), .S(sel)); ``` 2. **LUT6 配置为 MUX**:通过 INIT 参数实现 2:1 MUX ```verilog LUT6 #( .INIT(64'hFF00F0F0CCCCAAAA) // 真值表配置 ) lut_mux ( .O(out_bit), .I0(sel), // 选择信号 .I1(data0_bit), .I2(data1_bit), .I3(1'b0), // 未用输入接地 .I4(1'b0), .I5(1'b0) ); ``` - ❗ **限制**:原语仅支持 1-bit 操作,多位数据需重复实例化,效率低下 ### 关键结论 - **最佳实践**:始终使用 RTL 描述 (`assign out = sel ? data1 : data0`),避免手动实例化原语 - **原语适用场景**:仅当需要精确控制关键路径(如时钟域交叉)的单 bit 信号时 - **性能说明**:现代 Vivado 对 RTL 描述的综合优化效果优于手动原语方案
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值