3854|0

425

帖子

4

TA的资源

纯净的硅(初级)

楼主
 

【复旦微FM33LG0系列开发板测评】PGL功能和简析 [复制链接]

  本帖最后由 北方 于 2021-11-29 16:56 编辑

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或其他外设触发

具体逻辑图如下就一目了然,

那么实际上就是一个可以查表法实现的逻辑芯片,在NXP中是作为PLC的功能实现的。

总共包括了4个上面的单元,

不过这个PGL的引脚是不能自定义的,而是已经分配给了固定的引脚

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[15:0]保存了16个输出数据,地址对应关系如下表所示。

在输入的部分是LUT 输入:

每个LUT有4个输入,每个输入都可以来自于引脚、芯片外设、或其他LUT输出。 通过INSEL寄存器,可以选择LUT输入信号源。

LUT 输出:

LUT的输出可以连接到引脚、或其他LUT输入。

这样的配置还是有一定的灵活性,4组LUT可以级联或者并联起来,实现更复杂的逻辑,或者扩大逻辑输入的位数。

 

3. 范例代码

在官网提供的代码中,有一个PGL的例程,非常简明地实现了上述过程。

在主程序中顺次启动时钟和硬件等,然后根据上面的方法,初始化PGL,

int main(void)
{
    /* Reset of all peripherals, Initializes the Flash interface 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输入,那么实际就形成或的输出。

具体实现方式可参考下面的例子,

在KEIL中编译通过,就可以下载到开发板上执行。

更改真值表,就改变了逻辑设置。

相比而言,还是可以实现一些内部逻辑功能,节省一个逻辑元件。

点赞 关注(1)
 
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表