-1

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

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

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

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

向上/向下计数器:每次接收到脉冲时,将递增或递减一个 8 位寄存器。当来自 xilinx 板的外部开关为高电平 (1) 时,计数器将递增。开关为低(0),它将减少寄存器。寄存器计数数据输出到顶层用于 LED 和 7 段显示。

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

所以这是我到目前为止所拥有的。我真的没有太多的多路复用器和倒数计数器。(你也可以检查一下我的pulsegen吗?)

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
4

1 回答 1

0

我认为您对多路复用器的描述略有误解。您不必在其中创建脉冲因此数字 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 段解码器似乎没问题。

于 2015-04-15T21:25:41.873 回答