举个简单点的例子,如下。
设计一个4bit的计数器,在记到最大值时输出一个信号
module counter_16 ( input clk, input rst_n, input cnt_in ,output reg cnt_out )
reg [3:0] cnt
always @ (posedge clk or negedge rst_n) begin
if (~rst_n) cnt <= 4'b0
else if (cnt_in) cnt <= cnt +1'b1
else cnt <= cnt
end
always @ (posedge clk or negedge rst_n) begin
if (~rst_n) cnt_out <= 1'b0
else if (cnt_in &&cnt == 4'b1111) cnt_out <= 1'b1
else cnt_out <= 1'b0
end
endmodule
这实际上设计了一个16进制计数器其中的一位,你可以例化多个相同模块,将低位的cnt_out连接到高位的cnt_in,级联成一个任意位数的16进制计数器。
给你写一个例子,下面是一个设计文件和一个对应的测试程序,希望能起到抛砖引玉的和用:/*
File Name : test.v
Author: www.flxc.net
Data : 2010-10-14 20:20:52
Description : This module is to shift the 32 bit input data with clock edges.
*/
`timescale 1ns/1ns
`define period 10
module test(
clk,
rst_n,
data_i,
data_o
)
input clk
input rst_n
input [31:0] data_i
output [31:0] data_o
reg [31:0] data_o
always@(posedge clk or negedge rst_n)
beg
if(!rst_n)
data_o <= 32'b0
else
data_o <= data_i >>1
end
endmodule
module test_tb
reg clk
reg rst_n
reg [31:0] data_i
wire [31:0] data_o
initial
begin
clk=1'b1
rst_n=1'b1
data_i=32'b1010_1111_1000_1111_1111_0000_0001_0000
#(`period/3)
rst_n=1'b0
#(`period/3)
rst_n=1'b1
#100000000
$stop
end
always #(`period/2) clk=~clk
endmodule
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)