Verilog之SOS信号-仿顺序操作

2023-10-15 02:30
文章标签 操作 顺序 信号 verilog sos

本文主要是介绍Verilog之SOS信号-仿顺序操作,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

SOS信号:. . . _ _ _ . . . 

1.

module sos_module                    
(                    CLK, RSTn, Pin_Out, SOS_En_Sig                    
);                    input CLK;                    input RSTn;                input SOS_En_Sig;                output Pin_Out;                /****************************************/                parameter T1MS = 16'd49_999;//DB4CE15开发板使用的晶振为50MHz,50M*0.001-1=49_999                /***************************************/                reg [15:0]Count1;                always @ ( posedge CLK or negedge RSTn )                if( !RSTn )                Count1 <= 16'd0;            else if( isCount && Count1 == T1MS )            Count1 <= 16'd0;            else if( isCount )            Count1 <= Count1 + 1'b1;            else if( !isCount )            Count1 <= 16'd0;            /****************************************/                    reg [9:0]Count_MS;                    always @ ( posedge CLK or negedge RSTn )                if( !RSTn )                    Count_MS <= 10'd0;            else if( isCount && Count1 == T1MS )            Count_MS <= Count_MS + 1'b1;            else if( !isCount )            Count_MS <= 10'd0;            /******************************************/                reg isCount;                reg rPin_Out;                reg [4:0]i;                always @ ( posedge CLK or negedge RSTn )                if( !RSTn )                begin            isCount <= 1'b0;            rPin_Out <= 1'b0;i <= 5'd0;end        else             case( i )                5'd0 :         if( SOS_En_Sig ) i <= 5'd1;5'd1, 5'd3, 5'd5, 5'd13, 5'd15, 5'd17 :  if( Count_MS == 10'd100 ) begin isCount <= 1'b0; rPin_Out <= 1'b0; i <= i + 1'b1; end // shortelse begin isCount <= 1'b1; rPin_Out <= 1'b1; end5'd7, 5'd9, 5'd11 :if( Count_MS == 10'd300 ) begin isCount <= 1'b0; rPin_Out <= 1'b0; i <= i + 1'b1; end // longelse begin isCount <= 1'b1; rPin_Out <= 1'b1; end5'd2, 5'd4, 5'd6,  5'd8, 5'd10, 5'd12,5'd14, 5'd16, 5'd18 :if( Count_MS == 10'd50 ) begin isCount <= 1'b0; i <= i + 1'b1; end// intervalelse isCount <= 1'b1;5'd19 :begin rPin_Out <= 1'b0; i <= 5'd0; end  // endendcase        /***************************************************/                    assign Pin_Out = rPin_Out;                /***************************************************/                endmodule                    

 

2.

“Start_Sig”如同 C 语言中的调用指令,“Done_Sig”如同 C 语言的返回指令。这两个信号的存在就是为了控制模块的调用。

module sos_control_module                    
(                    CLK, RSTn,                    Start_Sig,                S_Done_Sig, O_Done_Sig,                S_Start_Sig, O_Start_Sig,                Done_Sig                
);                    input CLK;                    input RSTn;                input Start_Sig;                input S_Done_Sig, O_Done_Sig;                output S_Start_Sig, O_Start_Sig;                output Done_Sig;                /*************************************/                reg [3:0]i;                reg isO;                reg isS;                reg isDone;                always @ ( posedge CLK or negedge RSTn )                if( !RSTn )                    begin            i <= 4'd0;            isO <= 1'b0;isS <= 1'b0;isDone <= 1'b0;end        else if( Start_Sig )            case( i )            4'd0:if( S_Done_Sig ) begin isS <= 1'b0; i <= i + 1'b1; endelse isS <= 1'b1;4'd1:if( O_Done_Sig ) begin isO <= 1'b0; i <= i + 1'b1; endelse isO <= 1'b1;4'd2:if( S_Done_Sig ) begin isS <= 1'b0; i <= i + 1'b1; endelse isS <= 1'b1;4'd3:begin isDone <= 1'b1; i <= 4'd4; end                    4'd4:begin isDone <= 1'b0; i <= 4'd0; endendcase    /*****************************************/                    assign S_Start_Sig = isS;                    assign O_Start_Sig = isO;                    assign Done_Sig = isDone;                     /*****************************************/                endmodule                    
module s_module                    
(                    CLK, RSTn,                    Start_Sig,                Done_Sig,                Pin_Out                
);                    input CLK;                    input RSTn;                input Start_Sig;                output Done_Sig;                output Pin_Out;                /****************************************/                parameter T1MS = 16'd49_999;                /***************************************/                reg [15:0]Count1;                always @ ( posedge CLK or negedge RSTn )                if( !RSTn )                Count1 <= 16'd0;            else if( Count1 == T1MS )            Count1 <= 16'd0;            else if( isCount )            Count1 <= Count1 + 1'b1;            else if( !isCount )            Count1 <= 16'd0;            /****************************************/                    reg [9:0]Count_MS;                    always @ ( posedge CLK or negedge RSTn )                if( !RSTn )                    Count_MS <= 10'd0;            else if( Count_MS == rTimes )            Count_MS <= 10'd0;            else if( Count1 == T1MS )            Count_MS <= Count_MS + 1'b1;            /******************************************/                reg [3:0]i;                reg rPin_Out;                reg [9:0]rTimes;                reg isCount;                reg isDone;                always @ ( posedge CLK or negedge RSTn )                if( !RSTn )                begin             i <= 4'd0;        rPin_Out <= 1'b0;            rTimes <= 10'd1000;isCount <= 1'b0;    isDone <= 1'b0;    end        else if( Start_Sig )            case( i )            4'd0, 4'd2, 4'd4:        if( Count_MS == rTimes ) begin rPin_Out <= 1'b0; isCount <= 1'b0; i <= i + 1'b1; end        else begin isCount <= 1'b1; rPin_Out <= 1'b1; rTimes <= 10'd100; end    4'd1, 4'd3, 4'd5:if( Count_MS == rTimes ) begin isCount <= 1'b0; i <= i + 1'b1; endelse  begin isCount <= 1'b1; rTimes <= 10'd50; end4'd6:begin isDone <= 1'b1; i <= 4'd7; end4'd7:begin isDone <= 1'b0; i <= 4'd0; endendcase        /******************************************/                assign Done_Sig = isDone;                assign Pin_Out = !rPin_Out;                /******************************************/                endmodule                    
module o_module                    
(                    CLK, RSTn,                    Start_Sig,                Done_Sig,                Pin_Out                
);                    input CLK;                    input RSTn;                input Start_Sig;                output Done_Sig;                output Pin_Out;                /****************************************/                parameter T1MS = 17'd49_999;                /***************************************/                reg [16:0]Count1;                always @ ( posedge CLK or negedge RSTn )                if( !RSTn )                Count1 <= 17'd0;            else if( Count1 == T1MS )            Count1 <= 17'd0;            else if( isCount )            Count1 <= Count1 + 1'b1;            else if( !isCount )            Count1 <= 17'd0;            /****************************************/                    reg [9:0]Count_MS;                    always @ ( posedge CLK or negedge RSTn )                if( !RSTn )                    Count_MS <= 10'd0;            else if( Count_MS == rTimes )            Count_MS <= 10'd0;            else if( Count1 == T1MS )            Count_MS <= Count_MS + 1'b1;            /******************************************/                reg [3:0]i;                reg rPin_Out;                reg [9:0]rTimes;                reg isCount;                reg isDone;                always @ ( posedge CLK or negedge RSTn )                if( !RSTn )                begin             i <= 4'd0;        rPin_Out <= 1'b0;            rTimes <= 10'd1000;isCount <= 1'b0;    isDone <= 1'b0;    end        else if( Start_Sig )            case( i )            4'd0, 4'd2, 4'd4:        if( Count_MS == rTimes ) begin rPin_Out <= 1'b0; isCount <= 1'b0; i <= i + 1'b1; end        else begin isCount <= 1'b1; rPin_Out <= 1'b1; rTimes <= 10'd400; end    4'd1, 4'd3, 4'd5:if( Count_MS == rTimes ) begin isCount <= 1'b0; i <= i + 1'b1; endelse  begin isCount <= 1'b1; rTimes <= 10'd50; end4'd6:begin isDone <= 1'b1; i <= 4'd7; end4'd7:begin isDone <= 1'b0; i <= 4'd0; endendcase        /******************************************/                assign Done_Sig = isDone;                assign Pin_Out = !rPin_Out;                /******************************************/                endmodule                    
module sos_module        
(        CLK, RSTn,        Start_Sig,        Done_Sig,    Pin_Out    
);        input CLK;        input RSTn;    input Start_Sig;    output Done_Sig;    output Pin_Out;    /*****************************/    wire S_Done_Sig;    wire S_Pin_Out;    s_module U1    (    .CLK( CLK ),    .RSTn( RSTn ),.Start_Sig( S_Start_Sig ),  // input - from U3.Done_Sig( S_Done_Sig ),    // output - to U3.Pin_Out( S_Pin_Out )       // output - to selector
          ) ;    /*********************************/    wire O_Done_Sig;    wire O_Pin_Out;    o_module U2    (    .CLK( CLK ),    .RSTn( RSTn ),.Start_Sig( O_Start_Sig ),  // input - from U3.Done_Sig( O_Done_Sig ),    // output - to U3.Pin_Out( O_Pin_Out )       // output - to selector
     );    /*********************************/    wire S_Start_Sig;    wire O_Start_Sig;    sos_control_module U3    (    .CLK( CLK ),    .RSTn( RSTn ),.Start_Sig( Start_Sig ),      // input - from top.S_Done_Sig( S_Done_Sig ),    // input - from U1.O_Done_Sig( O_Done_Sig ),    // input - from U2.S_Start_Sig( S_Start_Sig ),  // output - to U1.O_Start_Sig( O_Start_Sig ),  // output - to U2.Done_Sig( Done_Sig )         // output - to top
     );    /*********************************/    //selector    reg Pin_Out;    always @ ( * )    if( S_Start_Sig ) Pin_Out = S_Pin_Out;      // select from U1    else if( O_Start_Sig ) Pin_Out = O_Pin_Out;  // select from U2else Pin_Out = 1'bx; /*********************************/        endmodule        

 

转载于:https://www.cnblogs.com/shaogang/p/4123489.html

这篇关于Verilog之SOS信号-仿顺序操作的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/214770

相关文章

顺序表之创建,判满,插入,输出

文章目录 🍊自我介绍🍊创建一个空的顺序表,为结构体在堆区分配空间🍊插入数据🍊输出数据🍊判断顺序表是否满了,满了返回值1,否则返回0🍊main函数 你的点赞评论就是对博主最大的鼓励 当然喜欢的小伙伴可以:点赞+关注+评论+收藏(一键四连)哦~ 🍊自我介绍   Hello,大家好,我是小珑也要变强(也是小珑),我是易编程·终身成长社群的一名“创始团队·嘉宾”

动手学深度学习【数据操作+数据预处理】

import osos.makedirs(os.path.join('.', 'data'), exist_ok=True)data_file = os.path.join('.', 'data', 'house_tiny.csv')with open(data_file, 'w') as f:f.write('NumRooms,Alley,Price\n') # 列名f.write('NA

线程的四种操作

所属专栏:Java学习        1. 线程的开启 start和run的区别: run:描述了线程要执行的任务,也可以称为线程的入口 start:调用系统函数,真正的在系统内核中创建线程(创建PCB,加入到链表中),此处的start会根据不同的系统,分别调用不同的api,创建好之后的线程,再单独去执行run(所以说,start的本质是调用系统api,系统的api

Java IO 操作——个人理解

之前一直Java的IO操作一知半解。今天看到一个便文章觉得很有道理( 原文章),记录一下。 首先,理解Java的IO操作到底操作的什么内容,过程又是怎么样子。          数据来源的操作: 来源有文件,网络数据。使用File类和Sockets等。这里操作的是数据本身,1,0结构。    File file = new File("path");   字

web群集--nginx配置文件location匹配符的优先级顺序详解及验证

文章目录 前言优先级顺序优先级顺序(详解)1. 精确匹配(Exact Match)2. 正则表达式匹配(Regex Match)3. 前缀匹配(Prefix Match) 匹配规则的综合应用验证优先级 前言 location的作用 在 NGINX 中,location 指令用于定义如何处理特定的请求 URI。由于网站往往需要不同的处理方式来适应各种请求,NGINX 提供了多种匹

MySQL——表操作

目录 一、创建表 二、查看表 2.1 查看表中某成员的数据 2.2 查看整个表中的表成员 2.3 查看创建表时的句柄 三、修改表 alter 3.1 重命名 rename 3.2 新增一列 add 3.3 更改列属性 modify 3.4 更改列名称 change 3.5 删除某列 上一篇博客介绍了库的操作,接下来来看一下表的相关操作。 一、创建表 create

封装MySQL操作时Where条件语句的组织

在对数据库进行封装的过程中,条件语句应该是相对难以处理的,毕竟条件语句太过于多样性。 条件语句大致分为以下几种: 1、单一条件,比如:where id = 1; 2、多个条件,相互间关系统一。比如:where id > 10 and age > 20 and score < 60; 3、多个条件,相互间关系不统一。比如:where (id > 10 OR age > 20) AND sco

列举你能想到的UNIX信号,并说明信号用途

信号是一种软中断,是一种处理异步事件的方法。一般来说,操作系统都支持许多信号。尤其是UNIX,比较重要应用程序一般都会处理信号。 UNIX定义了许多信号,比如SIGINT表示中断字符信号,也就是Ctrl+C的信号,SIGBUS表示硬件故障的信号;SIGCHLD表示子进程状态改变信号;SIGKILL表示终止程序运行的信号,等等。信号量编程是UNIX下非常重要的一种技术。 Unix信号量也可以

PHP7扩展开发之流操作

前言 啥是流操作?简单来讲就是对一些文件,网络的IO操作。PHP已经把这些IO操作,封装成流操作。这节,我们将使用PHP扩展实现一个目录遍历的功能。PHP示例代码如下: <?phpfunction list_dir($dir) {if (is_dir($dir) === false) {return;} $dh = opendir($dir);if ($dh == false) {ret

浙大数据结构:树的定义与操作

四种遍历 #include<iostream>#include<queue>using namespace std;typedef struct treenode *BinTree;typedef BinTree position;typedef int ElementType;struct treenode{ElementType data;BinTree left;BinTre