wangpeng 发表于 2021-12-31 17:13:33

【复旦微FM33LG0系列开发板测评】PGL功能和简析

【复旦微FM33LG0系列开发板测评】PGL功能和简析
原帖地址:【复旦微FM33LG0系列开发板测评】PGL功能和简析 - 国产芯片交流 - 电子工程世界-论坛 (eeworld.com.cn)
1、PGL功能      复旦微FM33LG0相比其他系列独特的性能是PGL,这个功能在FM33LC系列上也没有出现。具体手册中的 解释如下   可编程胶合逻辑(Programmable Glue Logic)是基于查找表(LUT)的简单可编程逻辑,其输入输 出可以连接到芯片引脚、内部信号,实现一些简单的胶合逻辑,在一些应用中可以帮助系统设计减 少PCB上的逻辑器件。 每个LUT包含4个输入,1个输出,1个真值表,可选的同步/滤波电路。用户通过对真值表编程,可 以获得期望的组合逻辑输出表达式。每个输入信号都可以被单独屏蔽。PGL的基本特性如下:⚫ 实现简单胶合逻辑,简化PCB设计⚫ 4个4输入查找表⚫ 可以通过真值表编程实现 AND,NAND,OR,NOR,XOR,NOT等逻辑表达式⚫ 时序同步或滤波⚫ 灵活的LUT输入选择:IO,内部信号,其他LUT输出⚫ 输出可以被连接到IO或其他外设触发具体逻辑图如下就一目了然,http://bbs.eeworld.com.cn/data/attachment/forum/202111/29/163422zzbsyhokfubodxft.png.thumb.jpg
那么实际上就是一个可以查表法实现的逻辑芯片,在NXP中是作为PLC的功能实现的。总共包括了4个上面的单元,http://bbs.eeworld.com.cn/data/attachment/forum/202111/29/163546t8vg838nbaeyd0yp.png.thumb.jpg
不过这个PGL的引脚是不能自定义的,而是已经分配给了固定的引脚http://bbs.eeworld.com.cn/data/attachment/forum/202111/29/163646sg5m5kvxccczs53v.png.thumb.jpg
2、PGL编程说明    在编程的过程中,当使用LUT引脚输入时,需将对应引脚配置为GPIO输入,清除输入的MASK寄存器,并使能LUT。 当使用LUT引脚输出时,需将对应引脚配置为数字功能,并通过数字功能选择寄存器将引脚配置为 LUT输出,然后使能LUT。这功能通常是在GPL_init()的初始化函数中实现,如下范例代码void PGL_Init()
{
    FL_GPIO_InitTypeDef    GPIO_InitStruct = {0};
    FL_PGL_LUT_InitTypeDef lutInit;

    /*PC2、PC3为LUT0输入端口,配置成输入模式*/
    GPIO_InitStruct.pin = FL_GPIO_PIN_2 | FL_GPIO_PIN_3;
    GPIO_InitStruct.mode = FL_GPIO_MODE_INPUT;
    GPIO_InitStruct.outputType = FL_GPIO_OUTPUT_PUSHPULL;
    GPIO_InitStruct.pull = FL_DISABLE;
    GPIO_InitStruct.remapPin = FL_DISABLE;
    FL_GPIO_Init(GPIOC, &GPIO_InitStruct);

    /*PC0为LUT0输出端口,配置成数字模式*/
    GPIO_InitStruct.pin = FL_GPIO_PIN_0;
    GPIO_InitStruct.mode = FL_GPIO_MODE_DIGITAL;
    GPIO_InitStruct.outputType = FL_GPIO_OUTPUT_PUSHPULL;
    GPIO_InitStruct.pull = FL_DISABLE;
    GPIO_InitStruct.remapPin = FL_ENABLE;//数字功能复用
    FL_GPIO_Init(GPIOC, &GPIO_InitStruct);

    /*PGL结构体配置*/
    lutInit.edge                = FL_PGL_LUT_EDGE_NONE;
    lutInit.outMode             = FL_PGL_LUT_OUTPUT_COMBINE_LOGIC;
    lutInit.input3            = FL_PGL_LUT_INPUT_DISABLE;
    lutInit.input2            = FL_PGL_LUT_INPUT_DISABLE;
    lutInit.input1            = FL_PGL_LUT_INPUT_GROUP0;
    lutInit.input0            = FL_PGL_LUT_INPUT_GROUP0;
    FL_PGL_LUT_Init(PGL, FL_PGL_LUT0, &lutInit);

}这个代码是初始化了第一单元LUT0的过程。使用过程中是对真值表的写入和读取,通过输入状态组合查询LUT真值表中的数据,可以获得想要的组合逻辑功能。 每个LUT支持4输入,输入作为地址可以查询到16个输出,LUT本身就是一个4bit地址寻址的存储空 间。寄存器TRUTH保存了16个输出数据,地址对应关系如下表所示。http://bbs.eeworld.com.cn/data/attachment/forum/202111/29/164056c5b0ikz2m8un6z5b.png.thumb.jpg
在输入的部分是LUT 输入:每个LUT有4个输入,每个输入都可以来自于引脚、芯片外设、或其他LUT输出。 通过INSEL寄存器,可以选择LUT输入信号源。LUT 输出:LUT的输出可以连接到引脚、或其他LUT输入。这样的配置还是有一定的灵活性,4组LUT可以级联或者并联起来,实现更复杂的逻辑,或者扩大逻辑输入的位数。
3. 范例代码在官网提供的代码中,有一个PGL的例程,非常简明地实现了上述过程。在主程序中顺次启动时钟和硬件等,然后根据上面的方法,初始化PGL,int main(void)
{
    /* Reset of all peripherals, Initializes the Flash inte**ce and the Systick. */
    /* SHOULD BE KEPT!!! */
    MF_Clock_Init();

    /* Configure the system clock */
    /* SHOULD BE KEPT!!! */
    MF_SystemClock_Config();

    /* Initialize FL Driver Library */
    /* SHOULD BE KEPT!!! */
    FL_Init();

    /* Initialize all configured peripherals */
    /* SHOULD BE KEPT!!! */
    MF_Config_Init();

    UserInit();
    Test_PGL();

    while(1)
    {
      LED0_TOG();
      FL_DelayMs(1000);
    }
}实现测试非常简单,直接对真值表置位,就可以启动PGL的功能,void Test_PGL()
{
    PGL_Init();
    /*真值表配置*/
    FL_PGL_WriteLUTTruthTable(PGL, FL_PGL_LUT0, 0x7);
    /*LUT使能*/
    FL_PGL_EnableLUT(PGL, FL_PGL_LUT0);
}当PGL启动时,根据真值表访问输出,上述真值表置位0x7,换算成二进制是0111,因为只访问后PC2,PC3,作为LUT0-0和LUT0-1输入,那么实际就形成或的输出。具体实现方式可参考下面的例子,http://bbs.eeworld.com.cn/data/attachment/forum/202111/29/165506hhleafuclfxahldz.png.thumb.jpg
在KEIL中编译通过,就可以下载到开发板上执行。更改真值表,就改变了逻辑设置。http://bbs.eeworld.com.cn/data/attachment/forum/202111/29/165625mcvnmirisfap5szc.png.thumb.jpg
相比而言,还是可以实现一些内部逻辑功能,节省一个逻辑元件。
页: [1]
查看完整版本: 【复旦微FM33LG0系列开发板测评】PGL功能和简析