cnt=cnt+1; if (cnt==200) begin clk1=1'b1; cnt=0; end
else clk1=1'b0; if (sel<2) sel=sel+1; else sel=0; end
always @(posedge CLK or negedge rst) begin if(!rst) q=0;else if(en) begin if(q if (gw==9) begin q=q+7; if (sw==9) q=q+96; end else q=q+1; end else q=0;end end always @(q) begin if(q 0:SG<=8'b00111111; 1:SG<=8'b00000110; 2:SG<=8'b01011011; 3:SG<=8'b01001111; 4:SG<=8'b01100110; 5:SG<=8'b01101101; 6:SG<=8'b01111101; 7:SG<=8'b00000111; 8:SG<=8'b01111111; 9:SG<=8'b01101111; default: SG=8'b11111111; endcase end endmodule 分频模块 分频模块由时钟频率的分频作为计数脉冲,每200个系统脉冲有一个技术脉冲,同时可以利用系统脉冲进行循环选择SEL来进行循环扫码。程序如下 always @(posedge CLK) begin cnt=cnt+1; if (cnt==200) begin clk1=1'b1; cnt=0; end else clk1=1'b0; if (sel<2) sel=sel+1; else sel=0; 选择模块由M选择,M为1时模是30,M为0时模为100。 always @(M) if (M) model=12'b000000110000; else model=12'b000100000000; 计数模块 计数模块如下,由于q为16进制数,我们需要的输出为BCD码,故进行调整。平常时q来一个脉冲加1,当加到个位为9时,也就是1001,将其加7变为16也就是0,实现了个位由9到0的BCD计数,同时也会向十位进1。当十位和个位同时,为9时,再加上个位向十位进的1就是加7,q位加96也就是十位加6, 十位会清零同时个位也会清零,同时向百位进1,实现了正常的十进制BCD码计数。Rst则为清零信号,en为使能信号。 always @(posedge CLK or negedge rst) begin if(!rst) q=0;else if(en) begin if(q if (gw==9) begin q=q+7; if (sw==9) q=q+96; end else q=q+1; end else q=0;end End 当计数到顶后有个标志位d标志是否计到顶。 always @(q) begin if(q 循环扫码模块如下,由于sel的变化频率和系统时钟相同,所以肉眼辨别不出来在跳动,可以通过其分别选择数码管并将个位十位百位呈现在数码管上,同时配 有译码程序。 always @(sel) begin case (sel) 0: a=bw; 1: a=sw; 2: a=gw; default: a=0; endcase case (a) 0:SG<=8'b00111111; 1:SG<=8'b00000110; 2:SG<=8'b01011011; 3:SG<=8'b01001111; 4:SG<=8'b01100110; 5:SG<=8'b01101101; 6:SG<=8'b01111101; 7:SG<=8'b00000111; (五) 实验截图 仿真时用CLK代替分频频率便于观察.总体图 Rst可以实现计数的清零。 当M为1时实现了模30的计数,同时标志位为1 当M为0时实现了模100的计数,同时标志位为1 使能信号en为0时计数保持不变 (六) 实验总结 初步进行了自己设计程序和仿真一系列工作,加深了对设计过程和语句使用的理解。进而对软硬件的操作使用都有了进一步的熟练,遇到的基础问题也能想办法去解决了,不像第一次那样手足无措了。语法语句也大概有了了解。