在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
楼主: 甲壳虫

[求助] [verilog] Verilog语言的编写

[复制链接]
发表于 2016-5-3 15:54:35 | 显示全部楼层
也可以用case状态机搞仿顺序执行
      case(i)
    1'd0: ......
             i=i+1'b1;
   1'd1:.......
             i=i+1'b1;
话说8楼用任务是正解,不然你敲字累半死。提前写好task,每次进入状态机都执行task.语言外观和功能都十分接近c语言的多层for嵌套了
发表于 2016-5-4 08:43:31 | 显示全部楼层
回复 40# 甲壳虫
你应该把 addr, wr, rd, indata and outdata定义在端口。 自己构造成wr条件根据clk沿来一个个update addr和indata;然后设成rd enable,并根据 addr <= (i,j,k,l)表达式来trigger出outdata值。

其实还有更简单的做法啊,比如
always @ (posedge clk or negedge rst_n)
  if (!rst_n)
      begin
         mem[0] <= xxx;
         mem[1] <= ...;
         ....
         mem[255] <= ___;
     end
   else
    ....
发表于 2016-5-4 08:46:26 | 显示全部楼层
else下面就可以直接使用mem
avg <= avg + mem[(i + k) *16 + (j + l)];
 楼主| 发表于 2016-5-4 09:38:48 | 显示全部楼层
回复 43# ltshan 昨天试着写了一下后面的,感觉思维混乱,不知道怎样利用RAM里的数据做下面的工作。
 楼主| 发表于 2016-5-4 16:30:17 | 显示全部楼层
回复 42# ltshan
我感觉自己写的那个好像已经吧数据给读出来了,但是好像不能做接下来的事情啊 。谢谢。
发表于 2016-5-7 22:33:30 | 显示全部楼层
回复 45# 甲壳虫
基于双端口RAM, 模拟你的应用我写了个简单的代码,功能仿真是没有问题的。



  1. // top level to calulate the below loop with ram
  2. module calculation(
  3.            input wire clk,
  4.            input wire rst_n,
  5.                 output wire we,
  6.                 output wire [7:0] wr_addr,
  7.                 output wire [7:0] rd_addr,               
  8.            output wire [7:0] indata,
  9.            output wire [7:0] outdata,
  10.            output wire [7:0] avg);
  11.        
  12.         cal_expression U1(
  13.                            .clk(clk),
  14.                            .rst_n(rst_n),
  15.                            .we(we),
  16.                            .outdata(outdata),
  17.                            .rd_addr(rd_addr),
  18.                            .avg(avg));

  19.         ram_init U2(
  20.                    .clk(clk),
  21.                    .rst_n(rst_n),
  22.                    .we(we),
  23.                    .indata(indata),
  24.                    .wr_addr(wr_addr));                       
  25.                                
  26.         ram_dp U3(
  27.                      .clk(clk),
  28.                    .rst_n(rst_n),
  29.                    .rd_addr(rd_addr),
  30.                    .wr_addr(wr_addr),
  31.                    .indata(indata),                  
  32.                    .we(we),                                     
  33.                    .outdata(outdata));                       
  34. endmodule


  35. //for (i = 10; i <20; i++)
  36. //   avg += pd[i];
  37. module cal_expression(
  38.            input wire clk,
  39.            input wire rst_n,
  40.            input wire we,
  41.                 input wire [7:0]outdata,
  42.            output reg [7:0] rd_addr,
  43.            output reg [7:0] avg);

  44.         reg [7:0] cnt;
  45.        
  46.         always @ (posedge clk or negedge rst_n)
  47.                 if (!rst_n)
  48.                         rd_addr <= 8'd10;
  49.                 else if (we == 1'b0 && rd_addr < 19)
  50.                         rd_addr <= rd_addr + 8'b1;               
  51.                
  52.         always @ (posedge clk or negedge rst_n)
  53.                 if (!rst_n)
  54.                         begin
  55.                                 avg <= 8'b0;
  56.                                 cnt <= 0;
  57.                         end
  58.                 else if (we == 1'b0 && cnt < 11)
  59.                         begin
  60.                                 avg <= avg + outdata;       
  61.                                 cnt <= cnt + 8'b1;
  62.                         end
  63. endmodule
  64.                
  65. //write initial values to ram.
  66. module ram_init(
  67.            input wire clk,
  68.            input wire rst_n,
  69.            output reg we,
  70.            output reg [7:0] indata,       
  71.            output reg [7:0] wr_addr);   
  72.                
  73.         always @ (posedge clk or negedge rst_n)
  74.                 if (!rst_n)
  75.                         indata <= 8'b0;
  76.                 else if (we && indata < 255)
  77.                         indata <= indata + 8'b1;
  78.        
  79.         always @ (posedge clk or negedge rst_n)
  80.                 if (!rst_n)
  81.                         wr_addr <= 8'b0;
  82.                 else if (we && wr_addr < 255)
  83.                         wr_addr <= wr_addr + 8'b1;

  84.         always @ (posedge clk or negedge rst_n)
  85.                 if (!rst_n)
  86.                         we <= 1'b1;
  87.                 else if (indata == 255 && wr_addr == 255)
  88.                         we <= 1'b0;                                               
  89. endmodule

  90. //double port ram module
  91. module ram_dp(
  92.              input wire clk,
  93.            input wire rst_n,
  94.            input wire we,                                     
  95.            input wire [7:0] wr_addr,
  96.            input wire [7:0] indata,                  
  97.            input wire [7:0] rd_addr,
  98.            output reg [7:0] outdata);

  99.         reg [7:0]mem[255:0];
  100.        
  101.         always @ (posedge clk or negedge rst_n)                  
  102.                 if (!rst_n)
  103.                         mem[wr_addr] <= 8'b0;
  104.                 else if (we == 1'b1)
  105.                         mem[wr_addr] <= indata;

  106.         always @ (posedge clk or negedge rst_n)                                     
  107.                 if (!rst_n)                                
  108.                         outdata <= 8'b0;                 
  109.                 else if (we == 1'b0)                       
  110.                         outdata <= mem[rd_addr];               
  111. endmodule                       


复制代码
发表于 2016-5-8 13:21:56 | 显示全部楼层
c語言轉成RTL 需要考慮精準度的問題.
很少能直接轉過去.
除非是用現成的軟體去做.
但是一般這樣的軟體也不是任何的C coding style應可以轉過去.
 楼主| 发表于 2016-5-9 09:33:32 | 显示全部楼层
回复 46# ltshan
非常感谢您的指点,我想问一下测试代码该怎么去写,有什么技巧吗?一直都比较困惑。
发表于 2016-5-9 16:28:40 | 显示全部楼层
回复 48# 甲壳虫

我用的是Quartus来启动一个testbench模板,然后启动modelsim来仿真,最后通过波形看结果。   你需要的话可以吧tb发给你
 楼主| 发表于 2016-5-9 17:33:30 | 显示全部楼层
回复 49# ltshan

好的  ,非常感谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条

×

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-4-27 07:04 , Processed in 0.029176 second(s), 6 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表