我正在玩cliffordwolf/picorv32,在理解picosoc
(link to source)中的以下代码段时遇到了一些问题:
SB_IO #(
.PIN_TYPE(6'b 1010_01),
.PULLUP(1'b 0)
) flash_io_buf [3:0] (
.PACKAGE_PIN({flash_io3, flash_io2, flash_io1, flash_io0}),
.OUTPUT_ENABLE({flash_io3_oe, flash_io2_oe, flash_io1_oe, flash_io0_oe}),
.D_OUT_0({flash_io3_do, flash_io2_do, flash_io1_do, flash_io0_do}),
.D_IN_0({flash_io3_di, flash_io2_di, flash_io1_di, flash_io0_di})
);
我在Lattice iCE40 technology library documentation中找到了SB_IO
原语的图形描述,但是我仍然无法理解其目的,因为它太复杂了,我无法解释。关于原语,有another question的内容,在阅读后我会认为它会创建某种双向连接,但是我无法理解这与使输出引脚“处于三态”有何关系。
我希望对这种特定配置下SB_IO
单元的效果进行高级描述。哪个引脚连接到哪个引脚?哪些是输入,哪些是输出?实例化此单元格的目的是什么?
答案 0 :(得分:3)
之所以使用此实例,是因为当时Yosys在Verilog中还不够好地支持三态,但现在已经支持了,但是通常不总是信任FPGA工具链中的三态。
可以将其替换为以下通用Verilog,从0到4重复4次。
assign flash_io0 = flash_io0_oe ? flash_io0_do : 1'bz;
assign flash_io0_di = flash_io0;