这篇文章上次修改于 398 天前,可能其部分内容已经发生变化,如有疑问可询问作者。

设计规定

使用verilog HDL语法,时钟信号 CLK;使能信号EN;清零信号RST;进位信号COUT;输出信号CQ[3:0]。

程序代码

module class5//模块名为class5
(input clk,en,rst,//输入时钟信号clk,使能信号en,清零信号rst
output reg cout,//寄存器型进位信号cout
output reg[0:3] cq);//寄存器型输出信号cq,作为计数器用

always@(posedge clk or negedge rst )//敏感信号列表,当时钟的上升沿到来或清零信号的下降沿到来的时候,执行下列操作
begin
    if(!rst)//当清零信号处于低电平的时候
        cq<=4'b0000;//将计数器清零
    else if(en)//否则当使能信号为高电平时(同步置数,异步清零)
        begin
            if(cq<4'b1001)//如果计数器未累计到9
                cq<=cq+4'b0001;//计数器输出信号+1
            else 
                cq<=4'b0000;//否则超过9后,计数器清零(实现十进制计数)
        end

end

always @(cq)//输出信号cq触发操作
  if (cq==4'b1001)//如果计数器cq累加到9的时候
    cout = 1'b1;//将cq设置为高电平,表示进位
  else          
    cout = 1'b0;//否则设置为低电平
endmodule

仿真结果

图片1.png

程序设计中的改进与思考

在程序设计中,实现进位信号的判断在哪里实现,首先考虑的是在第一个always块中的if语句计数器实现加一操作后判断进位cout,然而这样进位信号会变成计数器清零后输出高电平,而不是在累计到9的时候,解决方法是独立使用一个always块对cq信号进行判断。
除了使用if语句进行判断外,还可以采用case选择语句进行判断,如

case(cq)
4’b1001:cout=1,cq=4’b0000;
default:cout=0,cq=cq+4’b0001;
endcase