为向上/向下计数器、4to1 mux、pulsegen 编写 verilog 模块代码

Posted

技术标签:

【中文标题】为向上/向下计数器、4to1 mux、pulsegen 编写 verilog 模块代码【英文标题】:writing verilog module codes for up/down counter, 4to1 mux, pulsegen 【发布时间】:2015-04-15 20:40:56 【问题描述】:

我对创建 verilog 模块的世界还很陌生,我必须创建一个 4to1 多路复用器、脉冲发生器、向上/向下计数器和一个 hex-to-7segment 显示器。这些后来都被放入顶层模块中。

我尝试创建 7 段和脉冲发生器,但我需要帮助创建 4to1 多路复用器(我之前只创建了 2to1 多路复用器)和加/减计数器。

这是我的实验论文上的描述。

pulse gen:用于控制计数器递增的时间或 递减。它使用名为 DELAU 的输入来确定时间长度 在每个脉冲输出之间。每个时钟滴答都会被计算在内。当 # 的 计数的时钟滴答等于延迟输入,会生成一个脉冲。

递增/递减计数器:将递增或递减一个 8 位寄存器 接收到时间脉冲。当来自 xilinx 板的外部开关是 高(1)然后计数器将增加。开关为低(0)它会 减少寄存器。寄存器计数数据输出到顶层 用于 LED 和 7 段显示器。

4to1 多路复用器:为脉冲发生器提供延迟输入。多路复用器的四个输入将是 在顶层硬编码以提供 0.5、1、1.5 和 分别延迟 2 秒。 2bit 选择将来自 2 xilinx 板上的开关。从板上,用户将能够切换 选择计数器向上或向下计数的延迟时间。

这就是我目前所拥有的。我真的没有太多的多路复用器和倒数计数器。 (能否请您检查一下我的脉冲发生器?)

4to1MUX

`timescale 1ns / 1ps
module mux4to1(sel,seg0,seg1,seg2,seg3,delay);
    input [1:0] sel;
    input seg0,seg1,seg2,seg3;
    output delay;
    wire delay;
    assign seg0 = 500000000;
    assign seg1 = 1000000000;
    assign seg2 = 1500000000;
    assign seg3 = 2000000000;
endmodule

加/减计数器

`timescale 1ns / 1ps
module updownCounter(updown,pulse,count);
    input [7:0] updown,
    input pulse;
     output [7:0] count;
     wire [7:0] count;

     (i'm not sure what goes here)
endmodule

脉冲发生器

`timescale 1ns / 1ps
module pulsegen(clk,rst,delay,pulse);
    input [28:0] delay;
     output pulse;
     wire pulse;
     reg [28:0] count;

     always @(posedge clk, posedge rst)
        if (rst)
            count <= 28'b0;
        else if (pulse)
            count <= 28'b0;
        else
            count <= count + 28'b1;
     assign pulse = (count == delay);
endmodule

7段显示

`timescale 1ns / 1ps
module sevenSegDis(hex,a,b,c,d,e,f,g);
    input [3:0] hex;
    output a,b,c,d,e,f,g;
     reg a,b,c,d,e,f,g;

     always@(*)
        case(hex)
            4'b0000: a,b,c,d,e,f,g= 7'b0000001;
            4'b0001: a,b,c,d,e,f,g= 7'b1001111;
            4'b0010: a,b,c,d,e,f,g= 7'b0010010;
            4'b0011: a,b,c,d,e,f,g= 7'b0000110;
            4'b0100: a,b,c,d,e,f,g= 7'b1001100;
            4'b0101: a,b,c,d,e,f,g= 7'b0100100;
            4'b0110: a,b,c,d,e,f,g= 7'b0100000;
            4'b0111: a,b,c,d,e,f,g= 7'b0001111;
            4'b1000: a,b,c,d,e,f,g= 7'b0000000;
            4'b1001: a,b,c,d,e,f,g= 7'b0000100;
            4'b1010: a,b,c,d,e,f,g= 7'b0001000;
            4'b1011: a,b,c,d,e,f,g= 7'b1100000;
            4'b1100: a,b,c,d,e,f,g= 7'b0110001;
            4'b1101: a,b,c,d,e,f,g= 7'b1000010;
            4'b1110: a,b,c,d,e,f,g= 7'b0110000;
            4'b1111: a,b,c,d,e,f,g= 7'b0111000;
            default: a,b,c,d,e,f,g= 7'b1110111;
        endcase
endmodule

【问题讨论】:

【参考方案1】:

我认为您对多路复用器的描述略有误解。您不必在其内部创建脉冲,因此数字 500000000、1000000000 不应出现在那里。

相反,多路复用器不应该关心其输入的含义。它只需将其中一个连接到输出,具体取决于选择输入的值。就像在 7 段解码器中一样,您可以使用 case 语句对多路复用器进行建模,它可能如下所示:

module mux4to1 (sel, seg0, seg1, seg2, seg3, delay);
  input [1:0] sel;
  input seg0, seg1, seg2, seg3;
  output delay;

  always @(*)
    case(sel)
    /* fill in the appropriate Verilog code which expresses this:
       if `sel` is 0 -> `delay` is `seg0`
       if `sel` is 1 -> `delay` is `seg1`
       and so on */
    endcase
endmodule

您的加/减计数器需要额外的时钟输入。 updown 输入应该是一位,而不是八位。

计数器的代码应该类似于脉冲发生器的代码。在每个时钟周期中,都应该发生以下情况之一:

如果pulse 为0,则计数器保持原样 如果pulse 为1,updown 为1,则计数器加一 如果pulse 为1,updown 为0,则计数器减1

您的脉冲发生器和 7 段解码器似乎没问题。

【讨论】:

以上是关于为向上/向下计数器、4to1 mux、pulsegen 编写 verilog 模块代码的主要内容,如果未能解决你的问题,请参考以下文章

使 HTML5 视频的持续时间指示器向上计数而不是向下计数

给定一个开始、结束和增量值,我想要一个向上和向下计数的算法

定时器的相关配置

定时器理解

QT软件开发之基础控件--2.4.7 spinBox整数计数器

STM32伺服编码器接口