【Day04】Verilog 资料型态(下)

各种进制表示法

<位元长度> ’ <b、o、d、h> <数值>
  • 位元长度:以十进制表示几个bit数
  • 进制表示:二进制(b)、八进制(o)、十进制(d)、十六进制(h),不打则预设为十进制
  • 数值资料:可用底线 _ 来增加可读性

EX:

a = 32'd0;
b = 6'b000101;
c = 8'h0A;
d = 8'b0101_1010;

错误用法举例:

a = 32'b0;//打了b就要把所有位打出来
b = 6'd000101;//数值使用错误
c = 8'h10A;//位元长度错误

向量(阵列)表示法

EX:

reg [7:0]a;//一个8bit的reg
reg [3:0]b[31:0];//32个4bit的reg--->又称记忆体表示法

EX:用向量表示法写一个有读写及致能的简易 memory

module memory(
  Enable,
  ReadWrite,
  Address, 
  DataIn,
  DataOut
);
/*----------ports declarations----------*/
input        Enable;
input        ReadWrite;
input   [5:0]Address; 
input   [3:0]DataIn;
output  [3:0]DataOut;
reg     [3:0]DataOut;
/*----------variables----------*/
reg     [3:0]mem[63:0];
/*----------memory----------*/
always@(Enable or ReadWrite)begin
  if(Enable)begin
    if(ReadWrite)DataOut      = mem[Address];
    else         mem[Address] = DataIn;
  end
  else DataOut = 4'bzzzz;
end

endmodule

TestBench

`timescale 1ns/1ns
module tb_memory();
/*----------variables----------*/
reg      Enable;
reg      ReadWrite;
reg [5:0]Address; 
reg [3:0]DataIn;
wire[3:0]DataOut;
integer i = 0;
/*----------module memory instantiation----------*/
memory UUT(
  .Enable(Enable),
  .ReadWrite(ReadWrite),
  .Address(Address), 
  .DataIn(DataIn),
  .DataOut(DataOut)
);
/*----------control signal----------*/
initial begin
  Enable    = 1'b0;
  ReadWrite = 1'b0;
  Address   = 6'd0;
  DataIn    = 4'd0;
end

initial begin
  for(i=0;i<=63;i=i+1)begin
    #100;
    Enable    = 1'b1;
    ReadWrite = 1'b0;
    Address   = Address + 6'd1;
    DataIn    = DataIn  + 4'd1;
    #10;
    Enable    = 1'b0;
  end
  Address   = 6'd0;
  for(i=0;i<=63;i=i+1)begin
    #100;
    Enable    = 1'b1;
    ReadWrite = 1'b1;
    Address   = Address + 6'd1;
    DataIn    = 4'dz;
    #10;
    Enable    = 1'b0;
  end
#1000;
$stop;
end

always@(negedge Enable)begin
  if(ReadWrite)$display("time = %3d, dataRead  = %x", $time, DataOut);
end

endmodule

Wave

这边可以看到前面是写入值到各个位址,下图则是成功从该位址读出先前存入的值。

(这边 ReadWrite 是 "0" 写入,"1" 读取)

有趣的是 quartus 竟然可以辨识那是一颗 mem !


在这里可以顺便提到 integer 的使用,integer 好比一个 32bit 的 register (但 integer 视为有符号数 ),所以不要轻易用它来宣告变数,否则会无形中多使用了很多硬体资源,它通常会被宣告来当 for-loop 的回圈变数。

EX:

reg [3:0]a[31:0];

always@(posedge clk or negedge rst_n)begin
  if(!rst_n)begin
    for(i=0;i<32;i=i+1)begin
      a <= 4'd0;
    end
  end
  else begin
  .
  .
  .
  end
end

参数 parameter

  • 是一个宣告了就无法更动的常数
  • 常常会用来指定资料位宽(Width)或是状态机的状态值

EX:

parameter width = 32;
reg [width-1:0]a;//一个32bit的reg

<<:  Day 17-制作购物车系统之MongoDB设定

>>:  Day 7. 介绍一下VSCode-打code好帮手

【D13】发现新book:Account Data- Position

前言 看了一些交易资料,现在来看看一些帐务相关的资料吧。 参考网站:Position 本日程序码使用...

Day 16 实作测试 (2)

前言 昨天我们写好了测试的 model,今天就来用他实作吧。 test_main 我们先从最简单的 ...

Day 30 (Jq)

** 请把这个写在最外层 让网页准备好! $(document).ready(function(){...

[day27][後端][实作] 引入Typescipt,webpack的loader(下)

同步发表到驴形笔记 前情题要 在上这一篇中我们成功让webpack可以吃下".ts&qu...

Day 27 实作 user_bp (5)

前言 今天会完成 user_bp,也就是要完成看贴文跟留言的部分。 /posts 首先来看看可以看到...