为向上/向下计数器、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 模块代码的主要内容,如果未能解决你的问题,请参考以下文章