FPGA project: uart_rs485

news2024/9/25 17:13:25

 没有设计rs485的顶层,因为我的另一块板子没有TTL信号转差分信号的芯片:MAX3485CSA

module ctrl(
    input       wire                sys_clk     ,
    input       wire                sys_rst_n   ,
    input       wire                key_w       ,
    input       wire                key_b       ,

    output      wire        [7:0]   po_data     , // 由于w_en 与b_en 使能信号是reg型,虽然po_data是时序逻辑,但是相对于按键按下信号,仍然要延后一个时钟周期。
    output      reg                 po_flag       // 所以po_data 应该用reg
);
    reg  w_en ;
    reg  b_en ;
    always @(posedge sys_clk or negedge sys_rst_n) begin
        if(~sys_rst_n) begin
            w_en <= 1'b0 ;
        end else begin
            if(key_w == 1'b1) begin
                w_en <= ~w_en ;
            end else begin
                if(key_b == 1'b1) begin
                    w_en <= 1'b0 ;
                end else begin
                    w_en <= w_en ;
                end
            end
        end 
    end
    // b_en
    always @(posedge sys_clk or negedge sys_rst_n) begin
        if(~sys_rst_n) begin
            b_en <= 1'b0 ;
        end else begin
            if(key_b == 1'b1) begin
                b_en <= ~b_en ;
            end else begin
                if(key_w == 1'b1) begin
                    b_en <= 1'b0 ;
                end else begin
                    b_en <= b_en ;
                end
            end
        end 
    end

    // [7:0]   po_data     ,
    assign po_data = {6'd0,w_en,b_en} ;
    //         po_flag   
    always @(posedge sys_clk or negedge sys_rst_n) begin
        if(~sys_rst_n) begin
            po_flag <= 1'b0 ;
        end else begin
            po_flag <= key_b || key_w ;
        end
    end 
endmodule
`timescale 1ns/1ns
module test_ctrl();
    reg                   sys_clk     ;
    reg                   sys_rst_n   ;
    reg                   key_w       ;
    reg                   key_b       ;

    wire        [7:0]     po_data     ;
    wire                  po_flag     ;

ctrl ctrl_insert(
    .sys_clk            ( sys_clk   )   ,
    .sys_rst_n          ( sys_rst_n )   ,
    .key_w              ( key_w     )   ,
    .key_b              ( key_b     )   ,

    .po_data            ( po_data   )   ,
    .po_flag            ( po_flag   )     
);
    parameter CYCLE = 20 ;

    initial begin
        sys_clk    = 1'b1 ;
        sys_rst_n <= 1'b0 ;
        key_w     <= 1'b0 ;
        key_b     <= 1'b0 ;
        #( CYCLE * 10 )   ;
        sys_rst_n <= 1'b1 ;
        #( 210 )          ;
        sys_rst_n <= 1'b0 ;
        #( 10 )           ;
        #( CYCLE * 10 )   ;
        sys_rst_n <= 1'b1 ;
        #( CYCLE * 100  ) ;

        key_w     <= 1'b1 ;
        #( CYCLE )        ;
        key_w     <= 1'b0 ;
        #( CYCLE * 500)   ;

        key_b     <= 1'b1 ;
        #( CYCLE )        ;
        key_b     <= 1'b0 ;
        #( CYCLE * 500)   ;

        key_w     <= 1'b1 ;
        #( CYCLE )        ;
        key_w     <= 1'b0 ;
        #( CYCLE * 500)   ;

        key_b     <= 1'b1 ;
        #( CYCLE )        ;
        key_b     <= 1'b0 ;
        #( CYCLE * 500)   ;
        
        key_w     <= 1'b1 ;
        #( CYCLE )        ;
        key_w     <= 1'b0 ;
        #( CYCLE * 500)   ;

        key_w     <= 1'b1 ;
        #( CYCLE )        ;
        key_w     <= 1'b0 ;
        #( CYCLE * 500)   ;

        $stop             ;
    end

    always #( CYCLE / 2 ) sys_clk = ~sys_clk ;


endmodule
module be_ctrl(
    input       wire                sys_clk     ,
    input       wire                sys_rst_n   ,
    // input       wire                key_w       , // 作为被控制板模块的ctrl 一些端口信号用不到的。
    // input       wire                key_b       ,
    input       wire        [7:0]   pi_data     , 
    input       wire                pi_flag     , 
    input       wire        [3:0]   led_w       , 
    input       wire        [3:0]   led_b       , 

    // output      wire        [7:0]   po_data     ,
    // output      wire                po_flag     
    output      reg         [3:0]   led_out       // 也可以用组合逻辑
);
    reg  w_en ;
    reg  b_en ;
    always @(posedge sys_clk or negedge sys_rst_n) begin
        if(~sys_rst_n) begin
            w_en <= 1'b0 ;
        end else begin
            if(pi_data[1]) begin
                w_en <= ~w_en ;
            end else begin
                if(pi_data[0]) begin
                    w_en <= 1'b0 ;
                end else begin
                    w_en <= w_en ;
                end
            end
        end 
    end
    // b_en
    always @(posedge sys_clk or negedge sys_rst_n) begin
        if(~sys_rst_n) begin
            b_en <= 1'b0 ;
        end else begin
            if(pi_data[0]) begin
                b_en <= ~b_en ;
            end else begin
                if(pi_data[1]) begin
                    b_en <= 1'b0 ;
                end else begin
                    b_en <= b_en ;
                end
            end
        end 
    end

    // [3:0]   led_out 
    always @(posedge sys_clk or negedge sys_rst_n) begin
        if(~sys_rst_n) begin
            led_out <= 3'd0 ;
        end else begin
            if(w_en == 1'b1) begin
                led_out <= led_w;
            end else begin
                if(b_en == 1'b1) begin
                    led_out <= led_b;
                end else begin
                    led_out <= led_out ;
                end
            end 
        end
    end
endmodule

`timescale 1ns/1ns
module test_be_ctrl();
    reg                   sys_clk     ;
    reg                   sys_rst_n   ;
    reg         [7:0]     pi_data_w   ;
    reg                   pi_flag_w   ;

    wire        [3:0]     led_out     ;

    
    // 由例化的模块产生
    wire        [3:0]     led_w_w       ;
    wire        [3:0]     led_b_w       ;

water_led  
#(
    .MAX_CNT                ( 25'd25_0) // 00_000 
)water_led_insert
(
    .sys_clk                ( sys_clk    ) ,
    .sys_rst_n              ( sys_rst_n  ) ,

    .led                    ( led_w_w )
);
breath_led 
#(
    .CNT_1US            ( 5          )  ,
    .CNT_1K             ( 10         ) 
)breath_led_insert
(
    .sys_clk            ( sys_clk    )  ,
    .sys_rst_n          ( sys_rst_n  )  ,

    .led_out_1          ( led_b_w[0] )  ,
    .led_out_2          ( led_b_w[1] )  ,
    .led_out_3          ( led_b_w[2] )  ,
    .led_out_4          ( led_b_w[3] )   
);

be_ctrl be_ctrl_insert(
    .sys_clk            ( sys_clk   ) ,
    .sys_rst_n          ( sys_rst_n ) ,
    .pi_data            ( pi_data_w ) , 
    .pi_flag            ( pi_flag_w ) , 
    .led_w              ( led_w_w   ) , 
    .led_b              ( led_b_w   ) , 

    .led_out            ( led_out   )     
);
    parameter CYCLE = 20 ;

    initial begin
        sys_clk    = 1'b1 ;
        sys_rst_n <= 1'b0 ;
        pi_data_w <= 8'd0 ;
        pi_flag_w <= 1'b0 ;
        #( CYCLE * 10 )   ;
        sys_rst_n <= 1'b1 ;
        #( 210 )          ;
        sys_rst_n <= 1'b0 ;
        #( 10 )           ;
        #( CYCLE * 10 )   ;
        sys_rst_n <= 1'b1 ; // 复位释放。
        #( 50 * CYCLE)    ;
        pi_data_w <= 8'd1 ; // 呼吸灯控制按键按下
        pi_flag_w <= 1'b1 ;
        #( CYCLE )        ;
        pi_data_w <= 8'd0 ;
        pi_flag_w <= 1'b0 ;
        #( CYCLE * 500 )  ;

        pi_data_w <= 8'd1 ; // 呼吸灯控制按键按下
        pi_flag_w <= 1'b1 ;
        #( CYCLE )        ;
        pi_data_w <= 8'd0 ;
        pi_flag_w <= 1'b0 ;
        #( CYCLE * 500 )  ;

        pi_data_w <= 8'd2 ; // 流水灯控制按键按下
        pi_flag_w <= 1'b1 ;
        #( CYCLE )        ;
        pi_data_w <= 8'd0 ;
        pi_flag_w <= 1'b0 ;
        #( CYCLE * 500 )  ;
        
        pi_data_w <= 8'd1 ; // 呼吸灯控制按键按下
        pi_flag_w <= 1'b1 ;
        #( CYCLE )        ;
        pi_data_w <= 8'd0 ;
        pi_flag_w <= 1'b0 ;
        #( CYCLE * 500 )  ;
        $stop ;
    end

    always #( CYCLE / 2 ) sys_clk = ~sys_clk ;


endmodule
流水灯模块与呼吸灯模块是之前工程里的。
module rs_485_tx (
    input       wire            sys_clk   ,
    input       wire            sys_rst_n ,
    input       wire   [7:0]    pi_data   ,
    input       wire            pi_flag   ,

    output      reg             tx        ,
    output      reg             re         
);

    // reg signal define
    reg             pi_flag_r   ;
    reg     [7:0]   pi_data_r   ;
    reg             work_en     ;
    reg     [12:00] baud_cnt    ;
    reg             bit_flag    ;
    reg     [ 3: 0] bit_cnt     ;
    // pi_flag_r     ;
    always @(posedge sys_clk or negedge sys_rst_n) begin
        if(~sys_rst_n) begin
            pi_flag_r <= 1'b0 ;
        end else begin
            if(pi_flag == 1'b1) begin
                pi_flag_r <= 1'b1 ;
            end else begin
                pi_flag_r <= 1'b0 ;
            end
        end
    end
    // [7:0] pi_data_r   ;
    always @(posedge sys_clk or negedge sys_rst_n) begin
        if(~sys_rst_n) begin
            pi_data_r <= 1'b0 ;
        end else begin
            if(pi_flag == 1'b1) begin
                pi_data_r <= pi_data ;
            end else begin
                pi_data_r <= pi_data_r ;
            end
        end
    end
    //        work_en      ;
    always @(posedge sys_clk or negedge sys_rst_n) begin
        if(~sys_rst_n) begin
            work_en <= 1'b0 ;
        end else begin
            if(baud_cnt == 13'd5027 && bit_cnt == 4'd9) begin
                work_en <= 1'b0 ;
            end else begin
                if(pi_flag_r == 1'b1) begin
                    work_en <= 1'b1 ;
                end else begin
                    work_en <= work_en ;
                end
            end
        end
    end
    // [12:00] baud_cnt    ;
    always @(posedge sys_clk or negedge sys_rst_n) begin
        if(~sys_rst_n) begin
            baud_cnt <= 13'd0 ;
        end else begin
            if(work_en == 1'b1 && baud_cnt == 13'd5027 || work_en == 1'b0) begin
                baud_cnt <= 13'd0 ;
            end else begin
                if(work_en == 1'b1) begin
                    baud_cnt <= baud_cnt + 1'b1 ;
                end else begin
                    baud_cnt <= 13'd0 ;
                end
            end
        end
    end
    //         bit_flag    ;
    always @(posedge sys_clk or negedge sys_rst_n) begin
        if(~sys_rst_n) begin
            bit_flag <= 1'b0 ;
        end else begin
            if(baud_cnt == 13'd5026) begin // 野火上是等于 1 .
                bit_flag <= 1'b1 ;
            end else begin
                bit_flag <= 1'b0 ;
            end
        end
    end
    // [ 3: 0] bit_cnt     ;
    always @(posedge sys_clk or negedge sys_rst_n) begin
        if(~sys_rst_n) begin
            bit_cnt <= 4'd0 ;
        end else begin
            if(bit_flag == 1'b1 && bit_cnt == 4'd9 || work_en == 1'b0) begin
                bit_cnt <= 4'd0 ;
            end else begin
                if(bit_flag == 1'b1) begin
                    bit_cnt <= bit_cnt + 1'b1 ;
                end else begin
                    bit_cnt <= bit_cnt ;
                end
            end
        end
    end

    // output signal
    // tx
    always @(posedge sys_clk or negedge sys_rst_n) begin
        if(~sys_rst_n) begin
            tx <= 1'b1 ;
        end else begin
            if(work_en == 1'b1 && bit_cnt == 4'd0) begin
                tx <= 1'b0 ;
            end else begin
                if(work_en == 1'b1 && bit_cnt == 4'd9 || work_en == 1'b0) begin
                    tx <= 1'b1 ;
                end else begin
                    tx <= pi_data_r[bit_cnt - 1'b1] ;
                end
            end
        end
    end
    // re
    always @(posedge sys_clk or negedge sys_rst_n) begin
        if(~sys_rst_n) begin
            re <= 1'b0 ;
        end else begin
            re <= work_en ;
        end
    end
endmodule
`timescale 1ns/1ns
module test_rs_485_tx();
    reg             sys_clk   ;
    reg             sys_rst_n ;
    reg    [7:0]    pi_data   ;
    reg             pi_flag   ;

    wire            tx        ;
    wire            re        ;


rs_485_tx rs_485_tx_insert(
    .sys_clk        ( sys_clk   ) ,
    .sys_rst_n      ( sys_rst_n ) ,
    .pi_data        ( pi_data   ) ,
    .pi_flag        ( pi_flag   ) ,

    .tx             ( tx        ) ,
    .re             ( re        )  
);
    parameter CYCLE = 20 ;

    initial begin
        sys_clk    = 1'b1 ;
        sys_rst_n <= 1'b0 ;
        pi_data <= 8'd0 ;
        pi_flag <= 1'b0 ;
        #( CYCLE * 10 )   ;
        sys_rst_n <= 1'b1 ;
        #( 210 )          ;
        sys_rst_n <= 1'b0 ;
        #( 10 )           ;
        #( CYCLE * 10 )   ;
        sys_rst_n <= 1'b1 ; // 复位释放。
        #( 50 * CYCLE)    ;
        pi_data <= 8'd1 ; // 呼吸灯控制按键按下
        pi_flag <= 1'b1 ;
        #( CYCLE )        ;
        pi_data <= 8'd0 ;
        pi_flag <= 1'b0 ;
        #( CYCLE * 96100 )  ;

        pi_data <= 8'd1 ; // 呼吸灯控制按键按下
        pi_flag <= 1'b1 ;
        #( CYCLE )        ;
        pi_data <= 8'd0 ;
        pi_flag <= 1'b0 ;
        #( CYCLE * 96100 )  ;

        pi_data <= 8'd2 ; // 流水灯控制按键按下
        pi_flag <= 1'b1 ;
        #( CYCLE )        ;
        pi_data <= 8'd0 ;
        pi_flag <= 1'b0 ;
        #( CYCLE * 96100 )  ;
        
        pi_data <= 8'd1 ; // 呼吸灯控制按键按下
        pi_flag <= 1'b1 ;
        #( CYCLE )        ;
        pi_data <= 8'd0 ;
        pi_flag <= 1'b0 ;
         #( CYCLE * 96100 )  ;
        $stop ;
    end

    always #( CYCLE / 2 ) sys_clk = ~sys_clk ;


endmodule

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1013956.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何使用 RunwayML 进行创意 AI 创作

标题&#xff1a;如何使用 RunwayML 进行创意 AI 创作 介绍 RunwayML 是一个基于浏览器的人工智能创作工具&#xff0c;可让用户使用各种 AI 功能来生成图像、视频、音乐、文字和其他创意内容。RunwayML 的功能包括&#xff1a; * 图像生成&#xff1a;使用生成式对抗网络 (…

零基础也能快速上手活动海报设计

在现代社会中&#xff0c;活动海报设计已经成为推广活动、宣传信息的重要手段之一。然而&#xff0c;对于大部分人来说&#xff0c;设计一张漂亮的海报可能会觉得困难重重。不过&#xff0c;不用担心&#xff01;现在有了乔拓云&#xff0c;零基础的你也能轻松上手活动海报设计…

GraphBase基础原理

一、GraphBase简介 互联网时代&#xff0c;随着网络技术的发展&#xff0c;企业积累的数据越来越多。伴随着数据集的不断增加&#xff0c;传统的关系型数据库查询性能会随之变差&#xff0c;特别是针对一些特殊的业务场景&#xff0c;所以迫切的需要一种新的解决方案去应对这种…

[腾讯云 Cloud Studio 实战训练营] 云上编程的革命:我的 Cloud Studio 体验之旅

文章目录 1. 无缝的云端体验1.1 云端工作站的魅力1.2 真正的在线编程1.3 强大的协作能力1.4 多平台兼容性1.5 安全和数据备份1.6 持续更新和维护1.7 灵活的资源扩展 2. 功能强大的在线 IDE2.1 基础功能全覆盖2.2 高级功能支持2.3 多语言支持2.4 自定义工作流程2.5 版本控制和协…

单元格法近似求解多边形最大内接矩形问题【思路讲解+java实现】

文章目录 问题描述问题解决方案多边形网格化区分每个单元格是在多边形内部还是外部根据已标记单元格寻找最大内接矩形剪枝优化多角度旋转 案例测试代码实现说明 问题描述 给定一个多边形的点集&#xff0c;希望找出多边形内部面积最大的矩形。该问题可能出现在&#xff0c;从一…

Linux命令200例:cu是用于设置与终端设备通信的工具

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;CSDN领军人物&#xff0c;全栈领域优质创作者✌。CSDN专家博主&#xff0c;阿里云社区专家博主&#xff0c;2023年6月csdn上海赛道top4。 &#x1f3c6;数年电商行业从业经验&#xff0c;历任核心研发工程师&#xff0…

Netsh命令修复DNS无法上网问题

关注【潇湘信安】、【Hack分享吧】公众号&#xff0c;一起学网络安全知识&#xff01; 0x01 问题描述 今早打开电脑后突然发现上不了网了&#xff0c;TIM可以正常登录&#xff0c;浏览器打不开网页&#xff0c;出现这样情况一般都是DNS的问题&#xff0c;用ipconfig /all命令查…

Kotlin文件遍历FileTreeWalk filter

Kotlin文件遍历FileTreeWalk filter import java.io.Filefun main(args: Array<String>) {val filePath "."val file File(filePath)val fileTree: FileTreeWalk file.walk()fileTree//.maxDepth(1) //遍历层级1&#xff0c;不检查子目录.filter {it.isFile…

【Java 基础篇】深入理解Java集合嵌套:构建和管理复杂数据结构的终极指南

当我们谈论集合嵌套时&#xff0c;我们指的是在一个集合中存储另一个集合&#xff0c;或者说集合中的元素本身也是集合。这是一个非常有用的概念&#xff0c;可以在处理复杂数据结构时提供更灵活的选项。在本文中&#xff0c;我们将深入探讨Java中集合嵌套的概念、用法以及一些…

Jenkins 编译 Maven 项目提示错误 version 17

在最近使用集成工具的时候&#xff0c;对项目进行编译提示下面的错误信息&#xff1a; maven-compiler-plugin:3.11.0:compile (default-compile) on project mq-service: Fatal error compiling: error: release version 17 not supported 问题和解决 上面提示的错误信息原…

Llama.cpp工具main使用手册

Llama.cpp提供的 main工具允许你以简单有效的方式使用各种 LLaMA 语言模型。 它专门设计用于与 llama.cpp 项目配合使用。 推荐&#xff1a;用 NSDT编辑器 快速搭建可编程3D场景 Llama.cpp的工具 main提供简单的 C/C 实现&#xff0c;具有可选的 4 位量化支持&#xff0c;可实现…

C++之默认与自定义构造函数问题(二百一十七)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

linux学习实操计划0201-安装zotero的种种问题

本系列内容全部给予Ubuntu操作系统。 系统版本&#xff1a;#32~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Fri Aug 18 10:40:13 UTC 2 1 如何安装linux版本的zotero zotero是非常强大的开源文献管理和阅读软件。在各个平台均有版本。然而在linux版本下&#xff0c;并不是我们希望的d…

灵活学习平台满足不同学习风格的需求

灵活学习平台是现代教育的一项重要工具&#xff0c;它提供了满足不同学习风格的需求的服务。不同的学生有着不同的学习习惯和风格&#xff0c;有些学生喜欢通过阅读大量的文本来学习&#xff0c;而另一些学生则更喜欢通过视听材料来吸收知识。灵活学习平台的设计目的就是要满足…

[npm]脚手架本地全局安装1

[npm]脚手架本地全局安装1 npm link 全局安装npm install 全局安装卸载全局安装的脚手架 该文章是你的脚手架已经开发完成的前提下&#xff0c;你想要本地全局安装该脚手架&#xff0c;便于本地使用脚手架的命令的情况 npm link 全局安装 如果本地开发的项目是个脚手架&#…

JVM——1.JVM概述

从这篇文章开始&#xff0c;我们来学习一下jvm 目录 1.JVM的定义 2.JVM的好处 3.与JVM相关概念的解释 4.常见的JVM 5.JVM的主要内容 6.总结 1.JVM的定义 JVM&#xff0c;全称&#xff1a;Java Virtual Machine &#xff0c;即Java虚拟机&#xff0c;是Java程序的运行环…

Docker从认识到实践再到底层原理(五)|Docker镜像

前言 那么这里博主先安利一些干货满满的专栏了&#xff01; 首先是博主的高质量博客的汇总&#xff0c;这个专栏里面的博客&#xff0c;都是博主最最用心写的一部分&#xff0c;干货满满&#xff0c;希望对大家有帮助。 高质量博客汇总 然后就是博主最近最花时间的一个专栏…

OpenCV(四十四):亚像素级别角点位置优化

1.角点位置亚像素位置优化原理介绍 亚像素优化的原理在于通过对初始角点位置的微小调整&#xff0c;利用更精确的灰度信息&#xff0c;来获取更准确的角点位置。传统的角点检测算法基于像素级别的灰度变化来定位角点&#xff0c;而亚像素优化则进一步利用图像灰度的局部变化进行…

DataInputStream数据读取 Vs ByteBuffer数据读取的巨大性能差距

背景&#xff1a; 今天在查找一个序列化和反序列化相关的问题时&#xff0c;意外发现使用DataInputStream读取和ByteBuffer读取之间性能相差巨大&#xff0c;本文就来记录下这两者在读取整数类型时的性能差异&#xff0c;以便在平时使用的过程中引起注意 DataInputStream数据…

#循循渐进学5单片机#中断与数码管动态显示#not.5

1、掌握C语言数组的概念、定义和应用。 1&#xff09;数组是一组变量&#xff0c;这组变量需要满足三个条件&#xff1a; 具有相同的数组类型 具有相同的名字 在存储器中是连续的 2&#xff09;声明和初始化 数组类型 数组名【数组长度】 数组类型 数组名【数组长度】 …