reg [3:0] q2; reg [3:0] q3;
output [6:0] hex0; output [6:0] hex1; output [6:0] hex2; output [6:0] hex3;
always@(posedge sigin or posedge reset or negedge clr) begin if(reset||(!clr)) begin q0<=4'd0; q1<=4'd0; q2<=4'd0; q3<=4'd0; end
else if(en) begin
if(q0==4'd9) begin if(q1==4'd9) begin if(q2==4'd9) begin q3<=q3+4'd1; q2<=4'd0; end else q2<=q2+4'd1; q1<=4'd0; end else q1<=q1+4'd1; q0<=4'd0; end
else q0<=q0+4'd1; end
else begin {q0,q1,q2,q3}<={q0,q1,q2,q3};end end
assign hex0=(q0==4'd0)?7'b1000000: (q0==4'd1)?7'b1111001: (q0==4'd2)?7'b0100100: (q0==4'd3)?7'b0110000: (q0==4'd4)?7'b0011001: (q0==4'd5)?7'b0010010: (q0==4'd6)?7'b0000010: (q0==4'd7)?7'b1111000: (q0==4'd8)?7'b0000000:
(q0==4'd9)?7'b0010000:7'b0;
assign hex1=(q1==4'd0)?7'b1000000: (q1==4'd1)?7'b1111001: (q1==4'd2)?7'b0100100: (q1==4'd3)?7'b0110000: (q1==4'd4)?7'b0011001: (q1==4'd5)?7'b0010010:
(q1==4'd6)?7'b0000010: (q1==4'd7)?7'b1111000: (q1==4'd8)?7'b0000000:
(q1==4'd9)?7'b0010000:7'b0; assign hex2=(q2==4'd0)?7'b1000000: (q2==4'd1)?7'b1111001: (q2==4'd2)?7'b0100100: (q2==4'd3)?7'b0110000: (q2==4'd4)?7'b0011001: (q2==4'd5)?7'b0010010: (q2==4'd6)?7'b0000010: (q2==4'd7)?7'b1111000: (q2==4'd8)?7'b0000000:
(q2==4'd9)?7'b0010000:7'b0; assign hex3=(q3==4'd0)?7'b1000000: (q3==4'd1)?7'b1111001: (q3==4'd2)?7'b0100100: (q3==4'd3)?7'b0110000: (q3==4'd4)?7'b0011001: (q3==4'd5)?7'b0010010: (q3==4'd6)?7'b0000010: (q3==4'd7)?7'b1111000: (q3==4'd8)?7'b0000000:
(q3==4'd9)?7'b0010000:7'b0; endmodule
包含一个四位十进制计数部分,和译码器电路,同时包含同步清零reset和异步清零clr。
(6) 信号锁存模块
代码:module lat(la,h0,h1,h2,h3,hex0,hex1,hex2,hex3); input la;
input [6:0] h0; input [6:0] h1; input [6:0] h2; input [6:0] h3; output [6:0] hex0; output [6:0] hex1; output [6:0] hex2; output [6:0] hex3; reg [6:0]hex0; reg [6:0]hex1; reg [6:0]hex2; reg [6:0]hex3;
always@(la) begin
if(la) begin hex0<=hex0; hex1<=hex1; hex2<=hex2; hex3<=hex3; end
else begin hex0<=h0; hex1<=h1; hex2<=h2; hex3<=h3; end end endmodule
锁存信号la低电平时输出透明,高电平时输出锁存。
(7) 顶层模块
代码:
module div(clock_50,clr,sw_0,sw_1,sw_2,led,hex0,hex1,hex2,hex3,led_1hz); input clock_50,clr,sw_0,sw_1,sw_2; output led,led_1hz; output [6:0] hex0; output [6:0] hex1; output [6:0] hex2; output [6:0] hex3; wire [1:0] a;
wire sigin,sigout,clk_1hz,en,reset,la; wire [6:0] h0; wire [6:0] h1; wire [6:0] h2; wire [6:0] h3; wire x;
assign a = {sw_1,sw_0}; assign led_1hz=la;
signalinput sig_top(.testmode(a),.sysclk(clock_50),.sigin(sigin)); div_10 div_top(.sigin(sigin),.sw_2(sw_2),.sigout(x),.led(led)); clk_1hz clk_top(.sysclk(clock_50),.clk(clk_1hz));
assign sigout=sw_2?x:sigin; control
control_top(.clk_1hz(clk_1hz),.en(en),.reset(reset),.la(la));
counter
counter_top(.sigin(sigout),.en(en),.reset(reset),.clr(clr),.hex0(h0),.hex1(h1),.hex2(h2),.hex3(h3));
lat
lat_top(.la(la),.h0(h0),.h1(h1),.h2(h2),.h3(h3),.hex0(hex0),.hex1(hex1),.hex2(hex2),.hex3(hex3));
endmodule
把所有模块进行串联,中间根据sw_2选择是否进行十分频。 顶层模块的RTL级电路图如下:
问题及解决办法
1 十分频判断问题
待测信号是否需要十分频依据sw_2信号的判断,我开始把判断语句写在了十分频always语句的里面,如:
always@(posegdge sigin) begin if(!sw_2) sigout<=sigin; else 十分频... end
这样导致输出信号无变化,后来发现原因是sigout每次被sigin赋值时,均在sigin上升沿,所以无变化。解决办法是在十分频模块中增加一个wire信号进行判断,或者把判断放在顶层模块中,我选择后者。
2 十进制问题
十进制数是4位二进制代表1位十进制,我开始把十进制数写成了1’d1,使十进制数只有1位被表示出来,故十进制变成了二进制。
3 reg声明问题
声明寄存器时需要写上位数如:reg [6:0] hex1;没有带位数时,只给hex1赋了最低位,导致七段译码器前两位为无输入状态“88”。并且此时变异不报错,只能从警告中查出,经老师指出改正后正常。
心得收获
本次实验涉及了之前实验中的内容并且进行了综合,我在开始设计时并没有仔细分析信号的变化过程,导致出现了很多低级错误,如问题1,在以后的设计中需要更加稳健。
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说教育文库频率计实验报告 - 2010011014(2)在线全文阅读。
相关推荐: