verliog语言代码注解,代码已完成。(尽量详细,最好每一步都有)

1、用FPGA实现彩灯控制电路的设计。
2、彩灯控制电路具有1个复位按钮,当按钮按下后开始彩灯控制电路的工作。
3、彩灯控制电路至少有4种以上的控制模式,如左移、右移、循环移位和闪烁等,彩灯控制电
路开始工作后,各工作模式能自动切换。
4、用12只发光二极管(LED)显示彩灯控制电路的工作模式。

img

img


fpq是一个20MHZ的分频器,将仪器提供的频率为20MHZ时钟转换成1HZ的时钟,然后输出到有需要的端口,触发模块起作用。
cd2-6是彩灯控制程序,用来控制彩灯的四种模式。CLK是时钟控制信号,CLR是复位信号,EN是使能端,S1,S2是可以改变LED灯的,如左移、右移和循环移位等。
程序
(1)module fpq(clkin,clkout);
input clkin;
output reg clkout;
reg[24:0] temp;
always @(posedge clkin)
begin
if(temp<20000000) temp=temp+'b1;
else temp=0;
endalways @(posedge clkin)
begin
if(temp<10000000) clkout='b0;
else clkout='b1;
end
endmodule
彩灯程序
(2)module cd2_6 (CLK,CLR,EN,S1,S2,LED);
input CLK,CLR,EN,S1,S2;
output reg [11:0] LED;
reg temp;
reg c;
initial
LED='b000000000001;
always @(posedge CLK)
begin
if(EN==0)
begin
case({S1,S2})
'b00:begin
c=c+'b1;
if(c=='b1)
LED='b100100100100;
else
LED='b011011011011;
end
'b01:begin
c=c+'b1;
if(c=='b1)
LED='b000000000000;
else
LED='b111111111111;
end
'b10:begin
temp=LED[0];
LED=LED>>1;
LED[11]=temp;
end
'b11:begin
temp=LED[11];
LED=LED<<1;
LED[0]=temp;
end
endcase
end
if (CLR==1) LED=000000000001;
end endmodule

代码说明如下,请查看:

module cd2_6 (CLK,CLR,EN,S1,S2,LED); //定义模块名和输入、输出、使能、控制端口
input CLK,CLR,EN,S1,S2;  //输入端口说明
output reg [11:0] LED;   //输出端口说明
reg temp;                     //在always中被赋值的要定义为reg类型
reg c;                         //同上一条
initial
    LED='b000000000001;   //初始化LED状态为1
always @(posedge CLK) //posedge CLK表示always语句对CLK信号上升沿敏感,每次上升沿到来就执行always语句块
begin                 //begin 和end搭配,相当于括号()
    if(EN==0)          //使能端口EN==0,就执行下面的begin end之内的指令
    begin
    case({S1,S2})      //S1、S2为控制端,{}为位拼接运算符
    'b00:                     //S1=0、S2=0时,执行下方的begin-end之间语句,为循环移位功能
    begin 
       c=c+'b1;        //c+1,因为c是1位二进制数,所以c要么等于0,要么等于1(超过1的部分被舍弃)
       if(c=='b1) LED='b100100100100; // 部分LED亮,部分灭
      else       LED='b011011011011; // 上次亮的,这次灭;上次灭的,这次亮;
   end
   'b01:   //S1=0、S2=1时,执行闪烁功能
    begin
        c=c+'b1;
        if(c=='b1) LED='b000000000000;  //LED全灭(或全亮)
        else       LED='b111111111111;  //LED全亮(或全灭)
    end
    'b10:   //S1=1、S2=0时,执行右移功能
    begin
        temp=LED[0];   //因为要实现首尾状态互换,所以用temp作为中间变量
        LED=LED>>1;    //右移
        LED[11]=temp;  //最后一位=首位
        //例如:1010,temp=0,移位后x101,在对最后一位赋值,x=temp=0,所以:1010->0101,实现循环移位
    end
    'b11:   //S1=1、S2=1时,执行左移功能,原理同右移
    begin
        temp=LED[11];
        LED=LED<<1;
        LED[0]=temp;
    end  
   endcase
   end
   if (CLR==1) LED=000000000001; //如果复位信号CLR==1,LEN复位为初始状态
end 
endmodule

这不是Verilog吗?