您的位置:首页 > 其它

FPGA 学习笔记

2017-11-30 10:57 393 查看
1. 计数器学习

module my_counter(clk,rstn,led);

 

 input clk;

 input rstn;

 output reg led;

  reg[24:0] count;

 

 

 always@(posedge clk,negedge rstn)

     if(rstn == 1'b0) 
     count = 1'b0;
else if(count == 25'd5000)
  count = 1'b0;
else count = count + 1'b1;
 

always@(posedge clk,negedge rstn)

    if(rstn == 1'b0) 
     count = 1'b0;
else if(count == 25'd5000)
  
     led = ~led;
 
else led = led;

endmodule 

编译时报错:Error (10028): Can't resolve multiple constant drivers for net "count[22]" at my_counter.v(12)

原因:两个进程里都有同一个条件判断的话,会产生并行信号冲突的问题,同一个信号不允许在多个进程中赋值,否则则为多驱动,进程的并行性决定了多进程不能对同一个对象进行赋值。在此例中,两个always语句里面都对count信号赋值了,而两个always是并行快,所以提示出现多重驱动的情况。

修改后的代码如下(编译无错误):

module my_counter(Clk,Rst_n,led);

 

 input Clk;

 input Rst_n;

 output reg led;

  reg[24:0] cnt;

 

 

 always@(posedge Clk,negedge Rst_n)

     if(Rst_n == 1'b0) 
     cnt = 25'd0;
else if(cnt == 25'd5000)
  cnt = 25'd0;
else cnt = cnt + 1'b1;
 

always@(posedge Clk,negedge Rst_n)

    if(Rst_n == 1'b0) 
 led = 1'b0;
else if(cnt == 25'd5000)
  led = ~led;
 
else led = led;

endmodule 

    

2. 38译码器学习

Module my_38circuit(a,y);

 

 input [2:0]a;

 output reg [7:0]y;

 

 

 always@(*)     //  * 表示对后面所有的输入变量是敏感的
  begin
      case(a[2:0])

        3'b000: y = 8'b0000_0001;          //always 中的赋值变量必须定位为reg类型
        3'b001: y = 8'b0000_0010;
        3'b010: y = 8'b0000_0100;
        3'b011: y = 8'b0000_1000;
        3'b100: y = 8'b0001_0000;
        3'b101: y = 8'b0010_0001;
        3'b110: y = 8'b0100_0001;
        3'b111: y = 8'b1000_0001;
          default:y = 8'b0000_0000;
 
       endcase                               //
case ......endcase 要配对,begin ....end 也要配对

  end 

 

 endmodule 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  fpga