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

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

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

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

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

[复制链接]
发表于 2016-4-15 22:34:23 | 显示全部楼层
回复 20# 甲壳虫
pd[][]是二维数组, 假定每个数组元素的数据宽度为8位, 你可以这么定义reg [7:0]pd[15:0][15:0];

然后在initial块里面逐个给赋初始值,如pd[0][0]=8'bxxx; pd[0][1]=8'bxxx ... ....
也可以先将初始值放到数据文件中,然后调用系统函数$readmemb/reamdmemh(...)一下全部赋给pd数组。
 楼主| 发表于 2016-4-16 15:13:32 | 显示全部楼层
回复 21# ltshan

谢谢

对于这样的表达式avg=avg+pd[i+k][j+l]就这样直接在程序中写出来,还是需要变换啊。
发表于 2016-4-16 22:39:21 | 显示全部楼层
回复 22# 甲壳虫

应该可以的,具体你试试就知道了啊
 楼主| 发表于 2016-4-18 16:06:57 | 显示全部楼层
回复 16# sun30411

有点看不明白,你这个逻辑是不是跟我的C语言有点不一样啊。
 楼主| 发表于 2016-4-18 16:46:31 | 显示全部楼层
回复 14# 汉能不能具体的说一下怎么写?谢谢。
 楼主| 发表于 2016-4-18 20:43:11 | 显示全部楼层
回复 4# zsftm

对于这样的表达式avg=avg+pd[i+k][j+l]就这样直接在程序中写出来,还是需要变换啊。
发表于 2016-4-19 17:25:24 | 显示全部楼层
回复 24# 甲壳虫

應該先請教您一個問題1. 這段 C 語言是要轉換成 "Testbench 使用 " 的 Verilog (不可 synthesis) ?
2. 或是 C 語言是要轉換成 "實際硬體電路      " 的 Verilog (可作 synthesis) ?


若是寫測試用的 Testbench (不可 synthesis),參考 8樓樓主。
若是要轉換成 "實際硬體電路" 的 Verilog,思考方式會與軟體 C 語言不同。


我的寫法是以硬體可作 synthesis 來思考的。
发表于 2016-4-19 17:32:10 | 显示全部楼层
回复 24# 甲壳虫

我寫的方式是 "可作 synthesis " 的思考邏輯來寫的。
若只是要寫 Testbench ,寫法就隨意了。

但提出這問題解答需先了解,您這個C語言演算法轉換成 Verilog 的目的是甚麼 ?
若要轉成 "可作 synthesis" 的電路,
用 C 語言的思考邏輯來寫會出問題。
 楼主| 发表于 2016-4-20 13:51:31 | 显示全部楼层
回复 28# sun30411

谢谢!我要写的是可综合的Verilog语言,可是你给我的那个看的不是太懂,能详细一点吗?非常感谢!
发表于 2016-4-21 11:12:11 | 显示全部楼层
回复 29# 甲壳虫

剛剛看了版大您問的另一個 Verilog 問題,
發現您對於硬體電路的思考有需要調整的觀念:
Verilog 是硬體語言,簡單區分以下兩種電路
1. 組合邏輯 Combination Logic (無記憶性電路,輸入是甚麼資料輸出是甚麼資料)
2. 循序邏輯 Sequential    Logic (有記憶性電路 ex : 有限狀態機 FSM,計數器,累加器 ...)
你必須先有以上觀念,才能思考可作 Synthesis 的電路要如何撰寫。
先最小化今天的問題,拆解運算動作。

假設 i = 1 ; j = 1;
for(k=-1;k<=1;k++){
              for(l=-1;l<=1;l++){
              avg+=(double)pd[i+k][j+l];
              }
}

     上述的兩個迴圈運算做了哪些事情,誰先誰後。迴圈拆解如下
     為什麼要拆解,因為硬體語言是在寫電路。
     寫電路是需要思考你的電路運算到底需要多少面積和硬體來實現
[size=13.3333px]     硬體電路必須在寫之前就先決定好,你到底要運算的資料有多少,
[size=13.3333px]   它不是 C 語言,你隨時要改架構,丟個參數進去就能作不同數量的計算。

         avg_sum1 = (double) {   pd[0][0] + pd[0][1] + pd[0][2] }
         avg_sum2 = (double) {   pd[1][0] + pd[1][1] + pd[1][2] }
         avg_sum3 = (double) {   pd[2][0] + pd[2][1] + pd[2][2] }
         avg_sum   = avg_sum1 + avg_sum2 + avg_sum3 ;

      上有8個加法計算,要用多少硬體來實現加法運算要看設計者來決定
      假設我硬體面積足夠,我就直接用8個運算,若面積不夠我只要用少些加法器運算,
      就要考慮到資料存取的問題。

      解法 a. avg_sum = pd[0][0] + pd[0][1] + ... + pd[2][2] ;  組合邏輯 Combination Logic


      解法 b. 1個運算加法器,1個 DFF 存資料 ;
循序邏輯 Sequential Logic
                 avg_sum 是資料存取的 DFF                 


                 pd_k = pd[m][n] | m=0~2 n=0~2
                 avg_sum_next =  avg_sum + pd_n[size=13.3333px];


[size=13.3333px]                 假設我只用1個加法器要實現它,我必須要確認幾件事情:
[size=13.3333px]       (0) 我利用8個 Clock 來運算它
[size=13.3333px]       (1) 每個 clock 需存取計算後的資料 avg_sum =  avg_sum_next
[size=13.3333px]                 (2) 在初始,或計算完全部的資料後, avg_sum 歸零
[size=13.3333px]                 (3) 每次運算的 pd_k 在不同時間要選取不同的[size=13.3333px]運算資料[size=13.3333px]來源,在avg_sum 歸零後,pd_k 從頭選取運算資料,週而復始。

[size=13.3333px]      拆解完以上動作再思考,怎麼實現電路,才能在只用1個運算家法器的硬體面積限制下,完成目標。
[size=13.3333px]      上述的運算在只用1個加法器的條件下,就要運用到 counter 計數器,才能實現。
[size=13.3333px]      計數器用來作 pd_k 資料的選取條件,以及 avg_sum 歸零的動作


以上是單純對於兩個迴圈拆解的內容,
也提供兩種方法去解這個問題,當然也有很多方法,
看你的硬體面積限制決定你要怎麼做,
確認這些都搞懂了,再去想如何拆解你的演算法
否則我現在寫一堆,你仍會無法理解硬體的思考方式。

提醒:
如果今天是要撰寫 "可作 synthesis 電路"
1. 請務必先了解你自己的演算法在做的運算到底該怎麼拆解。
2. 完整拆解完之後,到底要用多少電路來完成
3. For 迴圈是不能自動轉換成累加電路請不要再誤用 For 迴圈來實現累加運算的電路了,是非常錯誤的觀念。
    For 用在"可作 synthesis 電路" 只有平行架構 (電路獨立,迴圈運算無相依性) 才能使用
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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


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

GMT+8, 2024-11-25 17:25 , Processed in 0.029945 second(s), 6 queries , Gzip On, Redis On.

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