FPGA 学习笔记

来源:互联网 发布:求50个的素数编程 编辑:程序博客网 时间:2024/06/10 17:07

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