5-10 用Verilog设计一个功能类似74ls160的计数器。
(1)解题思路
(2)核心模块代码
module fidv1 (rd,clk,et,load,datain,dataout,cout,ep);
input rd,ep;
input [3:0] datain;
output [3:0] dataout ;
output cout;
reg cout;
reg [3:0] q1;
wire rd;
always @ (posedge clk or negedge rd)
if (rd==0) begin q1<=4‘d0; end//rd=0时清零
else begin
if(clk==1&load==0) q1=datain;
else if(clk==1&load==1)
begin
if(ep==1&et==1&q1<4‘d10) //开始计数
begin q1=q1+1;cout=0;
end
else if((ep&et)==0) begin q1=q1;cout=0;end//保持不变
else if(q1==4‘d10) cout=1;//进位输出
end
end
assign dataout =q1;
endmodule
(3)测试模块代码
`timescale 1 ps/ 1 ps
module fidv1_ll();
// constants
// general purpose registers
reg eachvec;
// test vector input registers
reg clk;
reg [3:0] datain;
reg ep;
reg et;
reg load;
reg rd;
// wires
wire cout;
wire [3:0] dataout;
// assign statements (if any)
fidv1 i1 (
// port map - connection between master ports and signals/registers
.clk(clk),
.cout(cout),
.datain(datain),
.dataout(dataout),
.ep(ep),
.et(et),
.load(load),
.rd(rd)
);
always #2 clk=~clk;
initial
begin
#0 clk=0;
#0 rd=1;
#0 datain=4‘d2;
#2 load=0;
#2 ep=1;
#0 et=1;
#12 load=1;
#16 ep=0;
#0 et=0;
#8 rd=0;
#2 rd=1;
#6 datain=4‘d3;
#5 load=0;
$display("dataout=%d,datain=%d",datain);
#2 $stop;
end
endmodule
(4)RTL View的网表图
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。