linex0816

又是一个 七十二松 (72pines) 博客

D锁存器

module D_latch(
 D,       //输入选择地址由开关决定,0:按下,1:未按下
 E,       //输入选择地址由开关决定,0:按下,1:未按下
 
 Q      //输出,0:点亮,1:熄灭
 );
input   D;     //D锁存器输入
input   E;     //D锁存器输入
output  Q;     //D锁存器输出
reg    Q;     //寄存器说明
always @(D or E)    //一旦D或则E变化就执行
begin
 if(E)      //当E=1的时候D才可以赋值给Q,其它状态不执行
  Q <= D;
  else;
end
endmodule

编码器

module my_encode(
 I,      //输入由开关决定,0:按下,1:未按下
 Y      //输出,0:点亮,1:熄灭
 );
input  [3:0] I;    //输入4位
output [1:0] Y;     //输出2位
reg   [1:0] Y;     //always中需要寄存器定义
always @(I)     //一旦输入I变化就执行
begin
 case(I)     //用case语句来描述
  4′b0001: Y = 2′b00;   //I[0]为1的时候编码为0
  4′b0010: Y = 2′b01;   //I[1]为1的时候编码为1
  4′b0100: Y = 2′b10;   //I[2]为1的时候编码为2
  4′b1000: Y = 2′b11;   //I[3]为1的时候编码为3
  default: Y = 2′b00;  //其它方式为0,当多输入为1的时候就是这种情况
 endcase
end
endmodule

优先编码器

module my_encode1(
 I,      //输入由开关决定,0:按下,1:未按下
 Y      //输入由开关决定,0:按下,1:未按下
 );
input  [3:0] I;    //输入
output [1:0] Y;     //输出
reg   [1:0] Y;     //输出
always @(I)     //一旦I变化就执行
begin
 casex(I)      //优先编码器需要用casex来描述
  4′bxxx1: Y = 2′b00;   //I[0]为1的时候编码为0
  4′bxx1x: Y = 2′b01;   //I[1]为1的时候编码为1
  4′bx1xx: Y = 2′b10;   //I[2]为1的时候编码为2
  4′b1xxx: Y = 2′b11;   //I[3]为1的时候编码为3
  default: Y = 2′b00;  //其它状态的处理
 endcase
end
endmodule

状态机控制流水灯的方向

module state_machine(
 clk,        //48M
 reset,                                    //
 sel,        //01
 
 Q       //01
 );
input   clk;      //
input   reset;     //
input   sel;
 
output [3:0] Q;      //
reg   [3:0] Q;      //
 
wire    clk_out;     //1S
 
reg   [2:0] sts;
 
parameter   st1 = 2′b00,   //1
   st2 = 2′b01,   //2
   st3 = 2′b10,   //3
   st4 = 2′b11;   //4
 
/* */
always @(posedge clk_out or negedge reset)
begin
 if(!reset)
 begin
  Q      <= 4′b0000;   //0
  sts <= st1;
 end
 else
  case(sts)
            st1:       //1
   begin  
    Q <= 4′b1110;   //0
    
    if(sel)      sts <= st2;   //sel
    else            sts <= st4;
   end   
   
            st2:       //2
  begin  
   Q <= 4′b1101;    //
   
   if(sel)   sts <= st3;   //sel
   else            sts <= st1; 
  end  
  
           st3:       //3
  begin  
   Q <= 4′b1011;    //
   
   if(sel)      sts <= st4;      //sel
   else            sts <= st2; 
  end  
  
           st4:       //4   
  begin  
   Q <= 4′b0111;   //
   
   if(sel)      sts <= st1;   //sel
   else            sts <= st3; 
  end  
  
           default:sts <= st1;    //0
       endcase
end
clk_div clk_div_0(     //2S
    .clk(clk),       //48M
.reset(reset),     //
 
.clk_out(clk_out)     //
   );
endmodule
 
 
module clk_div
 (
 clk,        //时钟输入,48M
 reset,       //异步复位输入,高电平复位
 clk_out      //分频时钟输出
 );
parameter   cnt_top=26′d12000000; //分频系数
input   clk;      //端口定义
input   reset;
output   clk_out;
reg     clk_out;      //寄存器定义
reg   [25:0] clk_cnt;
always @(posedge clk or negedge reset) 
begin
 if(!reset)       //复位
 begin
  clk_out <= 1′b0;
  clk_cnt <= 0;
 end
 else
 begin
  if(clk_cnt==cnt_top-1)
  begin
   clk_out <= ~clk_out;   //分频输出
   clk_cnt <= 0;
  end
  else
   clk_cnt <= clk_cnt+1′b1; //计数器加1
 end
end
endmodule

Hello world!

Welcome to 七十二松 (72pines). This is your first post. Edit or delete it, then start blogging!

  

Calendar

一月 2012
« 十    
 1
2345678
9101112131415
16171819202122
23242526272829
3031