读书笔记(Verilog HDL那些事儿_建模篇0)

来源:互联网 发布:python标准输入输出 编辑:程序博客网 时间:2024/05/16 06:54

说明:写代码总感觉不是很好,向前辈学习,提升自己。

感悟:文章作者可以将一个大工程划分为多个子模块,主要分功能模块和控制模块,一个功能一个模块的思路刚开始觉得很繁琐,但是到后来却发              现他利于移植,更重要的是将功能划分开,方便阅读和维护。

进度:第三章(159页)

整理来自:时间的诗

  1、模块:功能模块、控制模块、组合模块
  2、准则:一个模块一个功能
  3、信号:
           组合模块:clk, rst_n, RX_Pin_In, TX_Pin_Out  // 端口信号
           控制模块:clk, rst_n, Start_Sig, Done_Sig, TX_En_Sig, TX_Done_Sig,
           功能模块:clk, rst_n, Start_Sig, Done_Sig 


           模块内部:
           TX_Data,                           // 数据信号
           isS, isO,                          //中间信号
           assign S_Start_Sig = isS;          //端口信号
           assign O_Start_Sig = isO;
          
           “仿顺序操作”的建模都有标志性的“ 模块构造”,
           就是所有模块都拥有“ Start_Sig”和“ Done_Sig”。
           “ Start_Sig”如同 C 语言中的调用指令,
           “ Done_Sig”如同 C 语言的返回指令。
           这两个信号的存在就是为了控制模块的调用。
           
     计数器:isCount,  // 标志寄存器使能着该定时器
             Count1,   // 计数到1ms
             Count_MS, // 技术多少个1ms
             rTimes,   // 计数次数
     
  4、模块命名方式及模块信号注释:

sos_modulesos_control_modules_moduleo_module
sos_control_module U3( .CLK( CLK ), .RSTn( RSTn ), .Start_Sig( Start_Sig ),      // input - from top .S_Done_Sig( S_Done_Sig ),    // input - from U1 .O_Done_Sig( O_Done_Sig ),    // input - from U2 .S_Start_Sig( S_Start_Sig ),  // output - to U1 .O_Start_Sig( O_Start_Sig ),  // output - to U2 .Done_Sig( Done_Sig )         // output - to top );

  5、常用定时器 计数器模板
/****************************************/  parameter T1MS = 16'd49_999;  //开发板使用的晶振为50MHz,50M*0.001-1=49_999/***************************************/reg [15:0]Count1;always @ ( posedge CLK or negedge RSTn )  if( !RSTn )     Count1 <= 16'd0;  else if( Count1 == T1MS )     Count1 <= 16'd0;  else if( isCount )     Count1 <= Count1 + 1'b1;  else if( !isCount )     Count1 <= 16'd0;
/****************************************/ reg [9:0]Count_MS;always @ ( posedge CLK or negedge RSTn )  if( !RSTn )     Count_MS <= 10'd0;  else if( Count_MS == rTimes )     Count_MS <= 10'd0;  else if( Count1 == T1MS )     Count_MS <= Count_MS + 1'b1;/******************************************/

  6、仿顺序操作状态机:
  
always @ ( posedge CLK or negedge RSTn )  if( !RSTn )  begin     i   <= 4'd0;     isO <= 1'b0;     isS <= 1'b0;     isDone <= 1'b0;  end  else if( Start_Sig )     case( i )       4'd0:         if( S_Done_Sig ) begin isS <= 1'b0; i <= i + 1'b1; end         else isS <= 1'b1;       4'd1:         if( O_Done_Sig ) begin isO <= 1'b0; i <= i + 1'b1; end         else isO <= 1'b1;       4'd2:         if( S_Done_Sig ) begin isS <= 1'b0; i <= i + 1'b1; end         else isS <= 1'b1;       4'd3:         begin isDone <= 1'b1; i <= 4'd4; end       4'd4:         begin isDone <= 1'b0; i <= 4'd0; end       default:         begin isDone <= 1'b0; i <= 4'd0; end      endcase    /*****************************************/

0 0